加载数千网址为ML-相关网页抓取 - 代码很慢,需要效率的技巧

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

我被一只股票的信号预测算法webscraping从各种网站的数据构建的数据集。我的算法建立的方式包括分层for循环和装载上千的URL,因为每个环节是指股票及其各种定量的统计数据。需要帮助提高处理速度。有小费吗?

我已经谈过几个不同的人如何解决这一点,有些人建议向量化,但毕竟是新的我。我也曾尝试切换到数据表,但我还没有看到太大的变化。该EVAL线是一招,我学会了处理数据的方式我想但我想它可能是一个原因,它是缓慢的,但我对此表示怀疑。我也想知道的远程处理,但是这可能超出了将R的世界。

对于下面的代码,假设有4个这样的多个部分从不同的网站我想加载其它变量,并且所有这些块都在一个更大的for循环,因为我生成两个数据集(设置= C(”培训,测试“))。

该tryCatch是为了防止代码停止,如果遇到错误加载URL。网址加载到一个列表,每一个股票 - 所以他们是很长。第二for循环从URLS刮擦数据并将其发布在数据帧正确格式化。

library(quantmod)
library(readr)
library(rvest)
library(data.table)

urlsmacd <-  vector("list", length = 
eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep = "")))))
for(h in 1:eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep = 
""))))){
  urlsmacd[h] <- paste0('http://www.stockta.com/cgi-bin/analysis.pl? 
symb=',eval(parse(text=as.name(paste0(set[y],"[,1][h]", sep = 
"")))),'&mode=table&table=macd&num1=1', sep = '')
}

for(j in 1:eval(parse(text=as.name(paste0("nrow(", set[y], ")", sep = 
""))))){
  tryCatch({
html <- read_html(urlsmacd[[j]])

#get macd html
MACD26 <- html_nodes(html,'.borderTd~ .borderTd+ .borderTd:nth-child(3) 
font')
MACD26 <- toString(MACD26)
MACD26 <-  gsub("<[^>]+>", "", MACD26)
if(!is.na(MACD26)){
  MACD26 <- as.double(MACD26)
}
eval(parse(text=as.name(paste0(set[y],"$","MACD26[j] <- MACD26"))))

MACD12 <- html_nodes(html,'.borderTd+ .borderTd:nth-child(2) font')
MACD12 <- toString(MACD12)
MACD12 <-  gsub("<[^>]+>", "",MACD12)
if(!is.na(MACD12)){
  MACD12 <- as.double(MACD12)
}
eval(parse(text=as.name(paste0(set[y],"$","MACD12[j] <- MACD12"))))

  }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
    }

所有这一切都说过和做过,这个过程大约需要6个小时。按照这一速度,剃个假进程将使进步我的项目容易得多。

感谢您的StackOverflow的人的支持。

r for-loop web-scraping vectorization processing-efficiency
1个回答
1
投票

检查doParallel包。它有一个并行执行foreach循环。它让你使用你的CPU的多个内核(如果有可用)的定义函数执行并行的R会话。例如:

library(doParallel)  
no_cores <- detectCores() - 1  
cl <- makeCluster(no_cores, type="FORK")  
registerDoParallel(cl)  
result <- foreach(i=10:10000) %dopar% 
getPrimeNumbers(i)

如果URL存储在一个列表中,也有一个平行lapply。

这个例子是从这个伟大的职位采取:

https://www.r-bloggers.com/lets-be-faster-and-more-parallel-in-r-with-doparallel-package/amp/

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.