R: Получение ссылок из результатов поиска Google после первой страницы - PullRequest
0 голосов
/ 19 апреля 2019

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

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 голос
/ 19 апреля 2019

Вы можете использовать последовательность 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 в каждом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...