Python爬虫怎么爬取PDF文件_使用requests获取内容后保存流
Python爬虫怎么爬取PDF文件_使用requests获取内容后保存流

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
requests.get() 返回的 content 怎么保存为 PDF 文件
这事儿其实很简单,核心就一句话:直接用 response.content 写入二进制文件。PDF本身就是二进制格式,千万别当成文本来处理。新手最容易踩的坑,就是把 response.text 或者经过编码转换的内容写进去,结果生成一堆乱码,或者一个根本打不开的“假PDF”。
具体操作时,记住这几个关键点:
- 务必用
'wb'模式打开文件,那个b代表二进制,绝对不能省。 response.content就是服务器返回的原始字节流,原封不动地写入最安全。- 虽然默认开启,但显式地加上
allow_redirects=True参数会更稳妥,确保能跟随重定向。 - 保存前,先检查
response.status_code == 200。这一步能帮你避免把404错误页面当成PDF存下来的尴尬。
import requests
r = requests.get('https://example.com/doc.pdf')
if r.status_code == 200:
with open('output.pdf', 'wb') as f:
f.write(r.content)
怎么判断响应确实是 PDF 而不是网页或错误页
光看URL的后缀名?那可太不保险了。有些服务的下载链接长得像 /download?id=123,但返回的却是正经PDF;反过来,有些链接以 .pdf 结尾,实际却返回一个要求登录的HTML页面。要准确识别,得靠双重验证:响应头加文件头。
- 第一重,检查响应头:
r.headers.get('content-type')里是否包含'application/pdf'(比对时忽略大小写更安全)。 - 第二重,检查文件头:标准的PDF文件,其前4个字节固定是
%PDF。用r.content[:4] == b'%PDF'可以快速验证。 - 如果这两条都不满足,那基本可以断定不是PDF。这时候,建议把
r.url(最终请求的URL)和r.status_code打印出来,排查一下是不是发生了重定向或者跳转到了其他页面。
大 PDF 文件下载中断怎么办:用 stream=True 配合 iter_content
直接读取 .content 会把整个文件一股脑儿全加载到内存里。对付小文件没问题,但遇到几百MB甚至更大的PDF,内存溢出(OOM)的风险就大大增加,而且网络一旦中断就得从头再来。流式下载才是解决之道,既能控制内存占用,也为实现断点续传提供了可能。
- 关键一步:必须在请求时加上
stream=True参数,否则后续的iter_content()将不起作用。 - 循环写入:使用
iter_content(chunk_size=8192)来分块读取数据,每次8KB是个比较通用的选择。块太小会增加I/O次数,块太大则失去了分块的意义。 - 关于断点续传:如果想实现更高级的断点续传功能,可以用
'ab'(追加二进制)模式写入文件,但这需要你自己管理已经下载的字节数,并在下次请求时通过Range请求头告诉服务器从哪里开始。
r = requests.get('https://big-file.pdf', stream=True)
with open('large.pdf', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
if chunk: # 过滤 keep-alive 空块
f.write(chunk)
为什么保存后 PDF 打不开:常见陷阱汇总
代码明明没错,保存也显示成功,可文件就是打不开——这种问题最让人头疼。往往不是语法错误,而是环境或服务端的“隐形”行为导致的。下面这些陷阱,每一个都可能让你卡上半天。
立即学习“Python免费学习笔记(深入)”;
- 网站反爬机制:服务器返回状态码200,但内容却是Ja vaScript渲染的页面、验证码图片或者一段提示语。这时候检查
content[:4],肯定不是b'%PDF'。 - 请求头缺失:部分提供PDF的接口会校验
User-Agent(用户袋里)或Referer(来源页)等请求头。如果你的请求头太简单或者缺失,可能会收到403禁止访问的响应,或者一个空白的回复。 - HTTPS证书问题:在内网环境或使用自签名证书的网站上下载,
requests库默认的SSL证书验证会失败。临时解决方案是添加verify=False参数(仅限测试环境),生产环境则应正确配置证书路径。 - 响应内容被压缩:如果响应头里包含
Content-Encoding: gzip,说明数据在传输中被压缩了。好消息是,requests默认会自动解压,所以你拿到的.content已经是解压后的数据,千万别再手动去调用gzip.decompress()了,那会画蛇添足。
最麻烦的情况,是程序没有任何报错,文件也成功保存了,但双击就是无法打开。遇到这种问题,最好的办法就是回头去检查原始响应:看看 response.content 的前几十个字节到底是什么,再仔细核对一遍 response.headers 里的信息,线索往往就藏在这里面。
相关攻略
Python怎么将多个特征处理步骤组合_FeatureUnion合并多种提取器 FeatureUnion 在 scikit-learn 中早已被弃用 先说一个明确的结论:FeatureUnion 这个工具,从 scikit-learn 1 2 版本开始就被官方标记为弃用(deprecated)了。如
Python如何监听全局键盘按键实现自动化快捷键触发 你是否希望在Python中设置一个全局快捷键?例如,无论你当前正在编辑文档、浏览网页还是运行游戏,只需按下Ctrl+Shift+X这样的组合键,就能自动执行预设的自动化任务。这个需求听起来直观,但在实际开发中,会面临跨平台兼容性、系统权限以及逻辑
Python分组去重计数:掌握nunique()函数,提升数据分析效率 在数据分析工作中,按组统计唯一值数量是一项常见且关键的任务。例如,分析每个产品类别下的独立访客数,或计算每个销售区域每年上架的不同商品种类。此时,pandas库中的nunique()函数便成为高效解决此类问题的首选工具。 nun
Tesseract OCR 识别失败的核心原因在于输入图像质量不佳且缺乏针对性预处理。必须进行二值化、形态学去噪、倾斜校正等操作,并配合使用 --psm 8 参数和字符白名单;通过 Python 调用时需显式传递配置参数,在 Windows 系统上还需指定 tesseract_cmd 路径;调试过程
Python对象销毁机制详解:__del__析构函数与垃圾回收的正确使用 Python中__del__方法的局限性:为何它不是可靠的销毁钩子 需要明确的是,Python的__del__方法**无法保证一定会被执行**,因此不适合用于释放文件句柄、网络连接或数据库事务等关键系统资源。它仅仅是CPyth
热门专题
热门推荐
商业帝国大亨:一款点击就能征服宇宙的财富游戏? 近期,手游圈的目光似乎被一款名为《商业帝国大亨》的新作吸引了。不少玩家都在询问:这款游戏到底好不好玩?值不值得投入时间?今天,我们就来深入剖析一下它的玩法核心与特色,看看它能否满足你对“商业帝国”的想象。 1 核心玩法评析:从点击屏幕到宇宙财团 如果
异环一咖舍店铺装修方案分享:店铺经营怎么装修 在《异环》的世界里,经营自己的店铺无疑是件充满乐趣的事。看着人气攀升、收入增长,那份成就感不言而喻。不过,很多新手玩家容易踏入一个误区:一上来就冲着最华丽的摆件去,结果投入巨大,收益提升却未必理想。今天,我们就来聊聊如何用最精明的策略,搞定你的“一咖舍”
鸣潮3 3版本声骸管理方案推荐 随着鸣潮3 3版本的到来,一次全面的声骸系统更新在所难免。特别是针对那些拥有特殊机制的角色,如何高效管理你的声骸库存,成了不少指挥官当前的头等大事。好消息是,新版本支持通过方案码一键导入配置,这无疑大大提升了效率。那么,当前版本有哪些值得关注的方案,又该如何灵活运用呢
梦幻西游神木林175级装备搭配推荐 先来看头盔的选择。这是一件130级的罗汉金钟男头,套装点化成了蜃气妖,并且打上了13锻月亮石。对于神木林这样的法系门派来说,蜃气妖套能直接提升灵力,是核心选择之一。而罗汉金钟这个特技,在高端任务和PK中的重要性不言而喻,关键时刻一个罗汉,往往能扭转战局。用高锻数的
梦幻西游魔王寨175装备搭配推荐 先来看头盔的选择。一件160级附带光辉之甲特技、且激活了长眉灵猴套装效果的头盔,无疑是法系门派的上乘之选。更难得的是,它还额外附加了4 58%的法术暴击伤害属性。为了最大化生存能力,这颗头盔被打上了16锻月亮石,将防御堆砌到了一个相当可观的程度。对于追求极致输出的魔





