影刀RPA实操指南:图片批量下载与自动分类管理
做电商运营、内容运营的同学,经常需要从网页上批量下载图片——商品主图、详情图、素材图、竞品截图。
手动操作就是"右键→另存为→选文件夹→确定",重复几百次。用影刀能把这个过程压缩到 3 分钟。
这篇文章讲清楚:如何从网页批量下载图片、如何自动命名、如何按规则分类存放。
一、下载图片的两种思路
| 思路 | 怎么做 | 适用场景 |
|---|---|---|
| 浏览器模拟点击 | 找到图片→右键→保存 | 图片是页面渲染出来的,URL不好拿 |
| 获取URL直接下载 | 拿到src→HTTP下载 | 图片链接规律明确,一次拿几百张 |
大多数情况下,方案二(获取URL直接下载)更高效。一个 HTTP 请求就能下载一张图,不需要浏览器渲染。
但如果图片是 canvas 画出来的,或者需要登录态才能访问,就只能用方案一。
本文两种方案都讲。
二、方案一:浏览器模拟下载(通用但慢)
# 步骤1:打开图片页面打开网页("https://detail.tmall.com/item.htm?id=xxx")等待元素出现("商品图片区域",5秒)# 步骤2:获取所有缩略图元素列表获取相似元素列表("//div[@class='img-item']/img")->图片列表# 步骤3:创建保存目录(用当天日期)创建文件夹("D:\图片下载\天猫\{今天的日期}")遍历列表(图片列表,当前图片,索引):[video(video-FileSDgq-1781009069464)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]# 点击缩略图,让大图显示点击元素(当前图片)等待(1秒)# 在大图上右键,选"另存为"右键点击元素("大图元素")等待(0.5秒)# 注意:右键菜单是系统级的,影刀不好操作# 更推荐方案二方案一的痛点:右键菜单是浏览器UI,影刀能点到"另存为"但再往下的系统保存对话框,影刀就控制不了了。所以这个方案只在没有更好办法的时候用。
更好的做法:先用方案一拿到图片 URL,再用方案二下载。
三、方案二:获取URL直��下载(推荐)
3.1 找到图片的真实URL
# 步骤1:打开列表页打开网页("https://example.com/products")等待元素出现("商品列表",5秒)# 步骤2:获取所有商品卡片中的图片URL获取相似元素列表("//div[@class='product-card']//img")->图片元素列表 创建文件夹("D:\图片下载\商品图")遍历列表(图片元素列表,当前图片,索引):# 获取图片的 src 属性获取元素属性(当前图片,"src")->图片URL# 跳过空URL如果 图片URL==""或 图片URL==None:继续下一次循环# 通过 Python 下载Python代码:# Python代码块开始importrequestsimportos img_url=变量_图片URL save_dir=r"D:\图片下载\商品图"index=变量_索引# 处理相对URL转绝对URLifimg_url.startswith("//"):img_url="https:"+img_urlelifimg_url.startswith("/"):img_url="https://example.com"+img_url# 提取文件扩展名ext=img_url.split(".")[-1].split("?")[0]ifextnotin["jpg","jpeg","png","gif","webp"]:ext="jpg"filename=f"商品_{index+1}.{ext}"filepath=os.path.join(save_dir,filename)try:headers={"User-Agent":"Mozilla/5.0 ...","Referer":"https://example.com/"}resp=requests.get(img_url,headers=headers,timeout=10)resp.raise_for_status()withopen(filepath,"wb")asf:f.write(resp.content)print(f"下载成功:{filename}")exceptExceptionase:print(f"下载失败:{filename}, 错误:{e}")# Python代码块结束3.2 关键细节
URL 可能是相对路径:
网页里的src经常是//img.example.com/a.jpg或/images/a.jpg,不是完整链接。下载前要补全成https://...。
# 补全URL的逻辑如果 图片URL 以"//"开头:图片URL="https:"+图片URL 否则 如果 图片URL 以"/"开头:图片URL="https://目标域名"+图片URL有些图片是懒加载的:
src可能是占位图,真实图片在data-src或data-original属性里。
# 优先取真实图片属性获取元素属性(当前图片,"data-src")->src1 获取元素属性(当前图片,"data-original")->src2 获取元素属性(当前图片,"src")->src3 真实URL=src1 或 src2 或 src3Referer 防盗链:
有些图片加了 Referer 校验,直接在浏览器外下载会返回 403。需要在请求头里加 Referer。
headers={"Referer":"https://来源页面的域名.com/","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}四、自动命名与分类存储
4.1 按商品名命名
# 图片用商品名+序号命名Python代码:product_name=变量_商品名.replace("/","_").replace("\\","_")filename=f"{product_name}_{index+1}.jpg"必须做文件名安全处理:商品名里可能有/、\、:、*这些 Windows 不允许用在文件名里的字符。
# 文件名安全处理函数defsafe_filename(name):invalid_chars=['/','\\',':','*','?','"','<','>','|']forcininvalid_chars:name=name.replace(c,'_')returnname[:100]# 文件名不要太长4.2 按分类自动建文件夹
# 按商品类目分文件夹Python代码:category=变量_类目# 如 "连衣裙", "T恤", "裤子"save_dir=f"D:\\图片下载\\{category}\\"os.makedirs(save_dir,exist_ok=True)4.3 按采集时间分文件夹
Python代码:fromdatetimeimportdatetime today=datetime.now().strftime("%Y-%m-%d")save_dir=f"D:\\图片下载\\{today}\\"[video(video-vBR0GeuQ-1781009076000)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营?)]os.makedirs(save_dir,exist_ok=True)五、完整实战:拼多多商品主图批量下载
# 拼多多商品主图批量下载完整流程打开网页("https://mobile.yangkeduo.com/search_result.html?search_key=连衣裙")等待元素出现("商品列表",5秒)# 获取所有商品卡片获取相似元素列表("//div[contains(@class,'goods-item')]")->商品列表 创建文件夹("D:\拼多多图片\连衣裙\2026-06-09")遍历列表(商品列表,当前商品,idx):商品名=获取元素文本(当前商品//商品名称区域)图片元素=获取元素(当前商品//img)获取元素属性(图片元素,"src")->URL 如果 URL=="":继续下一次循环# 下载图片Python代码:importrequests,os,re name=变量_商品名[:30]name=re.sub(r'[\\/:*?"<>|]','_',name)url=变量_URLifurl.startswith("//"):url="https:"+url save_path=rf"D:\拼多多图片\连衣裙\2026-06-09\{name}.jpg"headers={"User-Agent":"Mozilla/5.0 ...","Referer":"https://mobile.yangkeduo.com/"}resp=requests.get(url,headers=headers,timeout=15)withopen(save_path,"wb")asf:f.write(resp.content)print(f"[{idx+1}]{name}下载完成")# Python代码块结束输出日志(f"累计下载:{idx+1}个商品,已下载{idx+1}张")六、下载速度控制与防封
控制请求间隔:
# 每下载3张休息1秒,避免触发限流Python代码:importtimeifidx%3==0:time.sleep(1)随机间隔更像人:
Python代码:importtime,random time.sleep(random.uniform(0.5,1.5))# 0.5~1.5秒随机七、易错速查
| 问题 | 原因 | 解决 |
|---|---|---|
| 下载的图片只有1KB | 下了占位图 | 检查data-src/data-original属性 |
| 返回403 | Referer防盗链 | 在请求头里加Referer |
| 文件名保存失败 | 商品名含非法字符 | safe_filename处理 |
| 有些图片跳过了 | src为空 | 先判断URL非空再下载 |
| URL是相对路径 | 没补全协议和域名 | 判断开头补全https:// |
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。