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

时间:2015-06-01 16:57:18

标签: r for-loop web-scraping vectorization rvest

我的情况:我有一个很长的(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列表。对于您自己的测试,以下是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))

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

raw$solNum<-0

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

运行代码当前存放前五行的值,然后返回以下错误:

 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值?我怎样才能让它不破坏这个错误?

另外,阅读时告诉我,将此操作作为矢量化函数而不是循环运行可能更快更有效。任何人都可以提供一些关于我的情况可能会是什么样的提示吗?

1 个答案:

答案 0 :(得分:3)

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