首页 > 解决方案 > 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 

在 内会更容易使用 吗?rvestRSelenium

标签: rseleniumdplyrlapplyrselenium

解决方案


我认为您可以考虑抓取链接并循环浏览它们而无需返回主页。

为了实现这一点,您必须获取链接元素(“标签”)。

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
}

推荐阅读