为何使用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
相关产品推荐
相关产品推荐

