RSelenium: переход по последующим ссылкам в цикле for из поиска Google - PullRequest
2 голосов
/ 19 марта 2019

Я использую 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?

1 Ответ

1 голос
/ 21 марта 2019

Я думаю, вы могли бы рассмотреть возможность захвата ссылок и их циклического перемещения, не возвращаясь на главную страницу.

Для этого вам нужно будет захватить элементы ссылки («тег»).

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
}
...