使用Python下载图片异常求助:部分图片格式无效
问题分析与修复方案
你的代码出现下载不稳定、生成无效图片的问题,核心原因有以下几点:
- 未校验HTTP请求结果:调用
requests.get后直接读取内容,哪怕服务器返回403(拒绝访问)、404(资源不存在)等错误,都会把错误页面的HTML写入文件,导致生成"无效格式图片"。 - 用集合存储URL:集合是无序结构,每次遍历顺序都不固定,不仅会让图片编号和URL对应关系混乱,还可能在有重复URL时自动去重,影响下载完整性。
- 缺少合法请求头:维基媒体的服务器会拦截不带
User-Agent的请求,直接返回错误,这是下载失败的主要原因之一。 - 异常处理变量名错误:捕获异常时打印的
UrlImmagine是大写开头,和循环变量urlImmagine不一致,会触发NameError,导致错误信息无法正常输出。 - 扩展名提取不严谨:直接用
split('.')[-1]取扩展名,如果URL带查询参数(比如xxx.jpg?param=1),会把参数部分当成扩展名,导致文件格式错误。
修正后的代码
import requests import os from requests.exceptions import RequestException # 改用列表存储URL,保证遍历顺序稳定 urls = [ 'https://upload.wikimedia.org/wikipedia/it/c/c0/2_%E2%82%AC_commemorativo_Italia_2004.png', 'https://upload.wikimedia.org/wikipedia/it/d/db/2_%E2%82%AC_commemorativo_Austria_2005.png', 'https://upload.wikimedia.org/wikipedia/it/b/b4/2_%E2%82%AC_commemorativo_Finlandia_2004.jpg', 'https://upload.wikimedia.org/wikipedia/it/e/ed/2_%E2%82%AC_commemorativo_Belgio_2005.jpg' ] def scarica(urlImmagini): folder = 'Coins' os.makedirs(folder, exist_ok=True) # 设置请求头,模拟浏览器请求,避免被服务器拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } for indice, urlImmagine in enumerate(urlImmagini, start=1): try: # 发送请求并主动检查状态码,非200则抛出异常 response = requests.get(urlImmagine, allow_redirects=True, headers=headers) response.raise_for_status() # 先移除URL中的查询参数,再提取扩展名 url_clean = urlImmagine.split('?')[0] ext = url_clean.split('.')[-1].lower() # 过滤非图片扩展名,避免生成无效文件 if ext not in ['png', 'jpg', 'jpeg']: print(f"URL {urlImmagine} 扩展名无效,跳过下载") continue nome = f"foto_{indice}.{ext}" nomeConDir = os.path.join(folder, nome) with open(nomeConDir, 'wb') as handler: handler.write(response.content) print(f"成功下载: {nomeConDir}") except RequestException as e: # 修正变量名大小写,确保错误信息正常输出 print(f"下载图片 {urlImmagine} 时出错: {e}") def main(): scarica(urls) if __name__ == "__main__": main()
关键修复说明
- URL存储改为列表:保证每次遍历顺序一致,便于追踪每个URL的下载状态。
- 添加请求头:模拟浏览器发送请求,避免被维基媒体服务器拦截。
- 校验请求状态:用
response.raise_for_status()确保只有成功请求才会写入文件,避免生成无效内容。 - 修正异常变量名:统一变量名大小写,避免错误信息输出失败。
- 优化扩展名提取:先处理URL中的查询参数,再限制合法图片格式,避免生成错误格式的文件。
- 添加下载状态提示:方便你直观确认每个图片的下载结果。
内容的提问来源于stack exchange,提问作者ZenoKosini
相关产品推荐
相关产品推荐

