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

问题描述 投票:0回答:2

我需要使用R和rvest库,从3个页面中收集链接,每个页面包含150个链接。我使用了for循环来浏览页面。我知道这是一个非常基本的问题,已在其他地方得到解答:R web scraping across multiple pagesScrape 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
2个回答
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
投票

我们可以使用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"
#.....
#...
© www.soinside.com 2019 - 2024. All rights reserved.