使用rvest进行抓取和循环的简单解决方案,将for循环的结果存储在变量中

时间:2019-10-05 19:43:37

标签: r for-loop web-scraping rvest

我需要使用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个。

2 个答案:

答案 0 :(得分: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"))
}

答案 1 :(得分:1)

我们可以使用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"
#.....
#...