问题描述
我正在尝试使用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,其中评论数最多)。但是,links1000
和links499
是相同的。
此外,无法创建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_urls
是get_reddit
的包装,并且两者之间的默认值完全不同职能。 get_reddit
,reddit_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