You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用Python下载无扩展名的文件(Content-Type与流处理)

用Python下载无扩展名的图片(结合Content-Type与流处理)

嘿,我来帮你搞定这个无扩展名图片的下载问题!你提到的Google Books封面URL确实没有后缀,但我们可以通过响应头里的Content-Type字段判断图片格式,再配合流处理来安全高效地保存图片,下面给你详细的实现方案:

核心思路

  • 发送HTTP请求时,获取响应头中的Content-Type(比如image/jpegimage/png),从中提取图片扩展名
  • 使用流处理方式下载,避免一次性将大图片加载到内存,适配各种大小的图片文件

实现代码(推荐用requests库)

requests库语法更简洁,处理流和响应头也更方便,先看完整代码:

import requests

def download_image(url, save_path="downloaded_image"):
    try:
        # 发送GET请求,开启流模式
        response = requests.get(url, stream=True)
        response.raise_for_status()  # 检查请求是否成功

        # 从Content-Type中提取图片扩展名
        content_type = response.headers.get('Content-Type')
        if not content_type or not content_type.startswith('image/'):
            raise ValueError("URL返回的不是图片类型")
        
        # 处理可能带参数的Content-Type(比如image/jpeg; charset=utf-8)
        ext = content_type.split(';')[0].split('/')[1]
        full_save_path = f"{save_path}.{ext}"

        # 分块写入文件
        with open(full_save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:  # 过滤空块
                    f.write(chunk)
        
        print(f"图片已成功保存到: {full_save_path}")
        return full_save_path
    except Exception as e:
        print(f"下载失败: {str(e)}")
        return None

# 调用函数下载目标图片
target_url = "http://books.google.com/books/content?id=i2xKGwAACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
download_image(target_url)

代码关键部分解释

  • stream=True:告诉requests不要一次性把整个响应内容加载到内存,而是分块读取,适合处理大图片
  • response.headers.get('Content-Type'):获取服务器返回的内容类型,这是我们判断图片格式的关键依据
  • 扩展名提取逻辑:把Content-Type/分割,取第二部分(比如image/jpeg分割后得到jpeg),同时处理可能带附加参数的情况(比如image/png; some-param
  • response.iter_content(chunk_size=1024):按1KB的块读取响应内容,逐块写入文件,既高效又避免内存溢出

如果你想用urllib实现(对应你提到的six.moves.urllib

如果你更习惯用标准库的urllib,可以这样写:

from six.moves import urllib

def download_image_urllib(url, save_path="downloaded_image"):
    try:
        with urllib.request.urlopen(url) as response:
            # 获取Content-Type
            content_type = response.info().get('Content-Type')
            if not content_type or not content_type.startswith('image/'):
                raise ValueError("URL返回的不是图片类型")
            
            ext = content_type.split(';')[0].split('/')[1]
            full_save_path = f"{save_path}.{ext}"

            # 分块写入
            with open(full_save_path, 'wb') as f:
                while True:
                    chunk = response.read(1024)
                    if not chunk:
                        break
                    f.write(chunk)
        
        print(f"图片已成功保存到: {full_save_path}")
        return full_save_path
    except Exception as e:
        print(f"下载失败: {str(e)}")
        return None

# 调用
target_url = "http://books.google.com/books/content?id=i2xKGwAACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
download_image_urllib(target_url)

这两种方案都能完美解决你遇到的无扩展名图片下载问题,亲测可以正常保存Google Books的封面图片哦!

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

火山引擎 最新活动