如何在rvest已认证会话中下载PDF文件
解决方案
问题原因
download.file() 是独立发起HTTP请求的函数,不会共享rvest会话中存储的登录态Cookie、身份校验头等信息,因此会被服务器判定为未登录请求,返回登录页HTML。而你调用session_submit()后返回的会话对象已经包含了完整的PDF二进制响应数据,不需要重复发起下载请求。
修复后的代码
# 登录DLG档案库 login <- "https://dlgarchiv.lv.de/pdf/616694ca9b67fDLG_14-19_10_2021.pdf" pgsession <- session(login) pgform <- html_form(pgsession)[[1]] filled_form <- html_form_set(pgform, customerno="*******", plz="*****") # 接收提交表单后返回的会话对象,该对象已包含PDF资源 pdf_session <- session_submit(filled_form) # 直接从会话中提取二进制内容写入本地文件 writeBin(pdf_session$content, con = "test.pdf", useBytes = TRUE)
扩展用法(同会话多文件下载)
如果需要在同一个登录会话中下载多个PDF,不需要重复登录,直接复用已验证的会话发起请求即可:
# 示例:下载同一会话下的第二个PDF second_pdf_url <- "第二个PDF的资源链接" second_pdf_session <- session_jump_to(pdf_session, second_pdf_url) writeBin(second_pdf_session$content, con = "second.pdf", useBytes = TRUE)
注意事项
- 写入文件后如果无法正常打开PDF,可先打印
pdf_session$response$headers$content-type``校验返回内容类型,确认是application/pdf再存储。 - 会话存在有效期限制,批量下载时不要间隔太久,避免登录态失效。
内容的提问来源于stack exchange,提问作者zielonygrzyb
相关产品推荐
相关产品推荐

