2010-03-14 3 views
10

У меня есть (несколько сложная) проблема соскабливания сети, которую я хочу выполнить и буду любить в каком-либо направлении (на любой уровень, который вы чувствуете, как разделение):Как я могу использовать R (Rcurl/XML-пакеты?!), Чтобы очистить эту веб-страницу?

Я хотел бы пройти через все «виды страниц» "присутствует в этой ссылке:

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. И рекомендации по изучению знаний, необходимых для выполнения такой задачи.

Спасибо за любую помощь,

Tal

+1

@Tal, вопрос, могу ли я: является ли это законным? И если так, не проще ли просто запросить UCSC для регулярного доступа к своей БД? –

+2

Привет Таль, попробуй все равно сбросить их. Вы могли бы найти их вполне подходящими. Они могут даже не знать, что люди хотят использовать данные так, как вы этого хотите. Может быть, они будут заинтересованы в предоставлении этого, как вы хотите? – user246211

ответ

17

Tal,

Вы можете использовать R и XML пакет, чтобы сделать это, но (блин), что некоторые плохо сформирован HTML вы пытаетесь разобрать. Фактически, в большинстве случаев вы хотели бы использовать функцию readHTMLTable(), which is covered in this previous thread.

Учитывая этот уродливый HTML, нам придется использовать пакет RCurl, чтобы вытащить необработанный HTML-код и создать некоторые пользовательские функции для его анализа.Эта проблема имеет два компонента:

  1. Получить весь геном URLS от базовой веб-страницы (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) 

Результирующий фрейм данных содержит семь столбцов, связанных с каждой записью генома: ID, длина, тип, последовательность, последовательность и имя. Столбец name содержит базовый геном, который был моим лучшим предположением для организации данных. Вот оно, как это выглядит:

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!

+0

Ах, спасибо Тал. Я не сделал достаточно тщательного поиска возможных записей. Рад, что вы смогли заставить его работать! – DrewConway

+0

Справка для readHTMLtable дает метод для таблиц PRE. Что-то вроде: 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] Может помочь. –

0

Интересная проблема и согласен, что R это здорово, но как-то я найти R быть немного громоздким в этом отношении. Кажется, я предпочитаю сначала получать данные в промежуточной текстовой форме, чтобы иметь возможность проверить правильность данных на каждом шагу ... Если данные готовы в окончательной форме или для загрузки ваших данных где-то RCURL очень полезно.

Простейшее на мой взгляд, было бы (на Linux/Unix/Mac/или Cygwin) просто отражают весь http://gtrnadb.ucsc.edu/ сайт (с помощью Wget) и принимать файлы с именем / -structs.html, СЭД или AWK данные, которые вы хотели бы и отформатировали для чтения в R.

Я уверен, что было бы много других способов.

1

Только что попробовал это, используя Mozenda (http://www.mozenda.com). Примерно через 10 минут у меня был агент, который мог бы очистить данные по мере их описания. Вы можете получить все эти данные, просто используя их бесплатную пробную версию. Кодирование - это весело, если у вас есть время, но похоже, что у вас уже есть решение, закодированное для вас. Хорошая работа Дрю.

 Смежные вопросы

  • Нет связанных вопросов^_^