我正在尝试使用 R 中的 RSelenium 自动执行网页抓取。我已使用 RSelenium 成功找到并单击了网页上的按钮,但在单击按钮后从页面中提取 href 属性时遇到了问题。
我实际上有 4000 个物种的清单,但这里有一个例子:
Species <- c("Abies balsamea", "Alchemilla glomerulans", "Antennaria dioica",
"Atriplex glabriuscula", "Brachythecium salebrosum")
这是我正在使用的代码:
library(RSelenium)
remDr <- remoteDriver(
remoteServerAddr = "localhost",
port = 4445L,
browserName = "firefox"
)
remDr$open()
remDr$navigate("https://ser-sid.org/")
webElem <- remDr$findElement(using = "class", "flex")
# Find the input field and button within webElem
input_element <- webElem$findChildElement(using = "css selector", value = "input[type='text']")
button_element <- webElem$findChildElement(using = "css selector", value = "button")
# Enter species name into the input field
input_element$sendKeysToElement(list("Abies balsamea"))
# Click the button to submit the form
button_element$clickElement()
Sys.sleep(5)
# Find all <a> elements with species information
species_links <- remDr$findElements(using = "css selector", value = "a[href^='/species/']")
# Extract the href attributes from the species links
hrefs <- sapply(species_links, function(link) {
link$getElementAttribute("href")
})
# Filter out NULL values (in case some links don't have href attributes)
hrefs <- hrefs[!is.na(hrefs)]
# Print the extracted hrefs
print(hrefs)
代码运行没有错误,但是species_links为空,说明没有定位到有物种信息的元素。
我尝试过单击按钮后等待页面加载,但页面内容似乎未完全加载或未按预期加载。
当我手动操作并在网页中搜索 Abies balsamea 时,我得到了这个
从那里我至少想得到这个链接:
https://ser-sid.org/species/ef741ce8-6911-4286-b79e-3ff0804520fb
当我在网页中检查它时可以看到它,如下图所示
如何解决此问题并确保单击按钮后可以从页面中提取 href?
理想情况下,我想循环遍历物种列表,例如物种,并获取包含每个物种链接的数据框
谢谢您的帮助!
虽然我不是 RSelenium 的用户,但我看不出你的代码有什么问题。
我必须承认,我很想使用 API 调用来进行抓取,这些 API 调用会返回 JSON 响应。当您在 ser-sid.org 上进行搜索时,您可以从浏览器检查器的网络选项卡中发现正在调用的 API URL 以及必要的授权标头。我将这些复制到 Postman 中并能够返回以下 JSON 响应:
[
{
"genus": "Abies",
"epithet": "balsamea",
"id": "ef741ce8-6911-4286-b79e-3ff0804520fb",
"infraspecies_rank": null,
"infraspecies_epithet": null,
"has_germination": false,
"has_oil": true,
"has_protein": false,
"has_dispersal": true,
"has_seed_weights": true,
"has_storage_behaviour": true,
"has_morphology": false
},
{
"genus": "Abies",
"epithet": "balsamea",
"id": "024cde5f-7cc5-48b7-89fd-be95638c8f2a",
"infraspecies_rank": "var.",
"infraspecies_epithet": "balsamea",
"has_germination": true,
"has_oil": false,
"has_protein": false,
"has_dispersal": false,
"has_seed_weights": true,
"has_storage_behaviour": true,
"has_morphology": false
}
]
因此,您可以编写一个简单的机器人来用几乎任何您喜欢的语言提出这些请求。例如,我会在 Node.js 中执行此操作。这不是比尝试使用机器人浏览器进行抓取容易得多吗?