R: получение ссылок из результатов поиска Google за пределами первой страницы r

#r

#r

Вопрос:

У меня есть эта RSelenium настройка (использование selenium действительно не должно влиять на ответ на этот вопрос):

 library(tidyverse)
library(rvest)
library(httr)
library(RSelenium) # running through docker

## RSelenium setup
remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open()

## Navigate to Google Books 
remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")

## Search for whatever, the Civil War, for example
books$sendKeysToElement(list("the civil war", key = "enter"))

## Getting Google web elements (10 per page)
bookElem <- remDr$findElements(using = "xpath", "//h3[@class = 'LC20lb']//parent::a")

## Click on each book link
links <- sapply(bookElem, function(bookElem){
  bookElem$getElementAttribute("href")
})
 

Это отлично работает — и компилирует все ссылки с первой страницы результатов (Google автоматически ограничивает его 10 результатами, то есть десятью ссылками). Чего бы я хотел, так это чтобы тот же links вектор компилировал каждую ссылку на результат с первых, скажем, 12 страниц (чтобы она была управляемой). Итак:

 goog_pgs <- seq(1:12) # to set the limit
 

Где я заблудился: как мне ввести это в свой links вектор? Ссылки с каждой страницы слишком разные и недостаточно просты, чтобы просто указать номер до конца. Я попытался вставить следующее:

 nextButton <- remDr$findElements("xpath", "//*[@id = 'pnnext']")
next_page <- sapply(nextButton, function(nextButton) {
  next_elements$clickElement()
})
 

И это не работает. Какое здесь решение?

Ответ №1:

Вы можете использовать последовательность 1:12 как что-то для повторения, используя for цикл, lapply , или другой механизм зацикливания. У меня ужасное время с apply функциями, поэтому я поменялся map . Шаги, которые необходимо выполнять неоднократно, — это поиск книг, получение href каждой книги и нажатие кнопки «Далее». С некоторыми изменениями вы можете использовать:

 books_12 <- map(1:12, function(pg) {
  bookElem <- remDr$findElements(using = "xpath", "//h3[@class = 'LC20lb']//parent::a")
  links <- map_chr(bookElem, ~.$getElementAttribute("href")[[1]])

  nextButton <- remDr$findElement("xpath", "//*[@id='pnnext']")
  nextButton$clickElement()

  links
})
 

Обратите внимание, что getElementAttribute возвращает список; поскольку каждый элемент имеет только один href , я сохранил первый (единственный) [[1]] . Это дает список из 12 векторов по 10 URL-адресов в каждом.

Комментарии:

1. Это потрясающе. Будет реализовано в ближайшие дни. Вопрос: pg не используется в самой функции? Из любопытства, почему это так? Это потому pg , что он просто не нужен и функционирует как заполнитель?

2. Да, в данном случае в этом не было необходимости. Могут быть ситуации, когда вам нужен этот индекс, например, если у вас не было доступа к кнопке «далее» и вам приходилось просматривать страницы по номерам