在R中使用read_html获得Russell 3000的所有权?

时间:2019-02-23 19:24:49

标签: r rvest finance

我想知道是否存在一种使用read_html(或rvest)功能从R中的iShares网站自动提取Russell 3000资产的方法?

url:https://www.ishares.com/us/products/239714/ishares-russell-3000-etf

(表中所有资产的底部,而不仅仅是前10名)

到目前为止,我不得不将其复制并粘贴到Excel文档中,另存为CSV,然后使用read_csv在R中创建代码,公司名称和部门的标题。

我曾经使用read_html从Wikipedia中提取SP500的股份,但似乎无法弄清楚我需要投入多少以使R自动从iShares网站(以及其他我享有声誉的网站)中提取已发现所有〜3000个馆藏)。这是用于SP500的代码:

read_html("https://en.wikipedia.org/wiki/List_of_S%26P_500_companies")%>%
                    html_node("table.wikitable")%>%
                    html_table()%>%
                    select('Symbol','Security','GICS Sector','GICS Sub Industry')%>%
                    as_tibble()

第一篇文章,抱歉,如果很难遵循...

任何帮助将不胜感激

迈克尔

1 个答案:

答案 0 :(得分:0)

重要

根据贝莱德(here)网站上列出的条款与条件

  

使用任何机器人,蜘蛛,智能代理,其他自动设备或手动过程来搜索,监视或复制本网站或由或生成的报告,数据,信息,内容,软件,产品服务或其他材料。未经贝莱德(BlackRock)许可,无论是通过链接还是通过其他方式(统称“材料”)从本网站获得,但前提是未经许可,可使用一般可用的第三方Web浏览器;

我建议您确保以违反这些规则的方式使用这些术语之前,请遵守这些术语。出于教育目的,以下是如何获取数据的方法:

首先,您需要获取实际数据(而不是交互式javascript)。您对浏览器上的devloper功能有多熟悉?如果您浏览网站并跟踪流量,则会发现AJAX很大:

https://www.ishares.com/us/products/239714/ishares-russell-3000-etf/1467271812596.ajax?tab=all&fileType=json

这是您需要的数据(全部)。找到此位置后,它只是清除数据。示例:

library(jsonlite)
#Locate the raw data by searching the Network traffic:
url="https://www.ishares.com/us/products/239714/ishares-russell-3000-etf/1467271812596.ajax?tab=all&fileType=json"

#pull the data in via fromJSON

x<-jsonlite::fromJSON(url,flatten=TRUE)
>Large list (10.4 Mb)

#use a comination of `lapply` and `rapply` to unlist, structuring the results as one large list

y<-lapply(rapply(x, enquote, how="unlist"), eval)
>Large list (50677 elements, 6.9Mb)

y1<-y[1:15]
> str(y1)
List of 15
 $ aaData1       : chr "MSFT"
 $ aaData2       : chr "MICROSOFT CORP"
 $ aaData3       : chr "Equity"
 $ aaData.display: chr "2.95"
 $ aaData.raw    : num 2.95
 $ aaData.display: chr "109.41"
 $ aaData.raw    : num 109
 $ aaData.display: chr "2,615,449.00"
 $ aaData.raw    : int 2615449
 $ aaData.display: chr "$286,156,275.09"
 $ aaData.raw    : num 2.86e+08
 $ aaData.display: chr "286,156,275.09"
 $ aaData.raw    : num 2.86e+08
 $ aaData14      : chr "Information Technology"
 $ aaData15      : chr "2588173"

**更新:如果您无法清除数据,请在这里

testdf<- data.frame(matrix(unlist(y), nrow=50677, byrow=T),stringsAsFactors=FALSE)

#Where we want to break the DF at (every nth row)
breaks <- 17

#number of rows in full DF
nbr.row <- nrow(testdf)
repeats<- rep(1:ceiling(nbr.row/breaks),each=breaks)[1:nbr.row]

#split DF from clean-up 
newDF <- split(testdf,repeats)

结果:

> str(head(newDF))
List of 6
 $ 1:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "MSFT" "MICROSOFT CORP" "Equity" "2.95" ...
 $ 2:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "AAPL" "APPLE INC" "Equity" "2.89" ...
 $ 3:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "AMZN" "AMAZON COM INC" "Equity" "2.34" ...
 $ 4:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "BRKB" "BERKSHIRE HATHAWAY INC CLASS B" "Equity" "1.42" ...
 $ 5:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "FB" "FACEBOOK CLASS A  INC" "Equity" "1.35" ...
 $ 6:'data.frame':  17 obs. of  1 variable:
  ..$ matrix.unlist.y...nrow...50677..byrow...T.: chr [1:17] "JNJ" "JOHNSON & JOHNSON" "Equity" "1.29" ...