【发布时间】:2017-02-25 22:13:05
【问题描述】:
我正在从各种数据库中提取信息,并为此跟踪如何在每个数据库的不同 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
其中 urls 包含我检查 ID 的 TDR 数据库的 url 地址列表 当我必须为 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"
我们将不胜感激任何可能有助于减少获取和分析 html 的时间的帮助。我愿意接受任何可能涉及不使用 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
【问题讨论】:
-
虽然不是最快的,但我想知道“计算时间”是否与潜在的网络延迟一样不是您的问题。当我看到网络操作花费 >500 秒的运行时间和 explanation of the time fields。)
-
每个网页下载的权重为50kb,我也尝试过使用getURL异步但时间似乎没有改善。如何检查是否是延迟问题并解决?
-
如果使用
download.file,时间是否相同? -
当我使用 download.file 时间降低 1/3 system.time(download.file(urls[c(1:3)],c("test1","test2","test3 ")) ) 用户系统已过 0.024 0.000 1.013
-
所以听起来
download.file比getURL更快(在这种情况下),也许您可以使用前者下载它,然后对下载的文件进行xml-parse。下载时间是否因一天中的时间而异?过去我注意到RCurl和httr(使用curl,与libcurl类似但明显不同的接口)之间的一些性能差异,虽然我现在无法量化它,但我建议你考虑尝试httr。
标签: r xml linux web-scraping rcurl