Re: [问题]用data.frame中的某个column撷取网页资料

楼主: andrew43 (讨厌有好心推文后删文者)   2014-02-04 05:32:37
假设你有一个 data frame 叫 x,其中有一个栏叫 id。因此,
myURL <- paste("http://www.ncbi.nlm.nih.gov/gene/", x$id, sep="")
就是所有要去拿取的完整网址。
以下一个为你设计的 function 先喂 R 吃下去。
它可以一次拿取一个网页里你要的资料。
myfunc <- function(myURL){
con <- url(myURL)
txt <- scan(con, what="character")
close(con)
txt1 <- paste(txt, sep="", collapse=" ")
pattern <- "<dt>Summary</dt> <dd>[[:print:]]+</dd>"
re <- regexpr(pattern, txt1)
start <- re[1]
end <- start[1] + attr(regexpr(pattern, txt1),"match.length") - 1
return(substr(txt1, start + 22, end - 5))
}
再试试看
myfunc("http://www.ncbi.nlm.nih.gov/gene/2597")
的结果是不是你要的。有需要的话自己修一下。
可以的话,就用循环把 myURL 一个一个丢给 myfunc()
results <- list()
for(i in 1:length(myURL)){
results[[i]] <- myfunc(myURL[i])
}
这样应该就好了。
: 各位好
: 我需要下载数百个基因的资料
: 网址的格式是:
: http://www.ncbi.nlm.nih.gov/gene/XXXX
: 其中XXXX是这些基因的ID(可能是四个数字或更多)
: 比如GAPDH ID是2597
: 那连结就是:http://www.ncbi.nlm.nih.gov/gene/2597
: 如果我的data frame中有一个column是这些IDs
: 我应该如何写出简单的R scripts来撷取这些网页中的"Summary"中的叙述
: 并加到原本data.frame中相对应rows 形成一个新的column (不包括"Summary"这字本身)
: 例如对GAPDH而言就是
: "This gene encodes ... variants. [provided by RefSeq, Jan 2014]"
: 我想应该是用Rcurl跟grep
: 但因为完全外行
: 不知道如何逐个ID数值加到Rcurl网址的最后
: 再将下载的网页以grep搜寻到的strings加到对应的rows里
: 这样的问题很不专业
: 如果有任何的提示都欢迎
: 谢谢各位专家
: [程式范例]:
: [关键字]: R 网页下载 部分撷取
作者: kusoayan (Bert)   2014-02-04 12:28:00
我想问一下,如果用 XML 或 selectr 这两个套件会有什么明显差异或 drawbacks 吗?
作者: stinky (stinky)   2014-02-04 12:44:00
太感谢了! 我回办公室马上试试看
作者: Wush978 (拒看低质媒体)   2014-02-04 12:47:00
我只用过XML, 目前没感受到什么明显的drawback真的说的话,就是处理中文会遇到的编码问题吧
作者: maninblue   2014-02-04 14:21:00
推~
作者: summitstudio (第凡斯米德费尔德)   2014-02-04 15:02:00
推范例码!
楼主: andrew43 (讨厌有好心推文后删文者)   2014-02-04 20:40:00
这篇的程式码都只用到R内建的function。至于XML和selectr这些套件怎么用我并不了解,但我猜可能可以在截取网页内容时会更方便。其实仔细看我的程式码,只是很简单的字串处理而已,对付格式一致的大量网页应该够用了。
作者: stinky (stinky)   2014-02-05 13:20:00
谢谢andrew43 非常好用 稍修改后也可运用在其他databases我还有两个小问题想请教 因为抓取时经常会断线是否有办法让它失败时自动重复尝试几次?又或者让我指定我可以选择让程式从某个row继续抓?补充一下 因为我想把资料新增在最后一个column所以试了 x$Summary[[i]] <- myfunc(myURL[i]) 有用
楼主: andrew43 (讨厌有好心推文后删文者)   2014-02-05 13:53:00
重复尝试可能可以采取 try() 之类错误处理的方式解决。至于一次从特定位置开始抓可能没办法。对方server可能会把你判断为不友善的client,不要做得太暴力,或是在loop里放一些延迟功能。
作者: stinky (stinky)   2014-02-05 14:25:00
我试将for(i in 1:length(myURL)){ 中的1改成其他数字作为续传起点 结果可以从断的资料点继续 太感谢你了!
楼主: andrew43 (讨厌有好心推文后删文者)   2014-02-06 16:34:00
喔,我以为你是指从一个网页的特定位置续传(这我办不到

Links booklink

Contact Us: admin [ a t ] ucptt.com