如何用Python下载无扩展名的文件(Content-Type与流处理)
用Python下载无扩展名的图片(结合Content-Type与流处理)
嘿,我来帮你搞定这个无扩展名图片的下载问题!你提到的Google Books封面URL确实没有后缀,但我们可以通过响应头里的Content-Type字段判断图片格式,再配合流处理来安全高效地保存图片,下面给你详细的实现方案:
核心思路
- 发送HTTP请求时,获取响应头中的
Content-Type(比如image/jpeg、image/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




