R:从谷歌搜索结果中获取超出第一页r的链接



我有这个RSelenium设置(使用硒真的不应该影响这个问题的答案(:

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个结果,因此有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: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。

最新更新