我正在使用R软件包rvest
抓取数千个网页。为了不使服务器过载,我将Sys.sleep()
函数的时间设置为5秒。
在我们抓取到大约400个网页之前,它一直很好。但是,尽管没有抛出错误,但超出此值后,我什么也没得到,所有数据均为空。
我想知道是否有可能修改Sys.sleep()
函数以将350个网页每个抓取5秒,然后等待5分钟,然后再继续处理350个网页...等等。 / p>
我正在查看Sys.sleep()
函数文档,并且只有time
作为参数出现。因此,如果使用此功能无法做到这一点,那么在抓取大量页面时还有其他可能性或功能来解决此问题吗?
更新示例
这是我的代码的一部分。对象links
由8000多个链接组成。
title <- vector("character", length = length(links))
short_description <- vector("character", length = length(links))
for(i in seq_along(links)){
Sys.sleep(5)
aff_link <- read_html(links[i])
title[i] <- aff_link %>%
html_nodes("title") %>%
html_text()
short_description[i] <- aff_link %>%
html_nodes(".clp-lead__headline") %>%
html_text()
}
答案 0 :(得分:1)
您可以检查循环变量的模数,每N次迭代额外睡眠一次。示例:
> for(i in 1:100){
message("Getting page ",i)
Sys.sleep(5)
if((i %% 10) == 0){
message("taking a break")
Sys.sleep(10)
}
}
每10次迭代,表达式i %% 10
为TRUE
,您将获得额外的10秒钟睡眠时间。
我可以想到更复杂的解决方案,但这可能对您有用。
另一种可能性是检查页面是否返回任何数据,如果没有,则睡两次,然后重试,重复多次。这是一些半伪代码:
get_page = function(page){
sleep = 5
for(try in 1:5){
html = get_content(page)
if(download_okay(html)){
return(html)
}
sleep = sleep * 2
Sys.sleep(sleep)
}
return("I tried - but I failed!")
}
诸如CURL之类的某些Web网页获取程序会使用正确的选项自动执行此操作-也许也有办法将其纳入您的代码中。