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

为何使用for循环爬取国会网站下载链接时无法正常工作?

问题原因分析
  • 整列覆盖而非单行赋值:原循环中links$download <- paste0(...)会将整个download列替换为当前循环的结果,最终所有行只会保留最后一次循环的输出。如果最后一次循环中未提取到有效href(返回空字符),就会只显示前缀https://www.congress.gov。
  • 未处理空元素情况:若某页面中html_nodes未找到目标链接,html_attr("href")会返回空向量,paste0拼接后仅保留前缀字符串。
  • 冗余代码干扰:原代码中重复执行read_html和GET请求,可能导致页面加载异常,影响元素提取。
解决方案

修正后的循环代码

# 初始化download列为字符型空值
links$download <- character(nrow(links))

# 按索引循环,确保对应行赋值
for(i in seq_along(links$link)) {
  url <- links$link[i]
  
  # 用RSelenium导航至目标页面
  remote_driver$navigate(url)
  # 增加延迟避免请求过快触发反爬
  Sys.sleep(1)
  
  # 获取页面源码并解析
  html_source <- remote_driver$getPageSource()
  target_page <- read_html(html_source[[1]])
  
  # 提取下载链接的href属性
  load <- html_nodes(target_page, xpath='/html/body/div[2]/div/main/div[2]/div/p/a')
  href <- html_attr(load, "href")
  
  # 处理空值情况,仅当获取到有效href时拼接完整链接
  if(length(href) > 0 && !is.na(href)) {
    links$download[i] <- paste0("https://www.congress.gov", href)
  } else {
    links$download[i] <- NA_character_
  }
}

关键修正点

  • 使用seq_along(links$link)获取索引,循环时通过i定位到links的对应行,避免覆盖整列数据。
  • 初始化download列为字符型,避免后续赋值时出现类型冲突。
  • 移除冗余的GET和重复read_html操作,依赖RSelenium获取的页面源码即可完成解析。
  • 增加对href有效性的判断,空值时赋值NA,避免无效拼接。
  • 添加Sys.sleep(1)减缓请求频率,降低被网站反爬机制拦截的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:46