如何从XML feed中导出并批量下载全部JPG格式图片
XML Feed 图片批量下载实现方案
下面提供两种可直接落地的方案,适配不同使用场景:
方案1:Python 实现(适配全平台,容错性强,适合新手)
适合需要自定义逻辑(比如重命名、异常重试、进度展示)的场景,8000张图片的处理压力很小。
前置依赖安装
执行命令安装所需库:
pip install lxml requests tqdm
参考代码
import os import time from lxml import etree import requests from tqdm import tqdm # 配置项 XML_PATH = "你的feed文件路径.xml" SAVE_DIR = "./downloaded_images" REQUEST_INTERVAL = 0.2 # 请求间隔,单位秒,避免触发反爬 MAX_RETRY = 3 os.makedirs(SAVE_DIR, exist_ok=True) # 解析XML提取所有图片链接 tree = etree.parse(XML_PATH) img_urls = tree.xpath("//IMGURL/text()") # 清洗CDATA里的链接,过滤出JPG格式 clean_urls = [] for url in img_urls: stripped = url.strip() if stripped.lower().endswith(".jpg"): clean_urls.append(stripped) print(f"共提取到{len(clean_urls)}张JPG图片") # 批量下载 fail_list = [] for url in tqdm(clean_urls, desc="下载进度"): file_name = url.split("/")[-1] save_path = os.path.join(SAVE_DIR, file_name) # 跳过已下载的文件 if os.path.exists(save_path): continue # 重试逻辑 success = False for _ in range(MAX_RETRY): try: resp = requests.get(url, timeout=10) if resp.status_code == 200: with open(save_path, "wb") as f: f.write(resp.content) success = True break except Exception as e: time.sleep(1) if not success: fail_list.append(url) time.sleep(REQUEST_INTERVAL) # 输出失败的链接方便后续重试 if fail_list: print(f"以下{len(fail_list)}张图片下载失败,可单独重试:") for u in fail_list: print(u)
方案2:Shell 命令行实现(适配Linux/macOS,无需额外编程环境)
适合不想写代码、环境本身支持shell命令的场景,操作更快捷。
- 第一步提取所有JPG链接存为列表文件
# 用xmllint解析XML提取IMGURL内容,过滤出JPG链接 xmllint --xpath '//IMGURL/text()' 你的feed文件路径.xml | grep -oE 'https?://[^[:space:]]+\.jpg' > img_urls.txt
- 第二步批量下载所有图片
# 用wget批量下载,自动跳过重复、失败重试、设置请求间隔 wget -i img_urls.txt -P ./downloaded_images/ --wait=0.2 --random-wait --tries=3 --no-clobber
参数说明:
-i img_urls.txt:从指定文件读取下载链接-P ./downloaded_images/:指定图片保存目录--wait=0.2:请求间隔0.2秒,避免触发反爬--tries=3:单张图片最多重试3次--no-clobber:跳过已下载的文件,避免重复下载浪费带宽
通用注意事项
- 首次运行可以先从提取到的链接里挑10个测试,确认解析逻辑、下载路径、图片完整性都没问题再跑全量任务
- 如果XML文件大小超过1G,Python解析建议用
etree.iterparse渐进式加载,避免一次性加载整个文件导致内存溢出 - 下载失败的链接可以单独整理后再次执行下载,不需要全量重新跑
内容的提问来源于stack exchange,提问作者hajdy
相关产品推荐
相关产品推荐

