【发布时间】:2015-09-09 18:05:05
【问题描述】:
所以我正在用 R 编写一个网页抓取脚本,因为我正在抓取的特定网站对大量抓取数据的人不太友好,所以我将循环分解为只处理 10 个链接一次。但是,我仍然想以随机且缓慢的方式浏览所有链接。
productLink # A list of all the links that I'll be scraping
x<- length(productLink)
randomNum <- sample(1:x, 10)
library(rvest)
for(i in 1:10){
url <- productLink[randomNum[i]]
specs <- url %>%
html() %>%
html_nodes("h5") %>%
html_text()
specs
message<- "\n Temporarily unavailable\n "
if(specs == message){
print("Item unavailable")
}
else{
print("Item available")
}
}
现在,下次我运行这个 for 循环时,我想排除在之前的循环运行中已经尝试过的所有随机编号索引。这样,这个 for 循环每次运行 10 个新链接,直到所有链接都被使用。我想对此有另一个方面的意见。由于我可以通过蛮力抓取特定公司的网站来引发警报,有没有什么办法可以减慢这个循环,让它每隔几分钟运行一次?我正在考虑一个超时函数或类似的代码运行for循环一次,等待几分钟然后再次运行它(如上所述每次都有新链接)。有什么想法吗?
【问题讨论】:
-
Sys.sleep()将使 R 休眠指定的秒数。我建议您创建一个随机数向量,排除除一个之外的所有唯一值,然后循环遍历它。 -
@RomanLuštrik 我不太确定我是否理解。一个例子会有所帮助。这似乎是一个简单的问题,我只是无法制定语法。我最初想创建一个虚拟数组来存储所有生成的随机数,然后可能将随机数生成器捕获在一个 while 循环中,代码将强制它打印出虚拟数组中没有出现的数字。冲洗并重复。不过似乎效率很低。我想知道您或其他人是否有更优雅的解决方案。
-
看来@Vlo 打败了我。 :) 该解决方案适用于
sample,但您可能需要额外的步骤来检查rnorm、runif和 kin 的唯一性。
标签: r for-loop web-scraping random-sample