使用httr/httr2无法获取目标PDF,浏览器可打开求解决方案
解决R语言httr/httr2获取目标PDF的问题
核心原因
服务器返回HTML而非PDF,基本是因为请求头不匹配浏览器标准(比如缺少浏览器标识),或是需要携带会话Cookie——浏览器访问时会自动维护会话状态,而直接发送GET请求没有这些上下文信息。
可行解决方案
1. 模拟浏览器请求头(httr版)
给请求添加浏览器的User-Agent等关键头信息,让服务器识别为合法浏览器访问:
library(httr) url1 <- "https://processo.stj.jus.br/processo/dj/documento/?=&sequencial=300060606&num_registro=202500087810&data=20250313&data_pesquisa=20250313&componente=MON" # 复制Chrome浏览器的请求头信息 browser_headers <- add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", `Accept` = "application/pdf, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", `Accept-Language` = "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7" ) response <- GET(url1, browser_headers) # 检查响应类型并保存PDF if (grepl("application/pdf", response$headers$`content-type`)) { writeBin(content(response, "raw"), "alvo.pdf") cat("PDF已成功保存为alvo.pdf\n") } else { cat("仍返回HTML,建议尝试会话Cookie方案\n") }
2. 先获取会话Cookie再请求(httr版)
部分网站需要先建立会话再请求文档,用session对象自动维护Cookie:
library(httr) # 创建会话,自动处理Cookie stj_session <- session() # 先访问STJ主页初始化会话 stj_session <- session_jump_to(stj_session, "https://www.stj.jus.br/") # 用会话请求目标PDF response <- session_jump_to(stj_session, url1) # 保存PDF if (grepl("application/pdf", response$response$headers$`content-type`)) { writeBin(content(response$response, "raw"), "alvo.pdf") cat("PDF已保存\n") } else { cat("返回内容类型:", response$response$headers$`content-type`, "\n") }
3. httr2实现方案
httr2语法更简洁,同样需要模拟浏览器头:
library(httr2) url1 <- "https://processo.stj.jus.br/processo/dj/documento/?=&sequencial=300060606&num_registro=202500087810&data=20250313&data_pesquisa=20250313&componente=MON" # 构建请求并执行 resp <- request(url1) %>% req_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", `Accept` = "application/pdf,*/*;q=0.9" ) %>% req_perform() # 保存到本地 resp_body_raw(resp) %>% writeBin("alvo.pdf") cat("PDF文件已生成\n")
额外提示
如果以上方法仍失败,打开浏览器开发者工具的Network面板,复制浏览器请求该PDF时的全部请求头,完全照搬进代码里即可。同时注意遵守网站使用规则,避免频繁请求导致IP被封禁。
内容的提问来源于stack exchange,提问作者José
相关产品推荐
相关产品推荐

