R语言如何从带下载按钮的PDF可视化预览页批量下载PDF
问题根因
原代码直接调用download.file请求预览页URL只能拿到空文件,核心原因是目标站点的预览页是动态渲染的HTML页面,并非直接返回PDF二进制流:页面加载完成后才会通过前端逻辑异步拉取PDF资源,同时站点做了防盗链校验,直接请求资源不带合法请求头会被拦截。你之前在其他站点能用原代码,是因为那些站点的URL直接指向PDF文件本身,不需要额外处理。
推荐方案(无需浏览器驱动,效率最高)
这个站点的PDF下载接口有固定规则,不需要解析页面、模拟点击按钮,直接构造带合法请求头的HTTP请求就能拿到完整PDF文件,步骤如下:
- 从预览页URL中提取末尾的刊物数字ID
- 拼接对应ID的官方PDF下载接口地址
- 请求时携带预览页作为Referer、加上常规浏览器UA绕过防盗链校验
- 将接口返回的二进制流直接写入本地PDF文件
完整可运行代码:
# 首次运行先执行安装依赖:install.packages("httr2") library(httr2) # 原有URL与本地文件名的映射配置 urls <- c("https://dom-web.pbh.gov.br/visualizacao/edicao/2714", "https://dom-web.pbh.gov.br/visualizacao/edicao/2714", "https://dom-web.pbh.gov.br/visualizacao/edicao/2716", "https://dom-web.pbh.gov.br/visualizacao/edicao/2718", "https://dom-web.pbh.gov.br/visualizacao/edicao/2720", "https://dom-web.pbh.gov.br/visualizacao/edicao/2721") file_names = c("DECRETO Nº 17.297.pdf", "DECRETO Nº 17.298.pdf", "DECRETO Nº 17.304.pdf", "DECRETO Nº 17.308.pdf", "DECRETO Nº 17.309.pdf", "DECRETO Nº 17.313.pdf") # 批量下载执行 for (i in seq_along(urls)) { # 提取URL末尾的刊物ID edicao_id <- sub(".*/(\\d+)$", "\\1", urls[i]) # 拼接真实PDF下载地址 pdf_url <- paste0("https://dom-web.pbh.gov.br/edicao/download/", edicao_id) # 构造带合法请求头的请求,绕过防盗链 resp <- request(pdf_url) |> req_headers( Referer = urls[i], `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" ) |> req_perform() # 将二进制内容写入本地文件 writeBin(resp_body_raw(resp), file_names[i]) # 设置请求间隔,避免触发站点反爬 Sys.sleep(1) }
注意事项
- 你当前配置的前两个预览URL对应的刊物ID都是2714,下载得到的会是同一份PDF,如果对应两个不同文件,请核对修正URL配置。
- 如果运行时出现403权限错误,将
Sys.sleep(1)的间隔调整为2-3秒即可。 - 如果后续站点改版修改了下载接口规则,再考虑用RSelenium方案:启动驱动时提前配置Chrome的下载偏好,关闭下载弹窗、指定本地保存路径,页面加载完成后定位下载按钮触发点击即可,不需要额外解析资源地址。
内容的提问来源于stack exchange,提问作者Larissa
相关产品推荐
相关产品推荐

