如何用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
相关产品推荐
相关产品推荐

