Wie kann ich R (Rcurl / XML-Pakete?!) Verwenden diese Webseite zu kratzen?
-
19-09-2019 - |
Frage
Ich habe eine (etwas kompliziert) Web-Scraping Herausforderung, dass ich wünschte für irgendeine Richtung zu erreichen und würde gerne (auf was auch immer Sie mögen Sharing fühlen Ebene) hier geht:
Ich möchte durch alle „Spezies-Seiten“ in diesem Link gehen:
Also für jeden von ihnen werde ich gehen Sie zu:
- Die Art-Link (zum Beispiel: http://gtrnadb.ucsc.edu/Aero_pern/)
- und dann auf den "Secondary Structures" Seite Link (zum Beispiel: http: / /gtrnadb.ucsc.edu/Aero_pern/Aero_pern-structs.html )
Im Inneren, die verknüpfen möchte ich die Daten in der Seite verschrotten, so dass ich eine lange Liste haben diese Daten enthalten (zum Beispiel):
chr.trna3 (1-77) Length: 77 bp
Type: Ala Anticodon: CGC at 35-37 (35-37) Score: 93.45
Seq: GGGCCGGTAGCTCAGCCtGGAAGAGCGCCGCCCTCGCACGGCGGAGGcCCCGGGTTCAAATCCCGGCCGGTCCACCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<....
Wenn jede Zeile hat eine eigene Liste (in der Liste für jeden „trna“ innerhalb der Liste für jedes Tier)
Ich erinnere mich, kommen über die Pakete Rcurl und XML (in R), die für eine solche Aufgabe zulassen. Aber ich weiß nicht, wie sie zu benutzen. Also, was ich würde gerne haben ist: 1. Einige Vorschläge, wie ein solcher Code zu bauen. 2. Und Empfehlung für wie das Wissen zur Durchführung eines solchen Aufgabe erforderlich lernen.
Vielen Dank für jede Hilfe,
Tal
Lösung
Tal,
könnten Sie verwenden R und das XML
Paket, dies zu tun, aber (verdammt), dass einige schlecht gebildet HTML ist, dass Sie zu analysieren versuchen. In der Tat, in den meisten Fällen würde Ihr will die readHTMLTable()
Funktion zu verwenden, , die in diesem früheren Thread abgedeckt ist.
diese hässliche HTML Da jedoch werden wir das RCurl
Paket verwenden müssen, um den rohen HTML zu ziehen und einige benutzerdefinierten Funktionen zu erstellen, es zu analysieren. Dieses Problem hat zwei Komponenten:
- Bleiben Sie den Genom URLS von der Basis Homepage ( http://gtrnadb.ucsc.edu/getURLContent() Funktion im
RCurl
package und einige regex Magie>) mit: -) - Dann nehmen Sie diese Liste von URLS und kratzen die Daten, die Sie suchen, und dann stecken in eine
data.frame
.
So, hier geht ...
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)
Der resultierende Datenrahmen enthält sieben Spalten zu jedem Genom Eintrag bezogen werden: ID, Länge, Art, Reihenfolge, String und Namen. Der Name Spalte enthält die Basis-Genom, das meine beste Vermutung für Datenorganisation war. Hier ist es, wie es aussieht:
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
Ich hoffe, das hilft, und danke für den Spaß wenig Sonntagnachmittag R Herausforderung!
Andere Tipps
habe gerade versucht es Mozenda mit ( http://www.mozenda.com ). Nach etwa 10 Minuten und ich hatte ein Mittel, das die Daten kratzen könnte, wie Sie beschreiben. Sie können in der Lage sein, all diese Daten zu erhalten, nur ihre kostenlose Testversion verwenden. Coding ist Spaß, wenn Sie Zeit haben, aber es sieht aus wie Sie bereits eine Lösung codiert für Sie haben. Nice job Drew.
Interessantes Problem und ist damit einverstanden, dass R cool, aber ich R irgendwie finde ein wenig umständlich in dieser Hinsicht zu sein. Ich scheine es zu vorziehen, die Daten in einem Zwischenklartextform zu erhalten zuerst, um verifizieren zu können, dass die Daten in jedem Schritt richtig sind ... Wenn die Daten in seiner endgültigen Form bereit sind, oder für Ihre Daten irgendwo RCurl Upload ist sehr nützlich.
Einfachstes meiner Meinung nach wäre (auf Linux / Unix / mac / oder in Cygwin) nur den gesamten Spiegel http : //gtrnadb.ucsc.edu/ Website (mit wget) und nehmen Sie die angegebenen Dateien / -structs.html, sed oder die Daten awk würde es Ihnen gefällt und zu formatieren in zum Lesen R.
Ich bin sicher, gäbe es auch viele andere Möglichkeiten geben.