getURL工作缓慢

时间:2016-10-17 02:36:36

标签: r xml linux web-scraping rcurl

我从各种数据库中提取信息,为了实现这一点,我正在跟踪如何在每个数据库的不同ID之间进行转换。

library("RCurl")
library("XML")
transformDrugId<-function(x){
URLtoan<-getURL(x)
PARSED<-htmlParse(URLtoan)
dsource<-xpathSApply( PARSED,"//*[@id='advancedform']/div[7]/fieldset/p/b[1]/text()",xmlValue)
id<-xpathSApply( PARSED,"//*[@id='advancedform']/div[7]/fieldset/p/a[1]/span/text()",xmlValue)
return(c(dsource,id))}  

作为一个例子,使用Linux和RSTUDIO在我的电脑上花费的时间是

system.time(DBidstest<-sapply(urls[c(10001:10003)],transformDrugId))
 user  system elapsed 
0.132   0.000   3.675 

system.time(DBids7<-sapply(urls[c(601:700)],transformDrugId))
user  system elapsed 
3.980   0.124 549.233 

其中网址包含我检查ID的TDR数据库的网址地址列表 当我必须为300000个药物ID做这个时,计算时间变得非常长。  举个例子,我提供前五个网址

head(urls)
[1] "http://tdrtargets.org/drugs/view?mol_id=608858"
[2] "http://tdrtargets.org/drugs/view?mol_id=608730"
[3] "http://tdrtargets.org/drugs/view?mol_id=549548"
[4] "http://tdrtargets.org/drugs/view?mol_id=581648"
[5] "http://tdrtargets.org/drugs/view?mol_id=5857"  
[6] "http://tdrtargets.org/drugs/view?mol_id=550626"

任何可能有助于缩短获取和分析htmls的时间的帮助都是合理的。我对任何可能涉及不使用R的建议持开放态度。

我后来意识到使用10或更少URL的getURLAsynchronous有时会更快,但使用它两次会变慢

system.time(test<-getURLAsynchronous(urls[c(1:10)]))
user  system elapsed 
0.128   0.016   1.414 
system.time(test<-getURLAsynchronous(urls[c(1:10)]))
user  system elapsed 
0.152   0.088 300.103

1 个答案:

答案 0 :(得分:0)

使用shell直接下载的速度提高了十倍     echo $ URLTEST | xargs -n 1 -P 7 wget -q 其中URLTEST是要下载的htmls列表。-n设置查询之间的等待时间,-P设置并行查询的数量,两者都经过微调,以便我得到100 htmls     真正的0m13.498s     用户0m0.196s     sys 0m0.652s

R的界面必须存在一些问题,这对于getURL()和downloadFile()

而言都相当慢