【问题标题】:R- Excluding random numbers that have already been generatedR- 排除已经生成的随机数
【发布时间】: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,但您可能需要额外的步骤来检查 rnormrunif 和 kin 的唯一性。

标签: r for-loop web-scraping random-sample


【解决方案1】:

使用类似的东西。随机循环所有产品索引。

for (i in sample(1:x)){
  <Your code here>
  # Sleep for 120 seconds
  Sys.sleep(120)
}

如果你想一次做 10 个。每执行 10 次就休眠 120 秒。

n = 1
for (i in sample(1:x)){
  # Sleep for 120 seconds every 10 runs
  if (n == 10) {Sys.sleep(120); n = 0}
  n = n+1
  <Your code here>
}

【讨论】:

  • 谢谢。 sys.sleep 有效。您对我的查询的第一部分有什么想法吗?
  • 查询的第一部分是什么?您还可以使用随机睡眠,例如 runif(1, 100, 140)
  • 排除已经生成的随机数。我想每次在 10 个唯一链接上运行 for 循环,直到用完所有链接(但如果链接数不是 10 的倍数,我不知道如何处理)。
  • 当您循环遍历sample(1:x) 时,您将不会循环遍历重复项。 i 永远是独一无二的。
  • 啊,我明白了。你确实解决了这个问题,但也许我没有正确传达我的想法。 i 仍然按顺序递增,并且由于链接本身仅相差一两个数字,因此刮擦仍然以可识别的模式发生。这就是说,我想访问随机索引(randomNum[i]) 的链接并在这些链接上运行我的代码。那样没有明显的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多