Rvest 循环在重定向网站上中断

Rvest loop breaks on redirecting site

我的情况:我有一个很长的(20k 行)URL 列表,我需要从中抓取特定的数据元素以进行分析。出于本示例的目的,我正在寻找一个名为 "sol-num" 的特定字段,它是请求编号。使用以下函数,我可以获取 FedBizOpps 上列出的任何采购的招标编号:

require(rvest)
require(magrittr)
fetchSolNum<-function(URL){
  URL<-as.character(URL)
  solNum<-html(URL)%>%
    html_node(".sol-num")%>%
    html_text()
}

现在,我有一个包含数千个 URL 的列表,我想提取每个的招标编号,将其存入我从中获取列表的数据框的新列中URL秒。为了您自己的测试,这里是 URL 列表中的前十行:

list<-c("https://www.fbo.gov/spg/DISA/D4AD/DITCO/HC1028-12-T-0025/listing.html",
"https://www.fbo.gov/notices/c360b067077aabde331d66e0fe2d1f8f",         
"https://www.fbo.gov/notices/f63053a7a6e858a5b7b537a660c473b7",         
"https://www.fbo.gov/spg/DLA/J3/DSCP-I/SPM300-12-R-0024/listing.html",  
"https://www.fbo.gov/spg/DLA/J3/DAPS/SP7000-11-Q-0047/listing.html",    
"https://www.fbo.gov/spg/USAF/AFMC/OCALCCC/F3YCDW1245A001/listing.html",
"https://www.fbo.gov/spg/USAF/AFMC/AFFTC/FA9300-12-R-5001/listing.html",
"https://www.fbo.gov/notices/17ddec6ae37feb69704b1a52e22eeb26",         
"https://www.fbo.gov/notices/3b76d40705a23a749aad46df88dcee0c",         
"https://www.fbo.gov/notices/91873b727968dc664ada76c48e53e4df") 
raw <- data.frame(matrix(unlist(list), nrow=10, byrow=T))

我想将输出存储在名为 raw 的数据框中的变量 solNum 中,所以我现在的功能是使用循环:

raw$solNum<-0

j=1
for (i in list){
  raw$solNum[j]<-fetchSolNum(i)
  j=j+1
}   

运行 代码当前存放前五行的值,然后 returns 出现以下错误:

 Error in xml_apply(x, XML::xmlValue, ..., .type = character(1)) : 
  Unknown input of class: NULL 

经过进一步调查,我发现问题可能在于列表中的 URL: https://www.fbo.gov/spg/USAF/AFMC/OCALCCC/F3YCDW1245A001/listing.html 进入了一种消歧页面,因为有两个采购有了这个 URL。

考虑到我的完整列表有 20k 行长,我没有时间检查并清除所有无效 URL 的列表。有没有办法让我当前的函数只为 URL 无效或类似的行插入一个 NA 值?我怎样才能让它不因这个错误而中断?

此外,四处阅读告诉我,将此操作 运行 作为矢量化函数而不是循环可能会更快、更有效。任何人都可以就我的情况提供任何提示吗?

可能只有 tryCatch() 可以在这里捕获错误并给出 NA。就矢量化而言,我怀疑您是否会看到任何真正的收益。阅读一个网站需要一段时间(有时一两秒)。有了 20K,这需要一些时间。一定要查看 Hadley 关于异常和调试的章节,并在你的代码中设置一些检查,这样它就不会在 运行...http://adv-r.had.co.nz/Exceptions-Debugging.html

的 4 小时内爆炸