Я работаю над сольным проектом, который начинается с генерирования биржевых данных с использованием пакета rvest для веб-скрапинга и сохранения его в виде данных.
Цикл тянет часть биржевых тикеровс веб-сайта и сохраняет его в информационном кадре.Мой код чрезвычайно архаичный (я думаю), отчасти из-за того, как организован сайт.Веб-сайт размещает символы на страницах в алфавитном порядке, с разным количеством тикеров на каждой странице (1 страница на букву) - да, мне приходилось считать, сколько на странице.То, что я закончил с работами, но работает очень медленно:
#GET AMEX tickers
alphabet <- c('A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z')
#start at 2
lengths <- c(65,96,89,125,161,154,86,62,173,83,26,43,62,51,
37,126,25,81,149,52,77,74,34,50,8,11)
amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/",toupper(alphabet),".htm",
sep = "")
iterator <- 0
for(j in 1:26){
url <- amexurls[j]
for(k in 2:lengths[j]){
html <- read_html(as.character(url))
iterator
test <- html_nodes(html,as.character(paste0("tr:nth-child(",k,") a")))
test <- toString(test)
test <- gsub("<[^>]+>", "", test)
amexsymbols[k-2+iterator] <- test
}
iterator <- iterator + lengths[j] + 1
}
Для цикла выше для выполнения требуется более часа.Я думаю, что это может быть главным образом из-за многочисленных звонков в Интернет.
Я пытаюсь лучше понять векторизацию и другие приемы, чтобы максимизировать эффективность R, особенно в таком большом проекте, как этот.
Вещи, которые я пробовал / видел:
-Я вынул столько же из тела цикла (особенно в строке paste0
-Переключение из фрейма данных в режим данных
- В более старом посте пользователь @Gregor (еще раз спасибо) показал мне, что я могу использовать paste0 как векторизованную функцию, и, следовательно, amexurls не использует цикл for дляхранить - но, к сожалению, это не медленная часть кода
Это всего лишь фрагмент гораздо большего кода веб-очистки. Если я могу оптимизировать этот фрагмент, я могу применить его ко всем остальным.Буду весьма признателен за улучшения в моем коде или советы / хитрости. Спасибо за ваше время.