RedditExtractoR:reddit_urls() 没有 return 所有结果

RedditExtractoR: reddit_urls() does not return all results

我正在尝试使用 R 包 RedditExtractoR 从 Reddit 进行网络抓取。具体来说,我使用 reddit_urls() 到 return 来自 Reddit 的搜索词“总统”的结果。

我首先创建了一个 object 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", 
  cn_threshold = 0,
  page_threshold = 499,
  sort_by = "comments",
  wait_time =2)

每个 object 都有相同数量的独特 URL 头衔 (n=239) 并且都只有 returned URL 数量非常多的评论(其中最低的是 12,378)。这是有道理的,因为我按照评论数量减少的顺序从 Reddit 中提取 URLs。

# 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)

接下来我想 return 来自 Reddit 的搜索词“president”的更多匹配 URL。我认为这可以通过简单地增加 page_threshold 参数来实现。但是,我(未成功)尝试了相同的代码,现在才搜索了价值 URLs.

的 1,000 页
links1000 <- reddit_urls(search_terms = "president",
  cn_threshold = 0,
  page_threshold = 1000,
  sort_by = "comments",
  wait_time = 2)

links1000Com <- get_reddit(search_terms = "president", 
  cn_threshold = 0,
  page_threshold = 1000,
  sort_by = "comments",
  wait_time =2)

我认为 links1000 会包含 URL 个搜索词为“president”的 1000 页评论数最多的页面(而 links499 会包含 URL s 从评论数量最多的 499 页中搜索词“总统”)。但是,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 页的限制。

我的问题是:接下来我将如何获得所有 URLs(及其相关评论)?不仅仅是前 499 页或前 1000 页,而是要继续 所有 URL 在 Reddit 中使用搜索词“总统”的 return 编辑?

感谢您分享任何建议。

*** 编辑 ***

按照建议,我在下面添加了可重现的代码。再次感谢!

library(tidyverse)
library(RedditExtractoR)

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

links499Com <- get_reddit(search_terms = "president", 
                          cn_threshold = 0,
                          page_threshold = 499,
                          sort_by = "comments",
                          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",
    cn_threshold = 0, # 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", 
                          cn_threshold = 0,
                          page_threshold = 1000,
                          sort_by = "comments",
                          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)

所以,查看 get_redditreddit_urls 的代码,您会发现 get_redditreddit_urls 的包装器,并且默认值只是不同这两个功能。 get_reddit, reddit_urls.

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

限制和注意事项

  • 可能会阻止搜索词。搜索“dogs”可能 return 结果中包含“dog”一词。
  • 搜索结果限制为 1000 个结果。

错误消息中的 limit=500 参数指的是所需的 post 到 return 的数量,而不是所需的页数。 reddit 进行分页的方式与您预期的不同。基本上他们会跟踪 posts 的顺序,然后为了获得下一组 posts(一个新页面),你将最后一个 post 的 ID 传递给你的称呼。我认为 reddit 会跟踪呼叫的发起者(您的计算机)并限制呼叫的数量 return.

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

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


编辑:

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

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=",search_query,"&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)
}

从这里您可以检查对象 results_holder$search 并看到最终我们在分页中重新开始。

我看到发生的事情(并且可以通过在浏览器中执行相同的操作来验证)是 reddit 停止为 json 文件中的 after 提供值。这是我们构建新搜索字符串和获取下一页所需的值。 有时我可以在它开始给出 "after": null

之前得到 return 3 页/~250 个结果