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
相关产品推荐
相关产品推荐

