影刀RPA进阶教程:图片批量下载与本地管理——从URL列表到结构化文件夹的完整方案
影刀RPA批量下载图片是电商运营的高频需求。采集了1000条商品数据,每条有5张图片,手动下载完全不现实。本文给出完整的图片批量下载方案,包括文件命名、目录组织、失败重试和去重处理。
作者:林焱 | 影刀RPA进阶系列
为什么不能直接用浏览器"右键保存"
手动右键保存图片的问题:
- 1000张图片右键1000次,不是人干的活
- 文件名全是乱码(hash值),不知道对应哪个商品
- 图片保存位置混乱,找起来靠运气
自动化下载的目标:
- 按商品ID建文件夹
- 图片以"商品ID_序号"命名
- 失败的URL记录到日志,事后补下载
- 已下载的图片不重复下载(断点续传)
拼多多店群自动化上架方案
方案一:直接用 Python requests 下载(推荐)
适合大批量、对速度有要求的场景。
importrequestsimportosimporttimeimportrandomfrompathlibimportPathdefdownload_image(url,save_path,timeout=10):""" 下载单张图片 返回:True/False,False时返回错误信息 """headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Referer':'https://www.xxx.com'# 替换为目标网站的域名}try:response=requests.get(url,headers=headers,timeout=timeout)ifresponse.status_code==200:# 确保目标目录存在Path(save_path).parent.mkdir(parents=True,exist_ok=True)withopen(save_path,'wb')asf:f.write(response.content)# 验证文件大小(小于1KB可能是错误图片)ifos.path.getsize(save_path)<1024:os.remove(save_path)returnFalse,"文件过小,可能是错误图片"returnTrue,Noneelse:returnFalse,f"HTTP{response.status_code}"exceptExceptionase:returnFalse,str(e)批量下载主逻辑
importpandasaspdimportosimporttimeimportrandomdefbatch_download(excel_path,save_dir,delay_range=(0.5,2.0)):""" 从Excel读取URL列表,批量下载图片 Excel格式:商品ID | 图片URL1 | 图片URL2 | 图片URL3 """df=pd.read_excel(excel_path)# 读取已下载记录(断点续传)downloaded_log="downloaded.txt"downloaded_set=set()ifos.path.exists(downloaded_log):withopen(downloaded_log,'r')asf:downloaded_set=set(f.read().splitlines())failed_list=[]success_count=0for_,rowindf.iterrows():product_id=str(row['商品ID'])# 遍历每个图片URL列fori,colinenumerate(['图片URL1','图片URL2','图片URL3'],1):url=str(row.get(col,'')).strip()ifnoturlorurl=='nan':continue# 跳过已下载ifurlindownloaded_set:continue# 构建保存路径ext=url.split('.')[-1].split('?')[0]# 获取扩展名ifext.lower()notin['jpg','jpeg','png','webp','gif']:ext='jpg'filename=f"{product_id}_{i:02d}.{ext}"save_path=os.path.join(save_dir,product_id,filename)# 下载success,error=download_image(url,save_path)ifsuccess:success_count+=1# 记录已下载withopen(downloaded_log,'a')asf:f.write(url+'\n')else:failed_list.append({'商品ID':product_id,'图片序号':i,'URL':url,'错误':error})# 随机延时,避免过快请求time.sleep(random.uniform(*delay_range))# 保存失败列表iffailed_list:pd.DataFrame(failed_list).to_excel("download_failed.xlsx",index=False)print(f"下载完成:成功{success_count}张,失败{len(failed_list)}张")returnsuccess_count,len(failed_list)方案二:用影刀「下载文件」指令(适合少量)
如果图片数量不多(100张以内),直接用影刀内置的下载指令更简单:
循环读取Excel每一行: product_id = 当前行['商品ID'] image_url = 当前行['图片URL'] # 构建文件名 save_name = product_id + "_01.jpg" save_path = 下载目录 + "/" + save_name # 调用内置下载指令 下载文件 URL:image_url 保存路径:save_path # 记录到Excel 写入当前行:下载路径 = save_path 等待随机时间 500-1500ms文件夹结构设计
推荐的目录结构:
downloads/ ├── 2026-06-11/ # 按日期分组(方便找到某天采集的数据) │ ├── P001234/ # 商品ID作为目录名 │ │ ├── P001234_01.jpg # 第1张图 │ │ ├── P001234_02.jpg # 第2张图 │ │ └── P001234_03.jpg # 第3张图 │ └── P001235/ │ └── P001235_01.jpg ├── 2026-06-12/ │ └── ... download_failed.xlsx # 失败记录 downloaded.txt # 已下载URL记录(断点续传用)常见问题
问题:图片下载了但打不开
原因:服务器返回了一个HTML错误页面(如登录跳转)而不是图片。
解决:检查文件大小,小于5KB的大概率不是正常图片;检查文件头,用16进制查看是不是JPEG/PNG魔数。
问题:部分图片403 Forbidden
TEMU店群如何管理运营?
原因:服务器有防盗链,校验Referer头。
解决:在请求头里加上正确的Referer(值为目标网站的域名)。
问题:下载太快被封IP
解决:增大随机延时到 2-5秒,使用代理IP轮换,每批下载完休眠5-10分钟。
小结
批量下载图片的核心要点:
- 断点续传(记录已下载URL,跳过重复)
- 随机延时(模拟人工浏览速度)
- 失败记录(不要默默丢弃,留下来补下载)
- 目录命名有规律(按商品ID/日期,方便后续使用)
内容标签:影刀RPA / 图片下载 / 批量处理 / requests / 断点续传
作者:林焱
本文是「影刀RPA从零到实战」系列文章之一,持续更新实操技巧与避坑经验。