RedditExtractoR:reddit_urls不会返回所有结果

问题描述

我正在尝试使用R包RedditExtractoR从Reddit进行爬网。具体来说,我正在使用reddit_urls()从Reddit返回带有搜索词“ president”的结果。

我首先创建了一个对象links499,该对象(应该)包含价值499页的包含“总统”一词的URL。我按评论排序。

links499 <- reddit_urls(search_terms = "president",cn_threshold = 0,page_threshold = 499,sort_by = "comments",wait_time = 2)

links499Com <- get_reddit(search_terms = "president",wait_time =2)

每个对象都具有相同数量的唯一URL标题(n = 239),并且两个对象都只返回了注释数量非常大的URL(最低的是12,378)。这是有道理的,因为我是按照评论数递减的顺序从Reddit中提取URL。

# Have the same number of unique titles
unique(links499$title)
unique(links499Com$title)

# Both have minimum of 12378
min(links499$num_comments)
min(links499Com$num_comments)

接下来,我想为Reddit返回更多搜索词“总统”的匹配URL。我认为可以通过简单地增加page_threshold参数来实现。但是,我(未成功)仅在现在搜索了1000页的URL时才尝试了相同的代码

links1000 <- reddit_urls(search_terms = "president",page_threshold = 1000,wait_time = 2)

links1000Com <- get_reddit(search_terms = "president",wait_time =2)

我认为links1000将包含注释数量最多的1000个页面搜索词为“ president”的URL(而links499将包含499个页面中具有搜索词为“ president”的URL,其中评论数最多)。但是,links1000links499是相同的。

此外,无法创建links1000Com并抛出错误URL 'https://www.reddit.com/r/politics/comments/dzd8lu/discussion_thread_fifth_democratic_presidential/.json?limit=500': status was 'Failure when receiving data from the peer'

似乎有500页的限制。

我的问题:接下来我将如何获取所有 URL(及其相关注释)?不仅是前499页或前1000页,还是要继续到返回所有在Reddit中带有搜索词“ president”的 网址?

感谢您分享任何建议。

***编辑***

根据建议,我在下面添加了可复制的代码。再次谢谢你!

library(tidyverse)
library(RedditExtractoR)

links499 <- reddit_urls(search_terms = "president",# minimum number of comments
                        page_threshold = 499,wait_time =2)

# Have the same number of unique titles (n=239)
length(unique(links499$title))
length(unique(links499Com$title))

# Both have minimum of 12378
min(links499Com$num_comments)
min(links499$num_comments)

links1000 <- reddit_urls(
    search_terms = "president",# minimum number of comments
    page_threshold = 1000,# can probably get as many URLs as you want but you can only extract a certain amount of data at one time
    sort_by = "comments",wait_time = 2
)

links1000Com <- get_reddit(search_terms = "president",wait_time =2 )

# Have the same number of unique titles (n=241)
length(unique(links1000$title))
length(unique(links1000Com$title))

# Both have minimum of 12378
min(links1000Com$num_comments)
min(links1000$num_comments)

解决方法

因此,查看$key = "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\{0}" -f CrashTest.exe New-Item $key -Force Push-Location $key New-ItemProperty . -Name DumpType -Value 2 -PropertyType DWord New-ItemProperty . -Name DumpFolder -Value "C:\Dumps" -PropertyType String Pop-Location get_reddit的代码,您会发现reddit_urlsget_reddit的包装,并且两者之间的默认值完全不同职能。 get_redditreddit_urls

但是,您的问题的答案是:You can't get more than 1000 results to a search query.

限制和警告

  • 搜索词可能会被阻止。搜索“狗”可能会返回其中包含“狗”一词的结果。
  • 搜索结果限制为1000个结果。

错误消息中的reddit_urls参数是指要返回的帖子数,而不是期望的页数。 reddit进行分页的方式与您期望的不同。基本上,他们跟踪帖子的顺序,然后为了获取下一组帖子(新页面),您将上一个帖子的ID传递给呼叫。我认为reddit会跟踪呼叫(您的计算机)的始发者,并限制其返回量。

This decribes reddit's API (in particular before and after)

Here is a resource in Python which describes limitations on reddit's API.


编辑:

我也不清楚为什么我们没有得到要求的结果数量。我注意到的一件事是,在一定数量的页面之后,Reddit似乎不再提供进一步结果的键。目前尚不清楚这是基于什么的。我写了一些代码进行检查,看看是否可以自己提取结果:

limit=500

由此您可以检查对象search_query = "president" number_of_pages = 10 results_holder <- data_frame(page = 1:number_of_pages,search = character(length = number_of_pages),titles = as.list(rep(1,number_of_pages)),url = as.list(rep(1,number_of_pages))) first_search <- paste0("https://www.reddit.com/search/.json?q=",search_query,"&limit=1000&sort=comment") tmp <- read_lines(first_search) tmp2 <- jsonlite::fromJSON(tmp) results_holder$search[1] <- first_search results_holder$titles[[1]] <- tmp2$data$children$data$title results_holder$url[[1]] <- tmp2$data$children$data$permalink last_name <- tmp2$data$after for(i in 2:number_of_pages){ new_search = paste0("https://www.reddit.com/search/.json?q=","&limit=1000&sort=comment&after=",last_name) tmp_loop <- read_lines(new_search) tmp2_loop <- jsonlite::fromJSON(tmp_loop) results_holder$search[i] <- new_search results_holder$titles[[i]] <- tmp2_loop$data$children$data$title results_holder$url[[i]] <- tmp2_loop$data$children$data$permalink last_name <- tmp2_loop$data$after Sys.sleep(5) } ,并最终看到我们从分页开始。

我看到发生的事情(并且可以通过在浏览器中执行相同的操作来验证)是reddit停止为json文件中的results_holder$search提供值。这是构造新的搜索字符串并获取下一页所需的值。 有时我可以让它返回3页/约250个结果,然后再开始给出after