Я использую RSelenium для простого поиска в Google. Настраивать:
library(tidyverse)
library(RSelenium) # running docker to do this
library(rvest)
library(httr)
remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open()
remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")
books$sendKeysToElement(list("NHL teams", key = "enter"))
bookElem <- remDr$findElements(using = "css", "h3.LC20lb")
Это легкая часть. Итак, на первой странице есть 10 ссылок, и Я хочу нажать на каждую ссылку, вернуться, а затем нажать на следующую ссылку. Как это сделать наиболее эффективно? Я пробовал следующее:
bookElem$clickElement()
Возвращает Error: attempt to apply non-function - я ожидал, что это нажмет на первую ссылку, но ничего хорошего. (Это сработает, если я сниму s с findElements() - выше, а не с петли for ниже).
clack <- lapply(bookElem, function(y) {
y$clickElement()
y$goBack()
})
Выдает ошибку вида нравится этот вопрос:
Error: Summary: StaleElementReference
Detail: An element command failed because the referenced element is no longer attached to the DOM.
Further Details: run errorDetails method
Будет ли это проще в использованииrvest в пределах RSelenium?





Я думаю, вы могли бы взять ссылки и просмотреть их, не возвращаясь на главную страницу.
Для этого вам нужно будет захватить элементы ссылки («тег»).
bookElems <- remDr$findElements(using = "xpath",
"//h3[@class = 'LC20lb']//parent::a")
Затем извлеките атрибут «href» и перейдите к нему:
links <- sapply(bookElems, function(bookElem){
bookElem$getElementAttribute("href")
})
for(link in links){
remDr$navigate(link)
# DO SOMETHING
}
Полный код будет выглядеть так:
remDr$open()
remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")
books$sendKeysToElement(list("NHL teams", key = "enter"))
bookElems <- remDr$findElements(using = "xpath",
"//h3[@class = 'LC20lb']//parent::a")
links <- sapply(bookElems, function(bookElem){
bookElem$getElementAttribute("href")
})
for(link in links){
remDr$navigate(link)
# DO SOMETHING
}
Это сработало, и ваш простой цикл — отличная база. Можно просто использовать
remDr$getCurrentUrl(), чтобы проверить, закончилась ли она на последней ссылке.