You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Reddit下载文件无扩展名无法打开问题求助

问题根因

你保存文件时直接将submission.id作为目标文件名,Reddit的提交ID是定长的随机字母数字串,本身不包含任何文件格式标识,所以生成的文件自然没有扩展名,系统无法关联对应的打开程序。
之前脚本运行正常的常见原因有三个:

  • 旧版本脚本里包含了提取文件后缀、拼接文件名的逻辑,你现在贴出的是不完整片段,遗漏了这部分代码
  • 之前爬取的资源类型单一,系统曾手动关联过无后缀文件的默认打开程序,关联失效后就出现了无法打开的问题
  • 之前爬取的URL直接带文件名后缀,当时的代码直接用URL末段作为文件名,改成用submission id命名后没补充后缀逻辑
修复方法
  1. 补全文件名后缀提取逻辑,不要直接用纯ID作为文件名
    推荐优先从资源链接、响应头中提取真实扩展名,兼容不同图床的链接格式,参考修改代码:
    首先导入需要的依赖:
    import mimetypes
    import os
    from urllib.parse import urlparse
    
    替换原脚本中下载保存文件的对应片段:
    save_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)
    
  2. 增加资源类型校验,避免下载无效文件
    submission.url不一定是图片资源,可能是Reddit帖子详情页、外部网页链接,直接保存会得到无法打开的HTML文件,建议加一层判断:
    • 可以通过PRAW自带的submission属性判断是否为图片/视频帖,跳过纯文本、外链帖
    • 也可以判断响应头的content-type是否以image/开头,非图片资源直接跳过
  3. 已保存的无后缀文件修复
    不需要重新爬取,可以直接通过文件头标识判断格式补后缀:
    • 文件头十六进制开头为FF D8 FF:补.jpg后缀
    • 开头为89 50 4E 47:补.png后缀
    • 开头为47 49 46 38:补.gif后缀
    • 开头为52 49 46 46且后续包含WEBP标识:补.webp后缀

内容的提问来源于stack exchange,提问作者jettzeong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:51:22