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:

http://gtrnadb.ucsc.edu/

Also für jeden von ihnen werde ich gehen Sie zu:

  1. Die Art-Link (zum Beispiel: http://gtrnadb.ucsc.edu/Aero_pern/)
  2. 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

War es hilfreich?

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:

  1. Bleiben Sie den Genom URLS von der Basis Homepage ( http://gtrnadb.ucsc.edu/getURLContent() Funktion im RCurlpackage und einige regex Magie>) mit: -)
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top