Простое решение для очистки и цикла с помощью rvest, сохраняя результаты цикла for в переменной - PullRequest
0 голосов
/ 05 октября 2019

Мне нужно собрать ссылки с 3 страниц, каждая из которых имеет 150 ссылок, используя R с библиотекой rvest. Я использовал цикл for, чтобы пролистать страницы. Я знаю, что это очень простой вопрос, на который были даны ответы в другом месте: R просмотр веб-страниц на нескольких страницах Очистка и цикл с 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 ]

1 голос
/ 06 октября 2019

Мы можем использовать 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"
#.....
#...
1 голос
/ 05 октября 2019

Вы перезаписываете переменную 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"))
}
...