كيف يمكنني استخدام 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: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<....

حيث سيكون لكل سطر قائمته الخاصة (داخل القائمة الخاصة بكل "ترنا" داخل القائمة الخاصة بكل حيوان)

أتذكر أنني صادفت الحزم Rcurl وXML (في R) التي يمكن أن تسمح بمثل هذه المهمة.لكني لا أعرف كيفية استخدامها.إذن ما أحب أن أحصل عليه هو:1.بعض الاقتراحات حول كيفية بناء مثل هذا الرمز.2.والتوصية بكيفية تعلم المعرفة اللازمة لأداء مثل هذه المهمة.

شكرا على اي مساعدة،

تل

هل كانت مفيدة؟

المحلول

تل

يمكنك استخدام R و XML حزمة للقيام بذلك، ولكن (لعنة) هذا هو بعض html سيئة تشكيل أنت تحاول تحليلها. في الواقع، في معظم الحالات، تريد أن تستخدم readHTMLTable() وظيفة، التي تغطيها في هذا الموضوع السابق.

بالنظر إلى هذا HTML القبيح، ومع ذلك، سيتعين علينا استخدام RCurl حزمة لسحب HTML RAW وإنشاء بعض الوظائف المخصصة لتحليلها. هذه المشكلة لها عنصرين:

  1. احصل على جميع عناوين URL Genome من صفحة الويب الأساسية (http://gtrnadb.ucsc.edu/) باستخدام getURLContent() وظيفة في RCurlحزمة وبعض regex ماجيك :-)
  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)

يحتوي إطار البيانات الناتج على سبعة أعمدة متعلقة بكل إدخال جينوم: المعرف والطول والنوع والتسلسل والسلسلة والسمية. يحتوي عمود الاسم على جينوم الأساس، الذي كان أفضل تخمين لمنظمة البيانات. هنا ما يبدو عليه:

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 مرهقًا بعض الشيء في هذا الصدد.يبدو أنني أفضل الحصول على البيانات في شكل نص عادي متوسط ​​أولاً حتى أتمكن من التحقق من صحة البيانات في كل خطوة...إذا كانت البيانات جاهزة في شكلها النهائي أو لتحميل بياناتك في مكان ما، فإن RCurl مفيد جدًا.

أبسط شيء في رأيي هو (على Linux/unix/mac/أو في cygwin) فقط قم بعكس كامل http://gtrnadb.ucsc.edu/ site (باستخدام wget) وأخذ الملفات المسماة /-structs.html أو sed أو awk البيانات التي تريدها وتنسيقها لقراءتها في R.

أنا متأكد من أنه سيكون هناك الكثير من الطرق الأخرى أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top