Python爬取Reddit下载文件无扩展名无法打开问题求助
问题根因
你保存文件时直接将submission.id作为目标文件名,Reddit的提交ID是定长的随机字母数字串,本身不包含任何文件格式标识,所以生成的文件自然没有扩展名,系统无法关联对应的打开程序。
之前脚本运行正常的常见原因有三个:
- 旧版本脚本里包含了提取文件后缀、拼接文件名的逻辑,你现在贴出的是不完整片段,遗漏了这部分代码
- 之前爬取的资源类型单一,系统曾手动关联过无后缀文件的默认打开程序,关联失效后就出现了无法打开的问题
- 之前爬取的URL直接带文件名后缀,当时的代码直接用URL末段作为文件名,改成用submission id命名后没补充后缀逻辑
修复方法
- 补全文件名后缀提取逻辑,不要直接用纯ID作为文件名
推荐优先从资源链接、响应头中提取真实扩展名,兼容不同图床的链接格式,参考修改代码:
首先导入需要的依赖:
替换原脚本中下载保存文件的对应片段:import mimetypes import os from urllib.parse import urlparsesave_id(submission.id) save_to_dict(id = submission.id, txt = submission.title) # 请求资源,同时拿到响应头用来判断文件类型 resp = requests.get(submission.url, timeout=10) img_data = resp.content # 第一步从URL路径提取后缀 url_path = urlparse(submission.url).path file_ext = os.path.splitext(url_path)[1].lower() # URL里没取到后缀的话,从响应的Content-Type推断 if not file_ext: content_type = resp.headers.get('content-type', '').split(';')[0].strip() file_ext = mimetypes.guess_extension(content_type) or '.jpg' # 兜底默认用jpg后缀 # 拼接完整文件名 save_path = f"{submission.id}{file_ext}" with open(save_path, 'wb') as handler: handler.write(img_data) print(submission.url, save_path) - 增加资源类型校验,避免下载无效文件
submission.url不一定是图片资源,可能是Reddit帖子详情页、外部网页链接,直接保存会得到无法打开的HTML文件,建议加一层判断:- 可以通过PRAW自带的submission属性判断是否为图片/视频帖,跳过纯文本、外链帖
- 也可以判断响应头的
content-type是否以image/开头,非图片资源直接跳过
- 已保存的无后缀文件修复
不需要重新爬取,可以直接通过文件头标识判断格式补后缀:- 文件头十六进制开头为
FF D8 FF:补.jpg后缀 - 开头为
89 50 4E 47:补.png后缀 - 开头为
47 49 46 38:补.gif后缀 - 开头为
52 49 46 46且后续包含WEBP标识:补.webp后缀
- 文件头十六进制开头为
内容的提问来源于stack exchange,提问作者jettzeong
相关产品推荐
相关产品推荐

