2017-11-20 14 views
0

いくつかの株式キーの統計情報をFinvizからスクラップしようとしました。元の質問のコードを適用しました:Web scraping of key stats in Yahoo! Finance with R私はこのような銘柄記号と説明のリストを作成し、できるだけ多くの銘柄の統計情報を収集するには:Finvizからの株式キー統計のWebスクレイピングR

Symbol Description 
A  Agilent Technologies 
AAA Alcoa Corp 
AAC Aac Holdings Inc 
BABA Alibaba Group Holding Ltd 
CRM Salesforce.Com Inc 
... 

を私が最初の列を選択し、Rの文字として保存され、株式と呼びました。それから私は、コードを適用:

for (s in stocks) { 
url <- paste0("http://finviz.com/quote.ashx?t=", s) 
webpage <- readLines(url) 
html <- htmlTreeParse(webpage, useInternalNodes = TRUE, asText = TRUE) 
tableNodes <- getNodeSet(html, "//table") 

# ASSIGN TO STOCK NAMED DFS 
assign(s, readHTMLTable(tableNodes[[9]], 
         header= c("data1", "data2", "data3", "data4", "data5", "data6", 
           "data7", "data8", "data9", "data10", "data11", "data12"))) 

# ADD COLUMN TO IDENTIFY STOCK 
df <- get(s) 
df['stock'] <- s 
assign(s, df) 
} 

# COMBINE ALL STOCK DATA 
stockdatalist <- cbind(mget(stocks)) 
stockdata <- do.call(rbind, stockdatalist) 
# MOVE STOCK ID TO FIRST COLUMN 
stockdata <- stockdata[, c(ncol(stockdata), 1:ncol(stockdata)-1)] 

しかし、株式の一部について、Finvizは彼らのためにページを持っていないと私はこのようなエラーのマッサージを取得:

Error in file(con, "r") : cannot open the connection 
In addition: Warning message: 
In file(con, "r") : 
cannot open URL 'http://finviz.com/quote.ashx?t=AGM.A': HTTP status was '404 
Not Found' 

かなりの数があります。このような状況の株式の私はリストから手動で削除することはできません。それらの株式のページをスキップする方法はありますか?前もって感謝します!

答えて

0

多分これらの行に何かがありますか?あなたのforloopを使用する前に、株式をろ過しようとしています。

library(tidyverse) 

#AGM.A should produce error 
    stocks <- c("AXP","BA","CAT","AGM.A") 
    urls <- paste0("http://finviz.com/quote.ashx?t=", stocks) 

#Test urls with possibly first and find out NAs 
    temp_ind <- map(urls, possibly(readLines, otherwise = NA_real_)) 
    ind <- map_lgl(map(temp_ind, c(1)), is.na) 
    ind <- which(ind == TRUE) 
    filter.stocks <- stocks[-ind] 

#AGM.A is removed and you can just insert stocks which work to for loop. 
     filter.stocks 
    [1] "AXP" "BA" "CAT" 

statxiongはここurl.existを指摘したように簡単なバージョンです:

library(RCurl) 
library(tidyverse) 

stocks[map_lgl(urls, url.exists)] 
+0

が、これは本当に便利です、あなたにHAKKIをありがとう!私はまた、特定のURLの要求がエラーなしで応答するかどうかを判断することができるRCurlパッケージのurl.existsを発見しました – statxiong

+0

これを今後も使用するために追加しました – Hakki

+0

これを閉じる – Hakki