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 页中搜索词“总统”)。但是,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 页的限制。
我的问题是:接下来我将如何获得所有 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_reddit
和 reddit_urls
的代码,您会发现 get_reddit
是 reddit_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 个结果
我正在尝试使用 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.
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 页中搜索词“总统”)。但是,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 页的限制。
我的问题是:接下来我将如何获得所有 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_reddit
和 reddit_urls
的代码,您会发现 get_reddit
是 reddit_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