Rvest:抓取多个 URL

Rvest: Scrape multiple URLs

我正在尝试通过 URL 列表循环抓取一些 IMDB 数据。不幸的是,我的输出并不完全是我所希望的,不要介意将它存储在数据框中。

我得到 URLs

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]

然后我可以满足于

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

但它是一个嵌套列表,我不知道如何将它放入 R 中的正确 data.frame。同样,如果我想获得另一个属性,请说

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

为了检索 IMDB 评级,我得到了相同的嵌套列表输出,最重要的是我必须执行 read_html() 两次……这会花费很多时间。有一个更好的方法吗?我猜是 for 循环,但我无法让它以这种方式工作:(

编辑:现在也有评级

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)

另一种方法是使用 sapply,如下所示:

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)

这导致:

                     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

这是使用 purrr 和 rvest 的一种方法。关键思想是保存已解析的页面,然后然后提取您感兴趣的位。

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()
  )