我正在开发一个网络抓取程序,用于搜索多张纸张中的数据。下面的代码是我正在使用的一个例子。我只能得到第一张。如果有人能在我的语法中指出我出错的地方,将会有很大的帮助。
jump <- seq(1, 10, by = 1)
site <- paste0("https://stackoverflow.com/search?page=",jump,"&tab=Relevance&q=%5bazure%5d%20free%20tier")
dflist <- lapply(site, function(i) {
webpage <- read_html(i)
draft_table <- html_nodes(webpage,'.excerpt')
draft <- html_text(draft_table)
})
finaldf <- do.call(cbind, dflist)
finaldf_10<-data.frame(finaldf)
View(finaldf_10)
以下是我需要抓取数据的链接 127页。
[https://stackoverflow.com/search?q=%5Bazure%5D+free+tier][1]
根据上面的代码,我只能从第一页获取数据,而不能从其他页面获取数据。也没有语法错误。你能不能帮我找出我错的地方。
答案 0 :(得分:1)
某些网站提供安全措施以防止批量抓取。我想这就是其中之一。更多相关内容:https://github.com/JonasCz/How-To-Prevent-Scraping/blob/master/README.md
事实上,如果你延迟一点电话,这将有效。我已经尝试了5秒Sys.sleep
。我想你可以减少它,但这可能不起作用(我尝试了1秒Sys.sleep
,但没有用)。
这是一个有效的代码:
library(rvest)
library(purrr)
dflist <- map(.x = 1:10, .f = function(x) {
Sys.sleep(5)
url <- paste0("https://stackoverflow.com/search?page=",x,"&q=%5bazure%5d%20free%20tier")
read_html(url) %>%
html_nodes('.excerpt') %>%
html_text() %>%
as.data.frame()
}) %>% do.call(rbind, .)
最好,
科林