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

使用rvest::session在R中爬取网页:无提交按钮时下载PDF

自动下载德州学区审计PDF的R代码优化

核心解决思路

提交年份和学区表单后,页面生成的View按钮本质是指向PDF文件的带参URL。我们需要两步完成下载:

  1. 从提交后的页面中提取这个PDF的链接
  2. 通过会话(session)请求该链接并将文件保存到本地

修改后的完整代码

library(tidyverse)
library(rvest)

# 初始化会话
session <- html_session("https://tealprod.tea.state.tx.us/Audit/Public/PDFViewer.asp")
form <- html_form(session)[[1]]

# 筛选目标年份(2016-2023)
years <- form$fields[[6]]$options[-1]
years <- years[grep("201[6-9]|202[0-3]", years)]

# 遍历年份和学区
for (i in 1:length(years)) {
  # 选择年份并提交,更新表单和会话
  form <- set_values(form, 'YearSelected' = years[i])
  session <- submit_form(session, form)
  form <- html_form(session)[[1]]
  districts <- form$fields[[8]]$options[-1]
  
  for (j in 1:length(districts)) {
    # 选择学区并提交
    form <- set_values(form, "DNSelected" = districts[j])
    session <- submit_form(session, form)
    
    # 1. 提取View按钮对应的PDF链接
    pdf_link <- session %>% 
      html_element(xpath = "//a[contains(text(), 'View')]") %>% 
      html_attr("href")
    
    # 跳过无PDF的情况(部分学区可能无对应文档)
    if(is.na(pdf_link)) next
    
    # 2. 构造完整URL并下载PDF
    full_pdf_url <- paste0("https://tealprod.tea.state.tx.us/Audit/Public/", pdf_link)
    pdf_response <- session %>% jump_to(full_pdf_url)
    
    # 生成唯一文件名(替换特殊字符避免保存报错)
    district_name <- str_replace_all(districts[j], "[^a-zA-Z0-9]", "_")
    file_name <- paste0("Audit_", years[i], "_", district_name, ".pdf")
    
    # 保存文件到本地
    writeBin(pdf_response$response$content, file_name)
    
    # 可选:添加延迟,避免请求过于频繁被服务器限制
    Sys.sleep(1)
  }
}

关键细节说明

  • 用xpath精准定位View按钮://a[contains(text(), 'View')]可以快速找到目标链接标签
  • 处理文件名:替换学区名称中的特殊字符(空格、斜杠等),避免本地保存时出错
  • 添加Sys.sleep(1):给服务器留缓冲时间,降低被反爬机制限制的概率
  • 跳过空链接:部分学区可能没有对应年份的审计文档,直接跳过避免报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:12:11