作者andrew43 (apan)
看板R_Language
标题Re: [问题]用data.frame中的某个column撷取网页资料
时间Tue Feb 4 05:32:37 2014
假设你有一个 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 网页下载 部分撷取
--
http://apansharing.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.37.172
1F:推 kusoayan:我想问一下,如果用 XML 或 selectr 这两个套件会有什麽 02/04 12:28
2F:→ kusoayan:明显差异或 drawbacks 吗? 02/04 12:28
3F:推 stinky:太感谢了! 我回办公室马上试试看 02/04 12:44
4F:推 Wush978:我只用过XML, 目前没感受到什麽明显的drawback 02/04 12:47
5F:→ Wush978:真的说的话,就是处理中文会遇到的编码问题吧 02/04 12:47
6F:推 maninblue:推~ 02/04 14:21
7F:推 summitstudio:推范例码! 02/04 15:02
8F:→ andrew43:这篇的程式码都只用到R内建的function。 02/04 20:40
9F:→ andrew43:至於XML和selectr这些套件怎麽用我并不了解,但我猜 02/04 20:41
10F:→ andrew43:可能可以在截取网页内容时会更方便。 02/04 20:41
11F:→ andrew43:其实仔细看我的程式码,只是很简单的字串处理而已, 02/04 20:42
12F:→ andrew43:对付格式一致的大量网页应该够用了。 02/04 20:43
※ 编辑: andrew43 来自: 122.117.37.172 (02/04 20:43)
13F:推 stinky:谢谢andrew43 非常好用 稍修改後也可运用在其他databases 02/05 13:20
14F:→ stinky:我还有两个小问题想请教 因为抓取时经常会断线 02/05 13:22
15F:→ stinky:是否有办法让它失败时自动重复尝试几次? 02/05 13:23
16F:→ stinky:又或者让我指定我可以选择让程式从某个row继续抓? 02/05 13:25
17F:推 stinky:补充一下 因为我想把资料新增在最後一个column 02/05 13:44
18F:→ stinky:所以试了 x$Summary[[i]] <- myfunc(myURL[i]) 有用 02/05 13:46
19F:→ andrew43:重复尝试可能可以采取 try() 之类错误处理的方式解决。 02/05 13:53
20F:→ andrew43:至於一次从特定位置开始抓可能没办法。 02/05 13:53
21F:→ andrew43:对方server可能会把你判断为不友善的client, 02/05 13:55
22F:→ andrew43:不要做得太暴力,或是在loop里放一些延迟功能。 02/05 13:55
23F:推 stinky:我试将for(i in 1:length(myURL)){ 中的1改成其他数字 02/05 14:25
24F:→ stinky:作为续传起点 结果可以从断的资料点继续 太感谢你了! 02/05 14:26
25F:→ andrew43:喔,我以为你是指从一个网页的特定位置续传(这我办不到 02/06 16:34