이 웹 페이지를 긁어 내기 위해 r (rcurl/xml 패키지?!)을 어떻게 사용하려면?

StackOverflow https://stackoverflow.com/questions/2443127

  •  19-09-2019
  •  | 
  •  

문제

나는 (다소 복잡한) 웹 스크래핑 도전을 가지고 있으며, 내가 성취하고자하고 공유하고 싶다고 느끼는 수준에 대한 방향을 좋아합니다.

이 링크에있는 모든 "종 페이지"를 살펴보고 싶습니다.

http://gtrnadb.ucsc.edu/

그래서 그들 각각에 대해 나는 다음과 같이 갈 것이다.

  1. 종 페이지 링크 (예 : : http://gtrnadb.ucsc.edu/aero_pern/)
  2. 그런 다음 "보조 구조"페이지 링크로 (예 : 예 : : http://gtrnadb.ucsc.edu/aero_pern/aero_pern-structs.html)

해당 링크 내부 에이 데이터가 포함 된 긴 목록을 갖도록 페이지에 데이터를 폐기하려고합니다 (예 : 다음과 같은).

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

각 줄은 자체 목록을 갖습니다 (각 동물의 목록 내부의 각 "trna"에 대한 목록 안에)

그러한 작업을 허용 할 수있는 패키지 RCURL 및 XML (R)을 만난 것을 기억합니다. 그러나 나는 그것들을 사용하는 방법을 모른다. 그래서 내가 갖고 싶은 것은 다음과 같습니다. 1. 그러한 코드를 구축하는 방법에 대한 제안. 2. 그러한 작업을 수행하는 데 필요한 지식을 배우는 방법에 대한 권장 사항.

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

R과 The를 사용할 수 있습니다 XML 이 작업을 수행하는 패키지이지만, (젠장), 그것은 당신이 구문 분석하려고하지 않는 html입니다. 실제로, 대부분의 경우 당신은 readHTMLTable() 기능, 이 이전 스레드에서 덮여 있습니다.

그러나이 추악한 HTML을 감안할 때, 우리는 RCurl RAW HTML을 당기는 패키지를 사용하여 몇 가지 사용자 정의 기능을 작성하여 구문 분석합니다. 이 문제에는 두 가지 구성 요소가 있습니다.

  1. 기본 웹 페이지에서 모든 게놈 URL을 얻습니다 (http://gtrnadb.ucsc.edu/) 사용 getURLContent() 기능 RCurl패키지와 일부 정규 마법 :-)
  2. 그런 다음 해당 URL 목록을 가져 와서 원하는 데이터를 긁어 내고 data.frame.

그래서 여기 간다 ...

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)

결과 데이터 프레임에는 각 게놈 항목과 관련된 7 개의 열이 포함되어 있습니다 : ID, 길이, 유형, 시퀀스, 문자열 및 이름. 이름 열에는 기본 게놈이 포함되어 있으며, 이는 데이터 구성에 가장 적합한 추측이었습니다. 여기에는 다음과 같습니다.

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

나는 이것이 도움이되기를 바랍니다. 재미있는 일요일 오후 R 도전에 감사드립니다!

다른 팁

방금 Mozenda를 사용하여 시도했습니다 (http://www.mozenda.com). 약 10 분 후에 설명대로 데이터를 긁어 낼 수있는 에이전트가있었습니다. 무료 평가판을 사용 하여이 모든 데이터를 얻을 수 있습니다. 시간이 있다면 코딩은 재미 있지만 이미 솔루션이 코딩 된 것처럼 보입니다. 잘 했어.

흥미로운 문제와 R이 시원하다는 데 동의하지만, 어떻게 든 R은 이와 관련하여 R이 약간 번거 롭다는 것을 알게됩니다. 데이터가 모든 단계에서 데이터가 올바른지 확인하기 위해 데이터를 먼저 중간 일반 텍스트 양식으로 가져 오는 것을 선호하는 것 같습니다 ... 데이터가 최종 형식으로 준비되거나 데이터를 업로드 할 경우 RCURL이 매우 매우 중요합니다. 유용한.

내 생각에 가장 간단한 것은 (Linux/Unix/Mac/또는 Cygwin에서) 전체를 반영하는 것입니다. http://gtrnadb.ucsc.edu/ 사이트 (wget 사용) 및 이름이 지정된 파일을 가져옵니다. /-Structs.html, sed 또는 awk 원하는 데이터를 알고 R을 읽기 위해 포맷하십시오.

다른 방법도 많이있을 것이라고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top