Использование read_html в R для получения авуаров Russell 3000? - PullRequest
0 голосов
/ 23 февраля 2019

Мне было интересно, есть ли способ автоматически извлекать авуары Russell 3000 с веб-сайта iShares в R с помощью функции read_html (или rvest)?

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

(все запасы в таблице внизу, а не только в топ-10)

До сих пор мне приходилось копировать и вставлять в документ Excel, сохранять в формате CSV и использовать read_csv длясоздайте тиббл в R тикера, названия компании и сектора.

Я использовал read_html, чтобы вытащить запасы 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 голосов
/ 24 февраля 2019

ВАЖНО

Согласно Правилам и условиям , перечисленным на сайте BlackRock ( здесь ):

Используйте любого робота, паукаинтеллектуальный агент, другое автоматическое устройство или ручной процесс для поиска, мониторинга или копирования данного веб-сайта или отчетов, данных, информации, контента, программного обеспечения, услуг продуктов или других материалов, созданных или полученных с этого веб-сайта, будь то по ссылкамили иным образом (в совокупности «Материалы»), без разрешения BlackRock, при условии, что общедоступные сторонние веб-браузеры могут использоваться без такого разрешения;

Я предлагаю вам убедиться, что вы соблюдаете эти условия доиспользуя их данные таким образом, что нарушает эти правила.В образовательных целях вот как будут получены данные:

Сначала вам нужно получить реальные данные (не интерактивный 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" ...
...