gpt4 book ai didi

RedditExtractoR : reddit_urls() does not return all results

转载 作者:行者123 更新时间:2023-12-04 03:56:00 25 4
gpt4 key购买 nike

我正在尝试使用 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",
cn_threshold = 0,
page_threshold = 499,
sort_by = "comments",
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 返回更多与搜索词“president”匹配的 URL。我认为这可以通过简单地增加 page_threshold 参数来实现。但是,我(未成功)尝试了相同的代码,现在才搜索了 1,000 页的 URL。

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 将包含来自评论数量最多的 1000 个页面中搜索词“president”的 URL(而 links499 将包含搜索词“president”的 URL ”来自评论数量最多的 499 页)。但是,links1000links499 是相同的。

此外,无法创建 links1000Com 并引发错误:URL 'https://www.reddit.com/r/politics/comments/dzd8lu/discussion_thread_fifth_democratic_presidential/.json? limit=500': 状态为'从对等方接收数据时失败'

似乎有 500 页的限制。

我的问题是:接下来我将如何获取所有 URL(及其相关评论)?不仅仅是前 499 个页面或前 1000 个页面,而是要继续,直到返回 Reddit 中带有搜索词“president”的所有 URL?

感谢您分享任何建议。

*** 编辑 ***

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

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_reddit 的代码和 reddit_urls , 你会看到 get_redditreddit_urls 的包装器并且这两个函数的默认值完全不同。 get_reddit , reddit_urls .

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

限制和注意事项

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

limit=500错误消息中的参数是指要返回的所需帖子数,而不是所需的页数。 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 似乎在一定数量的页面后停止提供进一步结果的 key 。目前尚不清楚这是基于什么。我写了一些代码来检查它,看看我是否可以自己提取结果:

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 停止为 after 提供值在 json 文件中。这是我们构建新搜索字符串和获取下一页所需的值。有时我可以让它在开始给出 "after": null 之前返回 3 页/~250 个结果。

关于RedditExtractoR : reddit_urls() does not return all results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com