R语言爬取分页网站批量下载PDF的方案咨询
问题原因
你之前用的download.file方案失效,核心原因是这个CivicWeb架构的文档站属于前端动态渲染站点:分页列表、PDF下载链接都是靠浏览器执行JavaScript后动态生成的,部分下载链接还带临时会话校验参数,直接发静态HTTP请求拿列表页源码,既抓不到分页加载后的文档条目,也拿不到合法的下载地址,自然会下载失败。
可行实现方案
方案1:适配R语言技术栈(和你原有使用习惯匹配)
- 依赖安装:执行
install.packages(c("chromote", "rvest", "httr", "fs"))安装所需包,靠headless Chrome实现动态页面渲染,不需要切换编程语言 - 实现逻辑:
- 启动无头浏览器会话打开目标文档路径,等待文档列表、分页控件完全加载完成再做后续操作
- 逐页触发分页跳转,每次翻页后等待新的列表DOM渲染完毕,提取所有PDF条目对应的临时下载链接,同时同步当前浏览器会话的cookie信息
- 调用
httr::GET传入同步到的cookie头请求PDF资源,将返回的二进制内容写入本地目标文件夹即可,不要直接裸用download.file请求无校验头的链接
- 注意:每次翻页、下载请求间隔1~2秒,过高的请求频率会触发站点拦截。
方案2:Python + Playwright 通用稳定方案
- 环境准备:执行
pip install requests playwright && playwright install chromium完成环境配置 - 实现逻辑:
- 用Playwright启动无头Chromium访问目标站点,自动处理JS渲染、cookie校验逻辑
- 遍历分页时不要硬编码总页数,逐页判断「下一页」按钮是否为可点击状态,直到按钮置灰即停止遍历,避免站点分页规则调整导致爬漏
- 提取每页渲染后的PDF下载链接,用同会话上下文发起请求下载文件,文件名直接用页面展示的文档标题命名,避免用URL随机字符命名导致文件无法识别。
方案3:直连后端接口(无浏览器依赖、效率最高)
- 这个站点的文档列表数据实际由固定后端接口返回:打开浏览器开发者工具切到网络面板,翻页时筛选路径包含
/filepro/api/的请求,就能找到返回JSON格式文档列表的接口,接口返回数据里直接包含每个PDF的ID、名称、下载路径参数 - 构造分页参数循环请求该接口即可拿到全量PDF信息,请求时带上Referer为站点域名、常规浏览器UA即可正常返回数据,不需要启动浏览器,爬取速度最快。
零代码临时方案
如果只是一次性下载需求,不需要写代码:打开站点后打开开发者工具,切到网络面板勾选「保留日志」,手动逐页点完所有分页,所有触发加载的PDF都会被浏览器记录,直接在下载栏批量保存到本地文件夹即可。
常见踩坑
- 不要提前缓存提取到的PDF下载链接,这类链接一般带时效签名参数,过期后会返回403无权限
- 初始调试时不要开多线程/高并发,很容易触发站点WAF规则导致IP被临时封禁
- 部分PDF链接会跳转二次校验,必须携带和访问页面时一致的cookie才能正常下载
内容的提问来源于stack exchange,提问作者scotiaboy
相关产品推荐
相关产品推荐

