【问题标题】:Rvest: Scrape multiple URLsRvest:抓取多个 URL
【发布时间】:2016-08-23 15:44:12
【问题描述】:

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

我得到网址

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循环,但我不能让它这样工作:(

【问题讨论】:

  • (我假设top250 真的是topmovies。)您的lapply(...) 中的列表有什么问题?它只是一个列表(单字符串向量),像向量一样对其进行索引(可选地使用[[ 代替[)。那么,什么是“适当的框架”?其次,使用“强跨度”可能有点模糊,使用 xpaths 或其他 CSS 约束可能会更好。

标签: r web-scraping rvest


【解决方案1】:

编辑:现在也有评分

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】:

    另一种方法是使用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
    

    【讨论】:

    • 我不知道你为什么被否决,我实际上投了赞成票。很抱歉,感谢您的帮助!
    【解决方案3】:

    这是使用 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()
      )
    

    【讨论】:

    • 谢谢!我不知道 purrr,看起来不错 :)
    • 在标题
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多