3

私の状況: 分析のために特定のデータ要素をスクレイピングする必要がある URL の長い (20,000 行) リストがあります。この例では、勧誘番号である「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 のリストの最初の 10 行を次に示します。

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
}   

現在、コードを実行すると、上位 5 行の値が格納され、次のエラーが返されます。

 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 には 2 つの調達があるため、曖昧さ回避ページの

リスト全体が 20,000 行の長さであることを考えると、すべての無効な URL のリストを調べてきれいにする時間はありません。現在の関数で、URL が無効な行などに NA 値を挿入する方法はありますか? このエラーで壊れないようにするにはどうすればよいですか?

また、読んでみると、この操作をループではなくベクトル化された関数として実行する方が高速で効率的である可能性があることがわかります。私の場合、それがどのように見えるかについて誰かヒントを貸してもらえますか?

4

1 に答える 1