需要帮助优化大型webscraping任务中的循环

问题描述 投票:1回答:1

我正在开展一个独立项目,该项目首先使用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
}

上面的for循环需要一个多小时才能运行。我想这可能主要是因为有很多电话上网。

我正在努力更好地理解矢量化和其他技巧,以最大化R的效率,特别是在像这样的大项目上。

我尝试/看过的事情:

- 我已经从循环体中取出了尽可能多的东西(具体是paste0行)

- 从数据帧切换到数据表

- 在更老的帖子中,用户@Gregor(再次感谢)向我展示了我可以利用paste0作为矢量化函数,因此amexurls不使用for循环来存储 - 但不幸的是,这不是缓慢的部分代码

这只是一个更大的网络抓取代码的嗤之以鼻。如果我可以优化这个块,我可以将它应用到其余部分。我的代码或提示/技巧的任何改进将不胜感激。谢谢你的时间。

r web-scraping rvest sampling
1个回答
1
投票

由于防火墙的限制,我现在无法对此进行测试。但我建议尝试使用html_table()rvest函数来收集数据。它比手动指定每个页面上的股票数量以及单独循环遍历每一行要动态得多。

library(rvest)

amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/", LETTERS,".htm")

ldf <- list()
iterator <- 0

for(url in amexurls){
  iterator <- iterator + 1
  html <- read_html(url)
  ldf[[iterator]] <- html_table(html_nodes(html, "table")[[2]])
}

df <- do.call(rbind, ldf)
© www.soinside.com 2019 - 2024. All rights reserved.