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

如何用Python批量下载图片URL?现有代码执行报错求助

批量下载Lexica图片的Python代码修复方案

问题背景

拥有数百万条Lexica图片URL,示例如下:

1) https://image.lexica.art/md/dbbb96f1-fce2-4970-ab62-b4b4e6859fe9
2) https://image.lexica.art/md/76318f25-5736-4cda-965d-96fe34823263
3) https://image.lexica.art/md/c11dd279-757e-43ff-8305-43e106f6c345
4) https://image.lexica.art/md/f38d92bb-99bc-4611-938f-c5d6cc70d6ea

尝试用以下Python代码批量下载但失败:

url = 'https://image.lexica.art/md/76318f25-5736-4cda-965d-96fe34823263'
folder_path = 'images_artistics'
file_name = url.split('/')[-1][:-4]

image_content = requests.get(url).content
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
file_path = os.path.join(folder_path, file_name)
f = open(file_path, 'wb')
image.save(f, "JPEG", quality=85)
print(f"SAVED - {url} - AT: {file_path}")

报错信息(翻译自截图):

PIL.UnidentifiedImageError: 无法识别图片文件 <_io.BytesIO object at 0x00000213D7D70D30>

错误原因

  • 文件名处理错误:原代码中url.split('/')[-1][:-4]会截断UUID的最后4个字符,且未添加图片后缀,导致文件格式异常。
  • 请求头缺失:直接用requests.get请求易被网站拦截,返回非图片数据,PIL无法识别。
  • 文件夹未预创建:目标文件夹不存在时,保存文件会直接报错。
  • 无容错机制:单条URL下载失败会导致整个程序终止,不适合批量任务。

修复后的代码

import os
import requests
from PIL import Image
import io
from urllib.parse import urlparse

def download_lexica_image(url, folder_path='images_artistics'):
    # 自动创建目标文件夹
    os.makedirs(folder_path, exist_ok=True)
    
    # 生成正确的文件名:UUID + .jpg后缀
    parsed_url = urlparse(url)
    file_name = os.path.basename(parsed_url.path) + '.jpg'
    file_path = os.path.join(folder_path, file_name)
    
    # 跳过已存在的文件,避免重复下载
    if os.path.exists(file_path):
        print(f"已存在 - {url} - 跳过")
        return
    
    # 模拟浏览器请求头,降低被拦截概率
    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'
    }
    
    try:
        # 发送带超时的请求,检查响应状态
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        
        # 打开并保存图片
        with Image.open(io.BytesIO(response.content)).convert('RGB') as img:
            img.save(file_path, "JPEG", quality=85)
        print(f"已保存 - {url} - 路径: {file_path}")
    except Exception as e:
        print(f"下载失败 - {url} - 错误: {str(e)}")

# 批量下载示例
url_list = [
    'https://image.lexica.art/md/dbbb96f1-fce2-4970-ab62-b4b4e6859fe9',
    'https://image.lexica.art/md/76318f25-5736-4cda-965d-96fe34823263',
    'https://image.lexica.art/md/c11dd279-757e-43ff-8305-43e106f6c345',
    'https://image.lexica.art/md/f38d92bb-99bc-4611-938f-c5d6cc70d6ea'
]

for url in url_list:
    download_lexica_image(url)

代码改进说明

  • 正确生成带后缀的文件名,避免格式错误
  • 添加浏览器请求头,减少被网站拦截的可能
  • 自动创建目标文件夹,无需手动预处理
  • 跳过已下载文件,提升批量任务效率
  • 加入异常捕获和超时设置,确保程序稳定运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:15:50