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

使用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()

关键修复说明

  1. URL存储改为列表:保证每次遍历顺序一致,便于追踪每个URL的下载状态。
  2. 添加请求头:模拟浏览器发送请求,避免被维基媒体服务器拦截。
  3. 校验请求状态:用response.raise_for_status()确保只有成功请求才会写入文件,避免生成无效内容。
  4. 修正异常变量名:统一变量名大小写,避免错误信息输出失败。
  5. 优化扩展名提取:先处理URL中的查询参数,再限制合法图片格式,避免生成错误格式的文件。
  6. 添加下载状态提示:方便你直观确认每个图片的下载结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:41:07