【问题标题】:R web scraping across multiple pages跨多个页面的 R 网页抓取
【发布时间】:2016-08-09 13:45:09
【问题描述】:

我正在开发一个网络抓取程序,以搜索特定的葡萄酒并返回该品种的本地葡萄酒列表。我遇到的问题是多页结果。下面的代码是我正在使用的基本示例

url2 <- "http://www.winemag.com/?s=washington+merlot&search_type=reviews"
htmlpage2 <- read_html(url2)
names2 <- html_nodes(htmlpage2, ".review-listing .title")
Wines2 <- html_text(names2)

对于这个特定的搜索,有 39 页的结果。我知道 url 更改为http://www.winemag.com/?s=washington%20merlot&drink_type=wine&page=2,但是有没有一种简单的方法可以让代码循环遍历所有返回的页面并将所有 39 个页面的结果编译到一个列表中?我知道我可以手动完成所有网址,但这似乎有点过头了。

【问题讨论】:

    标签: html r web-scraping rvest


    【解决方案1】:

    如果您想将所有信息作为data.frame,您也可以使用purrr::map_df() 执行类似的操作:

    library(rvest)
    library(purrr)
    
    url_base <- "http://www.winemag.com/?s=washington merlot&drink_type=wine&page=%d"
    
    map_df(1:39, function(i) {
    
      # simple but effective progress indicator
      cat(".")
    
      pg <- read_html(sprintf(url_base, i))
    
      data.frame(wine=html_text(html_nodes(pg, ".review-listing .title")),
                 excerpt=html_text(html_nodes(pg, "div.excerpt")),
                 rating=gsub(" Points", "", html_text(html_nodes(pg, "span.rating"))),
                 appellation=html_text(html_nodes(pg, "span.appellation")),
                 price=gsub("\\$", "", html_text(html_nodes(pg, "span.price"))),
                 stringsAsFactors=FALSE)
    
    }) -> wines
    
    dplyr::glimpse(wines)
    ## Observations: 1,170
    ## Variables: 5
    ## $ wine        (chr) "Charles Smith 2012 Royal City Syrah (Columbia Valley (WA)...
    ## $ excerpt     (chr) "Green olive, green stem and fresh herb aromas are at the ...
    ## $ rating      (chr) "96", "95", "94", "93", "93", "93", "93", "93", "93", "93"...
    ## $ appellation (chr) "Columbia Valley", "Columbia Valley", "Columbia Valley", "...
    ## $ price       (chr) "140", "70", "70", "20", "70", "40", "135", "50", "60", "3...
    

    【讨论】:

    • 我喜欢这段代码。我喜欢用 cat("boom! ") 替换 cat(".") 。我猜是个人喜好。
    • 如果我想点击“查看完整评论”(每一行)打开一个新的网络时代,我可以使用RSelenium吗?
    【解决方案2】:

    您可以lapply 跨越 URL 的向量,您可以通过将基本 URL 粘贴到序列来创建:

    library(rvest)
    
    wines <- lapply(paste0('http://www.winemag.com/?s=washington%20merlot&drink_type=wine&page=', 1:39),
                    function(url){
                        url %>% read_html() %>% 
                            html_nodes(".review-listing .title") %>% 
                            html_text()
                    })
    

    结果将在一个列表中返回,每个页面都有一个元素。

    【讨论】:

    • 非常好的阿利斯泰尔!!你能解释一下这是如何工作的吗?谢谢。
    • 它将一个 URL 向量粘贴在一起,每个页面一个,然后 lapply 在每个页面上运行该函数。该函数是一个rvest 链,它读取该 URL 处的 HTML,选择具有指定类(即标题)的节点,并从这些节点中获取文本。每次运行该函数时,它都会返回一个列表项,但如果要将它们全部折叠到一个向量中,只需运行unlist(wines)。如果您还想为每种葡萄酒获取其他元素,您可以将它们全部组装到一个 data.frame 中。
    • 如果我想点击“SEE FULL REVIEW”(每一行)打开一个新的网络时代,我必须使用 RSelenium 吗?
    • 否;每行都包含在带有 href 属性的 &lt;a&gt; 标记中,该属性是评论的 URL,因此您可以获得 URL 的向量,以便进一步使用 page %&gt;% html_nodes('a.review-listing') %&gt;% html_attr('href')
    猜你喜欢
    • 2021-09-30
    • 2019-02-16
    • 2022-01-21
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多