r - RSelenium:从 Google 搜索中单击 for 循环中的后续链接
问题描述
我RSelenium
用来做一些简单的谷歌搜索。设置:
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
}