影刀RPA新手教程商品批量上架实战——淘宝天猫商品信息自动发布一、淘宝千牛卖家后台的结构认知——先搞清楚发布页面的表单长什么样千牛卖家后台的商品发布页面是一个超级表单顶部类目选择、中间商品属性品牌、型号、材质、颜色等几十个字段、然后是标题一口价库存sku设置、接着是主图详情页图片上传、最后是运费模板和服务保障勾选。整个页面从上到下填完至少需要5分钟一个运营一天手工上架30个商品就是极限了。RPA做这件事的思路把Excel里写好的商品信息逐行读取一行就是一个商品循环填入千牛发布页面填完一个提交一个。发布页面入口千牛→商品管理→发布商品。browser.navigate(https://scportal.taobao.com/)进入千牛首页browser.find_by_xpath(//a[contains(text(),商品管理)]).click()进入商品管理再browser.find_by_xpath(//button[contains(text(),发布商品)]).click()。千牛的页面用了大量iframe嵌套发布商品后的表单区域可能在一个新的iframe里。进到发布页面后先用browser.get_html()打印出页面的HTML结构看一眼确认目标元素在主页面还是iframe里——这一步别跳每次千牛改版后iframe结构都可能变化。类目选择是第一个关卡。淘宝有成千上万个类目选择错误后续填写的属性字段完全不同。不是手动点类目树的而是直接搜类目ID或类目关键词browser.find_by_xpath(//input[placeholder搜索类目]).input(连衣裙)输入关键词browser.wait_appear(//div[contains(class,category-search-result)]//li, timeout5)等待搜索结果browser.find_by_xpath(//div[contains(class,category-search-result)]//li[1]).click()选择第一项匹配类目。类目ID比类目名更准确但客户Excel里一般只给类目名不给ID。如果客户给的是名称就用搜索方式如果客户经常批量上架同几个类目建议在Config里维护一个类目名→类目ID的映射表直接用ID跳转比每次搜索稳定。二、表单填写——100个字段按什么顺序填最快千牛发布表单的字段不是固定的选了不同类目后显示的属性字段不同。同一个连衣裙类目有几十个属性品牌、适用季节、材质、裙长、领型、袖长、流行元素、风格……每个字段的类型不同有的是下拉选择品牌、有的是多选流行元素、有的是自由输入货号。处理思路是把Excel的列名和千牛页面的属性标签做映射Excel列名季节对应千牛页面//div[contains(text(),适用季节)]//following-sibling::div//select的下拉选择框。填一个字段的通用逻辑是先定位这个字段的标签元素→判断它的类型输入框/下拉/多选→按对应的方式填入。下拉选择框操作browser.find_by_xpath(//div[contains(text(),品牌)]/following-sibling::div//select).click()然后browser.find_by_xpath(//option[contains(text(), brand )]).click()。这是标准select的套路但千牛的很多下拉不是原生select而是DIV模拟的下拉——点一下弹出一层浮层浮层里是列表。这种情况要先点触发元素打开浮层browser.find_by_xpath(//div[contains(class,brand-selector)]).click()再在浮层里找到选项browser.find_by_xpath(//div[contains(class,dropdown-item) and contains(text(),brand)]).click()最后判断浮层是否关闭某些浮层选完自动关有些不会。浮层不关会挡住后续操作加一句browser.execute_javascript(document.querySelector(.dropdown-layer).style.displaynone)强制隐藏所有浮层——这行JS是救命的。SKU填写是上架流程中复杂度最高的部分。一个商品可能有多个规格颜色红色/蓝色/白色尺码S/M/L/XL 4×312个SKU。Excel里通常这样设计一行一个商品SKU信息用JSON格式存在一个单元格里[{颜色:红色,尺码:S,价格:99,库存:50},...]。流程读取这个JSON字符串json.loads(sku_json)遍历SKU列表逐条填入。千牛的SKU表格是动态生成的先填颜色browser.find_by_xpath(//textarea[contains(placeholder,颜色)]).input(红色\n蓝色\n白色)用换行符分隔多个值。尺码同理。填完后点生成SKU按钮系统自动生成12行的SKU表格。然后逐行填入价格和库存第一行的价格输入框XPath是//input[contains(class,sku-price)][1]库存是//input[contains(class,sku-stock)][1]。注意SKU输入框是动态生成的每次发布不同商品时DOM结构可能不完全一致不要用固定索引[1]改用文本匹配//tr[td[contains(text(),红色)] and td[contains(text(),S)]]//input[contains(class,price)]。三、图片上传——handle_upload_dialog的正解和深坑商品主图和详情页图片上传是发布流程中最容易出错的环节。千牛的上传机制是点击上传区域→弹出Windows文件选择对话框→选择图片文件→确认上传→图片上传到阿里服务器→返回图片URL填入表单。影刀的处理顺序browser.find_by_xpath(//div[contains(class,main-pic-upload)]).click()点击上传区域触发文件选择对话框然后web.handle_upload_dialog(image_path, ok, chrome)处理文件选择对话框自动填入路径并确认。handle_upload_dialog的三个核心参数image_path是完整的文件路径含文件名如D:\taobao_images\product_001_main.jpgok是点击确认按钮也可以用cancel取消chrome是浏览器类型——千牛用的是Chrome内核。这里最大的坑是多图片上传主图需要5张淘宝要求至少1张主图4张附图详情页可能需要上传20-50张图片。每张图片都不能简单地用循环handle_upload_dialog逐个上传因为千牛对图片上传做了异步处理——你上传完第1张它还没处理完你又上传第2张结果第2张覆盖了第1张。正确做法是每上传一张图片等待上传完成标志出现再传下一张。上传完成的标志是图片预览区域出现了你的图片缩略图browser.wait_appear(//div[contains(class,uploaded-image)]//img[ str(index) ], timeout30)等待第N张缩略图出现。图片文件格式千牛支持JPG、PNG、GIF不支持BMP和WEBP。图片大小主图要求800×800以上小于这个尺寸系统会拦截。上传前用Python的PIL库检查图片尺寸from PIL import Image; img Image.open(path); w, h img.size; if w 800 or h 800: log_warning(...)。尺寸不合格的跳过并记录到日志不要在上传时才发现被拦截。图片链接提取的场景如果你不是上传本地图片而是从供应商的数据包中拿到了图片的URL链接需要先下载图片到本地再上传。但不用每张都下载——千牛支持通过网络图片方式粘贴URL直接上传。但这个功能的位置经常变且不是每个版本都有。稳妥做法是import requests; res requests.get(image_url); with open(local_path, wb) as f: f.write(res.content)下载所有图片到本地临时文件夹然后统一上传。上传完成后删除临时文件释放空间一个商品50张图片压缩后也有100-200MB磁盘被撑爆后流程直接崩。四、图片链接获取的JS大法——处理那些src里没有的图片供应商给你的数据包或者竞品采集的数据里图片链接可能不是标准格式。京东详情页的某些图片链接不在src属性里而在CSSbackground-image样式中。影刀里用execute_javascript获取这类隐藏链接在目标图片元素上执行JS代码function(element, input) { var url getComputedStyle(element, null)[background-image]; return url.substr(5, url.length-7); }。getComputedStyle拿到的是计算后的CSS值格式是url(https://xxx.jpg)substr(5, url.length-7)去掉前面的url(和末尾的)拿到裸URL。图片源路径拼接的坑有些页面的图片src只写了相对路径如//img.alicdn.com/xxx.jpg前面没有https:。如果用这个路径直接下载会报协议错误。处理时加判断if image_url.startswith(//): image_url https: image_url。另一个坑是图片URL里有特殊字符空格、中文requests.get()直接请求会400错误。URL编码处理from urllib.parse import quote; image_url quote(image_url, safe/:?)只编码不安全字符保留URL结构符号。批量抓取图片时用获取相似元素列表(web)“指令先手动捕获一张商品图片再通过元素编辑只保留img节点校验通过后可以得到该区域所有图片的元素列表。然后用获取元素属性功能批量提取所有图片的src属性存到列表中。要下特定区域比如只下颜色选择区的小图而不是全页面的图片时先捕获父元素对象比如颜色选择区域的div然后在获取相似元素时勾选关联父元素”这样只获取该父元素下的子图片元素。这个技巧在不用写代码的情况下精准定位下载范围实测效率提高3倍以上。五、提交发布与异常处理——为什么点了发布按钮商品没有上架千牛发布页底部的提交按钮点完之后不是立刻成功而是先走一个校验流程类目属性校验→SKU完整性校验→图片质量校验→价格合理性校验。任何一项没通过都会弹红色提示框。校验的持续时间在3-15秒不等取决于你填了多少字段、图片有多大。点完提交后必须等待校验结果browser.wait_appear(//div[contains(text(),发布成功) or contains(text(),错误)], timeout20)等待成功提示或错误提示。如果20秒后两个都没出现说明页面卡住了千牛的后台请求超时是常见问题截图当前页面然后刷新重来。校验失败的处理分支如果提示品牌与类目不匹配说明客户给的品牌名在千牛的类目可选品牌列表中不存在或者品牌名有空格/标点差异。停止流程把这个商品标记为品牌校验失败继续下一个商品失败的批次最后手动处理。如果提示图片不符合要求大概率是尺寸不够或者格式不对见第三章。如果提示SKU信息不完整大概率是价格或库存字段没填、填了非数字、或者漏填了某个SKU组合。流程里在填SKU数据之前加校验价格和库存必须是整数且大于0检查SKU行数是否等于颜色数×尺码数。提交成功后的确认千牛发布成功后通常会跳转到一个发布成功页面或者弹一个成功提示气泡。在成功页面上提取商品IDbrowser.find_by_xpath(//div[contains(text(),商品ID)]/following-sibling::div).get_text()拿到商品ID存入Excel的上线结果列。商品ID是后续管理修改库存、下架的唯一标识必须记录。一个商品发布完成后回到发布页面初始状态browser.navigate(https://scportal.taobao.com/publish/index.htm)直接重新打开发布页面不清除字段的话下一条数据会覆盖上一条还没提交的数据——这是很多人批量上架一半就乱掉的根因。六、大批量上架的时间控制和风险规避淘宝对短时间大量上架商品的行为有风控机制。一个店铺如果在1小时内连续上架50个商品以上会被系统判定为批量铺货行为可能导致商品搜索降权、店铺扣分。这不是开玩笑的——客户的店铺被降权了你的RPA流程就是罪魁祸首。出速度控制策略每发布3个商品后暂停10-15分钟一天总发布量不超过30个。流程里设一个计数器publish_count每发布3个后调用sleep(600 random.randint(0,300))休息10-15分钟。同时设一个当天的累计数量检查超过30个自动停止并提示今日发布已达上限。如果客户需要一次性上架200个商品比如换季上新用定时上架功能绕过实时发布检测千牛支持设置商品定时上架你先批量提交但设为放入仓库所有商品提交完成后在仓库里统一设置定时上架时间——分批次设置每批10个商品间隔20分钟。这样做既达到了批量上架的目的又不会触发风控。定时上架的具体操作发布页面底部选择放入仓库而非立刻上架商品ID记录后跳转到仓库管理页面browser.navigate(https://scportal.taobao.com/item/manage.htm)用商品ID搜索→选择→批量设置定时上架时间。这个二次操作的流程比直接发布多了3步但在风控面前是必须接受的代价。七、跨平台数据转换——从拼多多/京东商品数据直接搬到淘宝很多客户的真实需求不是从零创建商品而是把我在拼多多上的商品同步到淘宝。这就涉及跨平台数据转换拼多多的商品标题用_分隔关键属性如连衣裙_夏季_碎花_收腰_长袖_S-3XL淘宝要求的是自然语言标题“2024夏季新款碎花收腰连衣裙长袖修身显瘦S-3XL”。标题转换的关键不是格式而是关键词密度——淘宝搜索靠标题关键词匹配直接搬拼多多的下划线标题会被淘宝搜索低权重。处理方案是在Config里维护一个模板拼多多的各个属性项填入标题模板的不同位置生成淘宝标准标题。价格体系不同拼多多是拼单价和单买价淘宝是一口价和到手价。一口价是页面上显示的原价到手价是通过优惠券/满减后的实际价格。一般策略是淘宝一口价设为拼多多价格的120%-150%淘宝用户对价格敏感度低于拼多多到手价和拼多多价格持平。这个换算逻辑要写在流程里让客户确认计算后的价格存到Excel的淘宝一口价和淘宝到手价两列。图片处理拼多多主图通常是800×800淘宝要求800×800以上——800×800是刚好踩线。如果拼多多的图片只有600×600拼多多的最低要求搬到淘宝会被拦截。这种情况要提醒客户重新提供高清图或者用影刀下载后的图片调用缩放工具放大到800×800降本凑合但清晰度会打折。详情页图片一般是横屏图淘宝详情页建议宽度750px。不同平台图片尺寸规范的转换虽然不是纯RPA问题但你要在交付前提醒客户把图片准备好——别等到流程跑起来才有500张图片尺寸不合格。更详细的多平台商品数据转换方案在home.linyan.cloud上有系统的文档和工具。淘宝上架 商品发布 SKU管理 千牛自动化 影刀教程作者林焱