#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. Да, в данном случае в этом не было необходимости. Могут быть ситуации, когда вам нужен этот индекс, например, если у вас не было доступа к кнопке «далее» и вам приходилось просматривать страницы по номерам