我有这个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。