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

标签 r for-loop web-scraping vectorization rvest

我的情况:我有一个很长(2 万行)的 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))

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

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 值?我怎样才能让它不因这个错误而中断?

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

最佳答案

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

关于Rvest 循环在重定向网站上中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579053/

相关文章:

xml - 如何删除仅从特定单词的最后一个实例开始的整个字符串?

r - 如何找出 R 函数调用中使用了哪些参数值?

r - 在 R 中逐行合并多个 data.frame

R. GGplot2,具有自定义分位数的 geom_boxplot

php - 在 list.phtml 中显示产品属性 - Magento

java - 使用数组保存其他数组的索引

javascript - 在 javascript 中,如何在循环中有效地处理大数?

vba - vba中是否有任何关键字可以清除网站中的默认值以替换为新值?

r - 如何从 R 中的 4 个单独的音频文件中创建一个 4 channel 的音频文件?

ruby - 在使用 ruby​​ 抓取过程中提交登录字段?