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

R语言download.file()下载PDF文件体积过小问题

问题描述

尝试从ANEEL旧官网经济金融信息中心下载公开PDF文件,使用R语言原生download.file()函数下载得到的文件体积不足100KB,无法正常打开。
当前使用的代码如下:

download.file("https://antigo.aneel.gov.br/web/guest/central-de-informacoes-economico-financeiras?p_auth=BT53Dees&p_p_id=ciefseuser_WAR_ciefseportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=1&_ciefseuser_WAR_ciefseportlet_arquivo=APLPAC0371_D_Celpa_DC_2021_A.pdf&_ciefseuser_WAR_ciefseportlet_javax.portlet.action=downloadFTP",
  "file.pdf", mode = "wb")
排查思路

按优先级依次排查以下问题:

  • 先验证下载得到的小文件实际格式:用文本编辑器直接打开文件,若文件开头为<html>标签而非%PDF-标识,说明下载到的不是目标PDF,是网站返回的错误页/跳转页/拦截页,这是体积异常的核心表现。
  • 检查链接有效性:链接中携带的p_auth是Liferay门户的临时会话授权令牌,有效期仅数分钟,且和当前访问会话绑定,复制后长时间复用、跨会话使用都会直接失效,失效后访问不会返回文件内容。
  • 检查请求合法性:原生download.file()默认使用R自带的请求标识,不会自动携带浏览器常规User-Agent头,也不会自动处理跨页cookie传递,该站点会拦截无合法请求头的访问请求,直接返回拦截页面。
  • 检查参数一致性:给出的目标链接对应文件为APLPAC0383_D_Ampla_DC_2021_A.pdf,但代码中传入的文件参数为APLPAC0371_D_Celpa_DC_2021_A.pdf,参数不匹配也会触发访问错误。
解决方案
  • 优先使用httr包模拟浏览器请求,自动处理跳转、cookie和请求头,稳定性远高于原生download.file(),参考代码如下:
library(httr)
# 注意:每次下载前需从浏览器最新访问页面复制带有效p_auth参数的完整链接
target_url <- "替换为最新获取的有效下载链接"

GET(
  url = target_url,
  # 模拟桌面端Chrome浏览器请求标识,避免被反爬拦截
  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"),
  # 自动跟进302跳转、保留会话cookie
  config(followlocation = TRUE),
  write_disk("target_file.pdf", overwrite = TRUE)
)
  • 若不想引入额外依赖,可先在浏览器中手动触发一次文件下载,从浏览器下载记录中提取已完成鉴权的文件直链,再调用download.file()并保留mode="wb"参数下载即可。
  • 下载完成后先做格式校验:读取文件前10个字节,若包含%PDF-前缀则为有效PDF文件,否则需重新获取有效链接、调整请求配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:15:19