影刀RPA新手教程:农业电商自动化完全指南——农产品平台上架、订单处理与物流跟踪
我老家的亲戚做农产品电商,在拼多多、淘宝、抖音三个平台卖家乡的脐橙和红薯粉。最忙的季节每天接几百单,一家人从早到晚趴在电脑前回复客服、打单发货、更新库存。我过年回去看到这状况,花了两天时间用影刀RPA给他们搭了一套自动化流程,接单、打单、发物流信息、库存同步全都自动化了。第二天他告诉我:“这个软件,比请两个员工还管用。”
这篇文章就以农产品电商的完整运营流程为案例主线,从商品上架到订单处理到物流跟踪,带你系统掌握影刀RPA。
一、认识影刀与安装
上影刀官网下载社区版安装包,双击安装。装完记得装浏览器插件。农产品电商常用的是拼多多商家后台、淘宝千牛、抖音商家后台,都是网页系统,所有操作都依赖浏览器插件。
我第一个坑:千牛后台登录后,影刀浏览器插件自动获取的网页对象找不到千牛的页面。原因是千牛有自己的独立窗口,不是常规浏览器标签页。解决办法是用"获取已打开的网页对象"指令,通过窗口标题匹配来找千牛的窗口。
二、元素定位四合一:XPath + CSS + 正则
电商后台的页面结构:左侧导航菜单 + 中间数据表格 + 右侧操作面板。元素密集,需要精准定位。
// 定位"发布商品"按钮 //button[contains(text(),'发布商品')] // 定位商品标题输入框 //input[@placeholder='请输入商品标题'] // 定位价格输入框 //input[@class='price-input'] // 定位库存输入框(数量) //input[@name='stock'] // 定位订单列表的每一行 //table[@class='order-table']//tr[contains(@class,'order-row')] // 定位"待发货"状态的订单 //td[contains(text(),'待发货')]/parent::tr // 按订单号定位 //td[contains(text(),'240624001')]/parent::tr/* CSS等价定位 */button:contains("发布商品")input[placeholder*="商品标题"] input.price-input input[name="stock"] tr.order-rowtr:has(td:contains("待发货"))大部分电商后台用CSS就够了,但要找"包含待发货文本那一行"这种需求,CSS的:has()部分浏览器不支持,还是得用XPath。
正则处理电商数据:
importre# 提取订单金额text="实付金额:¥39.90"amount=re.search(r'¥([\d.]+)',text).group(1)# 39.90# 提取手机号text="收货人:张三 13812345678"phone=re.search(r'1[3-9]\d{9}',text).group()# 从商品标题提取规格title="正宗赣南脐橙 5斤装 中果 新鲜水果包邮"spec=re.search(r'(\d+斤装)',title).group(1)# 5斤装# 提取快递单号text="申通快递:7730123456789"tracking_no=re.search(r'(\d{12,15})',text).group(1)我当时在提取规格时掉过一个坑:有的商品标题写"5斤装",有的写"5斤/箱",还有的写"净重5斤"。正则如果只匹配"5斤装"就会漏掉后两种。改成r'(\d+)斤'只匹配"数字+斤"部分,三种都能抓到。
三、变量与数据类型
拼多多店群自动化报活动上架!
# 数字——价格、库存、订单数unit_price=39.90stock=500total_orders=0# 字符串——商品信息product_title="正宗赣南脐橙 5斤装 中果 新鲜水果包邮"tracking_no="7730123456789"# 列表——批量订单orders=[{"订单号":"240624001","商品":"脐橙5斤装","数量":2,"金额":79.80},{"订单号":"240624002","商品":"红薯粉3斤装","数量":1,"金额":29.90}]# 字典——商品完整信息product={"标题":product_title,"类目":"生鲜水果 > 橙类","价格":39.90,"库存":500,"规格":"5斤装","运费模板":"全国包邮","主图路径":"D:\\商品图片\\脐橙主图.jpg","详情图路径":"D:\\商品图片\\脐橙详情.jpg"}# JSON——API对接resp=json.loads(response.text)order_list=resp["data"]["orderList"]四、流程控制
# For循环——批量上架商品products=load_product_list_from_excel("商品上架清单.xlsx")forproductinproducts:# 打开发布页面web.find("#publishBtn").click()# 填写商品信息fill_product_form(product)# 提交web.find("#submitBtn").click()time.sleep(2)# 相似元素循环——遍历待发货订单order_rows=web.find_all("tr.order-row")forrowinorder_rows:status=row.find("td.order-status").textifstatus=="待发货":order_no=row.find("td.order-no").text buyer_info=row.find("td.buyer-info").text to_ship.append({"订单号":order_no,"买家":buyer_info})# While循环——翻页处理全部订单whileTrue:process_current_page_orders()# 判断是否有下一页try:next_btn=web.find("li.next-page:not(.disabled)")next_btn.click()time.sleep(2)except:break# 没有下一页了# 异常处理——防止个别商品上架失败中断流程try:fill_product_form(product)web.find("#submitBtn").click()exceptExceptionase:print(f"商品{product['标题']}上架失败:{e}")failed_products.append(product)continue五、网页自动化
等待策略:
电商后台数据加载慢是常态。用"等待元素出现"而不是固定等待,能适应网络波动。我的实践经验:等订单表格出现设置为15秒超时,等详情弹窗出现设置10秒超时。
弹窗处理:
电商后台的弹窗很密集:登录过期弹窗、活动推荐弹窗、系统公告弹窗、确认发货弹窗。建议写一个通用的弹窗关闭函数:
defclose_all_popups():close_selectors=["div.popup-close","button.dialog-close","span.close-icon","div.announcement-modal .close-btn"]forselectorinclose_selectors:try:btn=web.find(selector,timeout=2)ifbtn.exists():btn.click()print(f"关闭弹窗:{selector}")except:continue翻页处理:
待发货订单可能有很多页,用class判断最后一页:
next_btn=web.find("li.pagination-next")class_attr=next_btn.get_attribute("class")if"disabled"inclass_attr:# 最后一页print("已到最后一页")break六、数据处理
# Excel——读取商品上架清单importopenpyxl wb=openpyxl.load_workbook("商品上架清单.xlsx")ws=wb.active products=[]forrowinrange(2,ws.max_row+1):products.append({"标题":ws.cell(row,1).value,"类目":ws.cell(row,2).value,"价格":ws.cell(row,3).value,"库存":ws.cell(row,4).value,"规格":ws.cell(row,5).value,"主图路径":ws.cell(row,6).value,"详情图路径":ws.cell(row,7).value})# 写入订单发货汇总wb_out=openpyxl.Workbook()ws_out=wb_out.active ws_out.append(["订单号","商品","买家","快递公司","快递单号","发货时间"])fororderinshipped_orders:ws_out.append([order["订单号"],order["商品"],order["买家"],order["快递"],order["单号"],order["发货时间"]])wb_out.save("发货记录_20240624.xlsx")# 数据库——订单历史存储importsqlite3 conn=sqlite3.connect("farm_shop.db")cursor=conn.cursor()cursor.execute("""CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_no TEXT UNIQUE, product TEXT, buyer TEXT, amount REAL, status TEXT, shipped_at TEXT, tracking_no TEXT )""")cursor.executemany("INSERT OR IGNORE INTO orders VALUES (NULL, ?, ?, ?, ?, ?, ?, ?)",batch_orders)conn.commit()conn.close()数据库五个报错:database is locked(SQLite单写锁,加WAL模式或重试)、no such column(字段名打错了)、UNIQUE constraint failed(改用INSERT OR IGNORE)、out of memory(数据太大分批插入)、disk I/O error(磁盘满了)。
七、鼠标键盘图像自动化
商品主图上传在有些平台上不能用元素定位驱动(安全限制),用图像识别+键盘输入代替:
# 点击"上传图片"区域image.click("上传图片区域.png")# 在弹出的文件对话框中输入图片路径keyboard.send_keys("D:\\商品图片\\脐橙主图.jpg")keyboard.send_keys("{ENTER}")# 等待上传完成(图片出现)image.wait_appear("上传成功标识.png",timeout=30)图像识别的锚点九位置:左上、中上、右上、左中、正中、右中、左下、中下、右下。灵活偏移可以定位到图片区域的任何位置:
# 点击图片中心偏右80像素处image.click("上传区域.png",offset_x=80,offset_y=0)八、进阶技能
HTTP请求直连电商平台API:
importrequests# 拼多多开放平台API获取订单列表headers={"Content-Type":"application/json","client-id":"your_client_id","access-token":"your_access_token"}params={"order_status":"WAIT_SHIP","page":1,"page_size":50}resp=requests.post("https://open-api.pinduoduo.com/order/list",json=params,headers=headers)orders=resp.json()OCR——识别快递面单上的单号:
text=ocr.recognize("快递面单照片.png")tracking_no=re.search(r'\d{12,15}',text).group()Python自定义函数——物流跟踪:
defcheck_logistics_status(tracking_no,express_company):"""查询快递物流状态"""api_mapping={"申通":"https://api.sto.cn/track","圆通":"https://api.yto.net.cn/track","中通":"https://api.zto.com/track"}api_url=api_mapping.get(express_company)ifnotapi_url:return"未支持该快递公司"resp=requests.get(api_url,params={"no":tracking_no})returnresp.json().get("status","未知")九、平台实战
拼多多批量发货流程:
TEMU店群矩阵自动化运营核价报活动
每天自动登录拼多多商家后台 → 进入订单管理 → 筛选"待发货"订单 → 逐条获取收件人信息 → 调用打单软件API自动打印快递面单 → 在后台填入快递单号批量发货。
库存同步:
每个店铺卖出去一件,自动从总库存里减掉一件。每天凌晨同步一次三个平台的实际库存数,防止超卖。农产品不像标品能随时补货,超卖意味着发不出货要赔钱。
这两个流程帮我亲戚家每个月省了200多个小时的人工,最关键的是再也没出现过错发、漏发、超卖的情况。
十、系统联动
# 飞书消息——新订单提醒webhook="https://open.feishu.cn/open-apis/bot/v2/hook/xxx"msg={"msg_type":"text","content":{"text":f"新订单!{order['商品']}×{order['数量']},金额{order['金额']}元"}}requests.post(webhook,json=msg)# 飞书多维表格——库存监控看板lark_base.update_record("tblStock",record_id,{"当前库存":new_stock,"更新时间":datetime.now().strftime("%Y-%m-%d %H:%M")})# 短信通知买家已发货# 调用云片网等短信APIsend_sms(phone=order["手机号"],content=f"您的订单{order_no}已发货,{express_company}{tracking_no}")十一、工程化规范
主流程_每日电商运营 ├── 子流程_登录各平台(参数:平台名称、账号密码) ├── 子流程_订单处理(参数:日期范围) ├── 子流程_批量发货(参数:订单列表) ├── 子流程_库存同步(参数:平台) └── 子流程_物流跟踪(参数:快递单号列表)调试经验:电商流程最怕"发货发重了"。我的做法是在流程里加一个"已发货检查"——插入快递单号前先检查该订单是否已有单号,有就跳过。
命名规范:order_no_list(列表)、ORDER_STATUS_SHIPPED(状态常量)、productPrice(金额)。
版本选择:农产品个体户用社区版免费足够;小型电商团队用创业版定时运行;电商公司用企业版对接开放平台API。
十二、速查表与常见报错
| 报错 | 原因 | 方案 |
|---|---|---|
| 商品发布失败 | 必填字段没填 | 逐一检查所有必填项 |
| 图片上传超时 | 图片太大或网络慢 | 压缩图片到1M以下 |
| 发货重复 | 没有检查是否已发货 | 发货前加状态检查 |
| 库存不一致 | 多平台不同步 | 设置统一库存缓存 |
| 登录过期 | Cookie失效 | 定时重新登录 |
| 反爬限制 | 操作太频繁 | 加延时+模拟人工节奏 |
农业电商不比城市电商,很多时候是一个人管三四个平台,手工根本管不过来。把重复性的事情交给RPA,人去做选品、定价、营销这些真正需要动脑子的事。
RPA在农产品电商里的应用价值被严重低估了,实际用起来比招两个客服还靠谱——毕竟程序不会请假、不会算错账、不会漏发。home.linyan.cloud 上有更多行业落地方案可以参考。
#影刀RPA #RPA教程 #农业电商 #农产品上架 #订单自动化
作者:林焱