2010-03-14 30 views
10

Tôi có một thách thức về cào web (hơi phức tạp) mà tôi muốn hoàn thành và sẽ yêu thích một số hướng (đến bất kỳ cấp độ nào bạn cảm thấy muốn chia sẻ) tại đây:Làm cách nào để sử dụng R (gói Rcurl/XML?!) Để xóa trang web này?

Tôi muốn xem qua tất cả các trang "loài" "hiện tại liên kết này:

http://gtrnadb.ucsc.edu/

vì vậy, đối với mỗi chúng tôi sẽ đi đến:

  1. liên kết trang loài (ví dụ: http://gtrnadb.ucsc.edu/Aero_pern/)
  2. 012.
  3. Và sau đó đến "cấu trúc thứ cấp" liên kết trang (ví dụ: http://gtrnadb.ucsc.edu/Aero_pern/Aero_pern-structs.html)

Bên trong liên kết mà tôi muốn loại bỏ các dữ liệu trong trang vì vậy mà tôi sẽ có một danh sách dài chứa dữ liệu này (ví dụ):

chr.trna3 (1-77) Length: 77 bp 
Type: Ala Anticodon: CGC at 35-37 (35-37) Score: 93.45 
Seq: GGGCCGGTAGCTCAGCCtGGAAGAGCGCCGCCCTCGCACGGCGGAGGcCCCGGGTTCAAATCCCGGCCGGTCCACCA 
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.... 

đâu mỗi dòng sẽ có danh sách riêng của nó (bên trong danh sách cho mỗi "tRNA" bên trong danh sách cho mỗi con vật)

tôi nhớ đến qua các gói Rcurl và XML (R) có thể cho phép một nhiệm vụ như vậy. Nhưng tôi không biết cách sử dụng chúng. Vì vậy, những gì tôi muốn có là: 1. Một số gợi ý về cách xây dựng mã như vậy. 2. Và giới thiệu cách tìm hiểu kiến ​​thức cần thiết để thực hiện một tác vụ như vậy.

Nhờ sự giúp đỡ,

Tal

+1

@Tal, một câu hỏi, nếu tôi có thể: điều này có hợp pháp không? Và nếu có, sẽ không dễ dàng hơn khi chỉ yêu cầu UCSC truy cập thường xuyên vào DB của họ? –

+2

Hi Tal, hãy thử bỏ chúng đi. Bạn có thể thấy chúng khá thoải mái. Họ thậm chí có thể không nhận thức được rằng mọi người muốn sử dụng dữ liệu theo cách bạn muốn. Có lẽ họ sẽ quan tâm đến việc cung cấp nó như thế nào bạn muốn? – user246211

Trả lời

17

Tal,

Bạn có thể sử dụng R và XML gói để làm điều này, nhưng (chết tiệt) đó là một số HTML kém hình thành bạn đang cố gắng để phân tích. Thực tế, trong hầu hết các trường hợp, bạn sẽ muốn sử dụng hàm readHTMLTable(), which is covered in this previous thread.

Với HTML xấu xí này, tuy nhiên, chúng tôi sẽ phải sử dụng gói RCurl để kéo HTML thô và tạo một số chức năng tùy chỉnh để phân tích cú pháp.Vấn đề này có hai thành phần:

  1. Nhận tất cả các URL gen từ các trang web cơ sở (http://gtrnadb.ucsc.edu/) bằng cách sử dụng chức năng getURLContent() trong gói RCurl và một số ma thuật regex :-)
  2. Sau đó mất rằng danh sách các URL và cạo dữ liệu bạn đang tìm kiếm, và sau đó dán nó vào một data.frame.

Vì vậy, ở đây đi ...

library(RCurl) 

### 1) First task is to get all of the web links we will need ## 
base_url<-"http://gtrnadb.ucsc.edu/" 
base_html<-getURLContent(base_url)[[1]] 
links<-strsplit(base_html,"a href=")[[1]] 

get_data_url<-function(s) { 
    u_split1<-strsplit(s,"/")[[1]][1] 
    u_split2<-strsplit(u_split1,'\\"')[[1]][2] 
    ifelse(grep("[[:upper:]]",u_split2)==1 & length(strsplit(u_split2,"#")[[1]])<2,return(u_split2),return(NA)) 
} 

# Extract only those element that are relevant 
genomes<-unlist(lapply(links,get_data_url)) 
genomes<-genomes[which(is.na(genomes)==FALSE)] 

### 2) Now, scrape the genome data from all of those URLS ### 

# This requires two complementary functions that are designed specifically 
# for the UCSC website. The first parses the data from a -structs.html page 
# and the second collects that data in to a multi-dimensional list 
parse_genomes<-function(g) { 
    g_split1<-strsplit(g,"\n")[[1]] 
    g_split1<-g_split1[2:5] 
    # Pull all of the data and stick it in a list 
    g_split2<-strsplit(g_split1[1],"\t")[[1]] 
    ID<-g_split2[1]        # Sequence ID 
    LEN<-strsplit(g_split2[2],": ")[[1]][2]  # Length 
    g_split3<-strsplit(g_split1[2],"\t")[[1]] 
    TYPE<-strsplit(g_split3[1],": ")[[1]][2] # Type 
    AC<-strsplit(g_split3[2],": ")[[1]][2]  # Anticodon 
    SEQ<-strsplit(g_split1[3],": ")[[1]][2]  # ID 
    STR<-strsplit(g_split1[4],": ")[[1]][2]  # String 
    return(c(ID,LEN,TYPE,AC,SEQ,STR)) 
} 

# This will be a high dimensional list with all of the data, you can then manipulate as you like 
get_structs<-function(u) { 
    struct_url<-paste(base_url,u,"/",u,"-structs.html",sep="") 
    raw_data<-getURLContent(struct_url) 
    s_split1<-strsplit(raw_data,"<PRE>")[[1]] 
    all_data<-s_split1[seq(3,length(s_split1))] 
    data_list<-lapply(all_data,parse_genomes) 
    for (d in 1:length(data_list)) {data_list[[d]]<-append(data_list[[d]],u)} 
    return(data_list) 
} 

# Collect data, manipulate, and create data frame (with slight cleaning) 
genomes_list<-lapply(genomes[1:2],get_structs) # Limit to the first two genomes (Bdist & Spurp), a full scrape will take a LONG time 
genomes_rows<-unlist(genomes_list,recursive=FALSE) # The recursive=FALSE saves a lot of work, now we can just do a straigh forward manipulation 
genome_data<-t(sapply(genomes_rows,rbind)) 
colnames(genome_data)<-c("ID","LEN","TYPE","AC","SEQ","STR","NAME") 
genome_data<-as.data.frame(genome_data) 
genome_data<-subset(genome_data,ID!="</PRE>") # Some malformed web pages produce bad rows, but we can remove them 

head(genome_data) 

Khung dữ liệu kết quả có chứa Bảy cột liên quan đến mỗi mục gen: ID, chiều dài, chủng loại, chuỗi, chuỗi, và tên. Cột tên chứa bộ gen cơ sở, đó là dự đoán tốt nhất của tôi cho tổ chức dữ liệu. Ở đây nó trông giống như thế nào:

head(genome_data) 
            ID LEN TYPE       AC                  SEQ 
1  Scaffold17302.trna1 (1426-1498) 73 bp Ala  AGC at 34-36 (1459-1461) AGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTTTCCA 
2 Scaffold20851.trna5 (43038-43110) 73 bp Ala AGC at 34-36 (43071-43073) AGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTCTCCA 
3 Scaffold20851.trna8 (45975-46047) 73 bp Ala AGC at 34-36 (46008-46010) TGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTCTCCA 
4  Scaffold17302.trna2 (2514-2586) 73 bp Ala  AGC at 34-36 (2547-2549) GGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACAGGGATCGATGCCCGGGTTCTCCA 
5 Scaffold51754.trna5 (253637-253565) 73 bp Ala AGC at 34-36 (253604-253602) CGGGGGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTCCTCCA 
6  Scaffold17302.trna4 (6027-6099) 73 bp Ala  AGC at 34-36 (6060-6062) GGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGAGTTCTCCA 
                     STR NAME 
1 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp 
2 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp 
3 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp 
4 >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>.>>>.......<<<.<<<<<<<<. Spurp 
5 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp 
6 >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<......>>>>.......<<<<.<<<<<<<. Spurp 

Tôi hy vọng điều này sẽ giúp, và cảm ơn cho một chút vui vẻ vào chiều Chủ nhật R!

+0

Ahh, cảm ơn Tal. Tôi đã không thực hiện tìm kiếm đầy đủ các mục có thể. Vui vì bạn đã có thể làm cho nó hoạt động! – DrewConway

+0

Trợ giúp cho readHTMLtable cung cấp phương thức cho các bảng PRE. Một cái gì đó như: u = "http://gtrnadb.ucsc.edu/Ppaci1/Ppaci1-structs.html"; h = htmlParse (u); p = getNodeSet (h, "// pre"); con = textConnection (xmlValue (p [[2]])); readLines (con, n = 4) [- 1] Có thể giúp đỡ. –

0

Thú vị vấn đề và đồng ý rằng R là mát mẻ, nhưng bằng cách nào đó tôi thấy R là một chút rườm rà trong lĩnh vực này. Dường như tôi muốn lấy dữ liệu ở dạng văn bản thuần trung gian trước để có thể xác minh rằng dữ liệu là đúng trong mỗi bước ... Nếu dữ liệu sẵn sàng ở dạng cuối cùng hoặc để tải lên dữ liệu của bạn ở đâu đó, RCurl rất hữu ích.

đơn giản nhất theo ý kiến ​​của tôi sẽ được (trên linux/unix/mac/hoặc trong Cygwin) chỉ phản ánh toàn bộ http://gtrnadb.ucsc.edu/ trang web (sử dụng wget) và lấy tập tin có tên / -structs.html, sed hay awk sự dữ liệu bạn muốn và định dạng để đọc vào R.

Tôi chắc chắn cũng sẽ có nhiều cách khác.

1

Chỉ cần dùng thử bằng cách sử dụng Mozenda (http://www.mozenda.com). Sau khoảng 10 phút và tôi đã có một đại lý có thể cạo dữ liệu khi bạn mô tả. Bạn có thể nhận được tất cả dữ liệu này chỉ bằng cách sử dụng bản dùng thử miễn phí của họ. Mã hóa rất thú vị, nếu bạn có thời gian, nhưng có vẻ như bạn đã có một giải pháp được mã hóa cho bạn. Làm tốt lắm Drew.

Các vấn đề liên quan