2016-04-28 10 views
3

Ich versuche, einige IMDB-Daten durch eine Liste von URLs Schleifen zu kratzen. Leider ist meine Ausgabe nicht genau das, was ich mir erhofft habe, geschweige denn, sie in einem Datenrahmen zu speichern.Rvest: Scrape mehrere URLs

ich URLs mit

library(rvest) 
topmovies <- read_html("http://www.imdb.com/chart/top") 
links <- top250 %>% 
    html_nodes(".titleColumn") %>% 
    html_nodes("a") %>% 
    html_attr("href") 
links_full <- paste("http://imdb.com",links,sep="") 
links_full_test <- links_full[1:10] 

und dann konnte ich mit

lapply(links_full_test, . %>% read_html() %>% html_nodes("h1") %>% html_text()) 

Inhalt bekommen, aber es ist eine verschachtelte Liste, und ich weiß nicht, wie es in einem richtigen Daten zu erhalten. Rahmen in R. Und falls ich ein anderes Attribut erhalten wollte, sagen

%>% read_html() %>% html_nodes("strong span") %>% html_text() 

die IMDB Bewertung abzurufen, erhalte ich die die gleiche geschachtelte-list-Ausgabe und vor allem muss ich read_html() zweimal tun ... was viel Zeit in Anspruch nimmt. Gibt es einen besseren Weg, dies zu tun? Ich denke, for-Schleifen, aber ich kann es nicht so arbeiten :(

+0

(Ich gehe davon aus 'top250' ist wirklich' topmovies'.) Was von Ihrem 'lapply mit der Liste falsch ist (. ..) '? Es ist nur eine Liste (von Single-String-Vektoren), indizieren Sie es wie einen Vektor (optional mit '[[' anstelle von '['). Also, was ist ein "richtiger Rahmen *"? Zweitens kann die Verwendung von "strong span" etwas vage sein, Sie könnten besser Xpaths oder andere CSS-Einschränkungen verwenden. – r2evans

Antwort

5

Hier ist ein Ansatz mit purrr und rvest Die Schlüsselidee ist t zu speichern. er analysiert Seite und dann die Bits extrahieren Sie interessiert sind.

library(rvest) 
library(purrr) 

topmovies <- read_html("http://www.imdb.com/chart/top") 
links <- topmovies %>% 
    html_nodes(".titleColumn") %>% 
    html_nodes("a") %>% 
    html_attr("href") %>% 
    xml2::url_absolute("http://imdb.com") %>% 
    .[1:5] # for testing 

pages <- links %>% map(read_html) 

title <- pages %>% 
    map_chr(. %>% 
    html_nodes("h1") %>% 
    html_text() 
) 
rating <- pages %>% 
    map_dbl(. %>% 
    html_nodes("strong span") %>% 
    html_text() %>% 
    as.numeric() 
) 
+0

Danke! Ich wusste nicht über purrr, sieht gut aus :) – erocoar

+0

Auf den Teil mit Titel <- Seiten, bekomme ich Fehler: Ergebnis 1 ist keine Länge 1 Atom Vektor – Monduiz

+0

Es funktioniert mit map() anstelle von map_char() – Monduiz

3

Edit: jetzt mit Rating als auch

library(dplyr) 
library(rvest) 

s = "http://www.imdb.com/chart/top" %>% html_session 

links = 
    s %>% 
    html_nodes(".titleColumn a") %>% 
    html_attr("href") %>% 
    data_frame(link = .) %>% 
    slice(1:10) %>% 
    rowwise %>% 
    mutate(new_page = 
      s %>% 
      jump_to(link) %>% 
      list, 
     title = 
      new_page %>% 
      html_nodes("h1") %>% 
      html_text, 
     rating = 
      new_page %>% 
      html_nodes("strong span") %>% 
      html_text %>% 
      as.numeric) 
2

Ein anderer Ansatz wäre sapply wie folgt zu verwenden:

library(rvest) 

s = "http://www.imdb.com/chart/top" %>% html_session 

title_links <- function(x) {x %>% html_nodes(".titleColumn a") %>% html_attr("href")} 
h1_text <- function(x) {x %>% html_node("h1") %>% html_text(trim=TRUE)} 

s %>% 
    title_links %>% 
    sapply(. %>% jump_to(s, .) %>% h1_text) %>% 
    data.frame(text = ., link = names(.), row.names=NULL) 

was zur Folge hat:

     text 
1 Die Verurteilten (1994) 
2   Der Pate (1972) 
3  Der Pate 2 (1974) 
4 The Dark Knight (2008) 
5 Schindlers Liste (1993) 
                                       link 
1 /title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=109KYN8J6HW5TM5Y1P86&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_1 
2 /title/tt0068646/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=109KYN8J6HW5TM5Y1P86&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_2 
3 /title/tt0071562/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=109KYN8J6HW5TM5Y1P86&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_3 
4 /title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=109KYN8J6HW5TM5Y1P86&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4 
5 /title/tt0108052/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=109KYN8J6HW5TM5Y1P86&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_5 
+0

Ich weiß nicht, warum Sie downvoted wurden, ich habe es tatsächlich upvoted. Entschuldigung und danke für deine Hilfe! – erocoar