【问题标题】:Simple solution to scrape and loop with rvest, storing the results of the for-loop in a variable使用 rvest 进行抓取和循环的简单解决方案,将 for 循环的结果存储在变量中
【发布时间】:2020-02-03 16:46:44
【问题描述】:

我需要使用 R 和 rvest 库从 3 个页面收集链接,每个页面有 150 个链接。我使用了一个 for 循环来爬取页面。我知道这是一个非常基本的问题,已在其他地方得到回答: R web scraping across multiple pages Scrape and Loop with Rvest 我尝试了以下代码的不同版本。他们中的大多数都有效,但只返回了 50 个而不是 150 个链接

library(rvest)

baseurl <- "https://www.ebay.co.uk/sch/i.html?_from=R40&_nkw=chain+and+sprocket&_sacat=0&_pgn="
n <- 1:3
nextpages <- paste0(baseurl, n)

for(i in nextpages){
  html <- read_html(nextpages)
  links <- html %>% html_nodes("a.vip") %>% html_attr("href")
}

代码应返回全部 150,而不是仅返回 50。

【问题讨论】:

    标签: r for-loop web-scraping rvest


    【解决方案1】:

    您在每次迭代中都覆盖了 links 变量,因此您最终只会得到最后 50 个链接。

    但是您正在使用 'i' 变量进行循环,而您的 read_html() 函数使用 nextpages 变量,它实际上是 3 个 url 的向量。你应该得到一个错误。

    试试这个:

    links <- c()
    for(i in nextpages){
      html <- read_html(i)
      links <- c(links, html %>% html_nodes("a.vip") %>% html_attr("href"))
    }
    

    【讨论】:

    • 我们如何使用 data.frame() 和 rbind() 而不是 c() 来做到这一点?
    【解决方案2】:

    我们可以使用map 代替for 循环。

    library(rvest)
    library(purrr)
    
    map(nextpages, . %>% read_html %>%
                   html_nodes("a.vip") %>% 
                   html_attr("href")) %>% flatten_chr()
    
    #[1] "https://www.ebay.co.uk/itm/Genuine-Honda-Chain-and-sprocket-set-Honda-Cub-C50-C70-C90-Heavy-Duty/254287014069?hash=item3b34afe8b5:g:wjEAAOSwqaBdH69W"         
    #[2] "https://www.ebay.co.uk/itm/DID-Heavy-Duty-Drive-Chain-And-JT-Sprocket-Kit-For-Honda-MSX125-Grom-2013-2019/223130604262?hash=item33f39ed2e6:g:QmwAAOSwdrpcAQ4c"
    #.....
    #...
    

    【讨论】:

    • 不错。 + 因此,在purrr.tidyverse.org/reference/flatten.html 中查找 flatten_chr 似乎如果您有 3 个级别的深度,您最终会得到 2 个级别,如果在 2 个级别,您最终会得到 1 个级别,依此类推?你是怎么在这里使用它的?
    • @QHarr map 就像lapply 它返回列表,通过使用flatten_chr 我们将它变成字符向量。查看lapply(1:10, sqrt) 和lapply(1:10, sqrt) %&gt;% flatten_dbl() 的输出之间的区别
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多