使用rvest::session在R中爬取网页:无提交按钮时下载PDF
自动下载德州学区审计PDF的R代码优化
核心解决思路
提交年份和学区表单后,页面生成的View按钮本质是指向PDF文件的带参URL。我们需要两步完成下载:
- 从提交后的页面中提取这个PDF的链接
- 通过会话(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
相关产品推荐
相关产品推荐

