You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rvest或Selenium在R中爬取网站链接遇问题

批量爬取并点击网站链接问题解决

一、rvest爬PHP页面出现404的原因

不是.php后缀的问题,是你写URL的方式错了——data_url <- website.php这种写法没有把URL当成字符串,R会把它当成变量解析,自然找不到资源。另外如果目标页面是动态渲染的(比如用JS加载内容),rvest只能爬静态HTML,这种情况得用RSelenium。

正确的静态页面爬取写法:

library(rvest)
# 必须是完整的字符串格式URL
data_url <- "https://你的目标域名/website.php"
page <- read_html(data_url)
# 直接抓取所有a标签的href属性
links <- page %>% html_elements("a") %>% html_attr("href")
# 过滤掉空的href
links <- links[!is.na(links)]

二、RSelenium正确获取链接并循环点击

你之前选的是li元素,当然只能拿到文本,要直接选li下面的a标签,就能获取href或者直接点击元素。

方法1:直接遍历元素点击(推荐)

不用存链接,直接拿到所有目标a标签元素,循环点击,操作完返回上一页:

# 定位所有目标a标签
link_elements <- remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul > li > a')

# 逐个点击
for (elem in link_elements) {
  elem$clickElement()
  # 这里写你要执行的代码,比如爬取当前页面数据
  # 操作完成后返回列表页
  remDr$goBack()
  # 加个等待,避免页面没加载完就操作
  Sys.sleep(2)
}

方法2:先存href列表,再逐个跳转

如果需要保存链接,用getElementAttribute获取href:

link_hrefs <- c()
for (elem in link_elements) {
  # 获取href属性,[[1]]是取出列表里的字符串
  href <- elem$getElementAttribute("href")[[1]]
  link_hrefs <- append(link_hrefs, href)
}

# 循环打开每个链接
for (url in link_hrefs) {
  remDr$navigate(url)
  # 执行你的代码
  Sys.sleep(2)
}

三、动态拼接CSS选择器解决序号变化问题

你之前的循环变量写在字符串里没生效,得用字符串拼接把变量插进去。另外因为每个ul下的li数量不一样,不要硬写序号,先遍历所有ul,再遍历每个ul下的li。

方法1:通过子元素遍历(更可靠)

先拿到所有ul元素,再逐个取里面的a标签:

# 获取所有目标ul
ul_elements <- remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul')

# 遍历每个ul
for (ul in ul_elements) {
  # 获取当前ul下的所有a标签
  li_a_elements <- ul$findChildElements(using = "css selector", value = "li > a")
  # 逐个点击
  for (a_elem in li_a_elements) {
    a_elem$clickElement()
    # 执行操作
    remDr$goBack()
    Sys.sleep(2)
  }
}

方法2:动态拼接CSS选择器(适合必须用序号的场景)

用glue包或者paste0把变量拼进选择器字符串:

library(glue)
# 先拿到ul的总数
ul_count <- length(remDr$findElements(using = "css selector", value = '#maincontent > div.pad-helper > ul'))

for (ul_idx in 1:ul_count) {
  # 拿到当前ul下的li数量
  li_count <- length(remDr$findElements(using = "css selector", value = glue('#maincontent > div.pad-helper > ul:nth-child({ul_idx}) > li')))
  # 遍历每个li
  for (li_idx in 1:li_count) {
    # 拼接选择器
    css_selector <- glue('#maincontent > div.pad-helper > ul:nth-child({ul_idx}) > li:nth-child({li_idx}) > a')
    link_elem <- remDr$findElement(using = "css selector", value = css_selector)
    link_elem$clickElement()
    # 执行操作
    remDr$goBack()
    Sys.sleep(2)
  }
}

内容的提问来源于stack exchange,提问作者user22757672

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:45:33