周末逛商场,计蒙只用 9 块钱,自提了一份工作日花 30 元外卖点的同款套餐。
盯着手机页面上 21 元的差价,沉默了很久。
同款门店、完全一样的餐品,仅仅是配送、平台券、到店自提规则不同,小伙伴们不花个十几分钟反复切换 APP 对比,根本看不到真实底价。
计蒙租住的小区周边有三座大型商场,地下通道步行 5 分钟直达。
一个念头瞬间冒出来:2公里内就自提!
信息差收割懒人,既然人工比价低效又费时间,不如亲手写一套全自动比价程序。
初衷很朴素:把所有重复、繁琐、枯燥的比价工作,全部交给程序,自己省时、省钱,还能吃到性价比更高的饭。
整套工具核心依靠图像定位 + OCR 视觉识别,无需抓包接口、不侵入平台底层,自动遍历三大主流外卖平台,筛选周边近距离门店的真实到手价,彻底告别手动来回切 APP、凭感觉比价的低效模式。
一、图像 + OCR 视觉自动化:完整闭环,稳定运行
走纯视觉模拟真人操作路线,搭建了一套工程化全自动数据闭环,稳定性大幅提升。
一句话讲透整套运行逻辑:数据库作为大脑,模拟器充当肢体,图像模板匹配完成精准触控,OCR 识别充当眼睛,全程无需人工介入。
完整自动化数据流:
数据存储 → 任务调度 → 图像定位自动触控 → 多平台遍历采集→ OCR价格识别清洗 → 智能比价决策 → 订单预执行 → 数据回写
传统比价逻辑是「人主动找低价」,这套系统直接反转逻辑:自动遍历全平台、主动筛选最低价,最优下单方案直接输出,省去全部人工筛选成本。
小提示:数据存储第一步时一定要配置好录入的距离范围!!!!
二、系统底层:三张数据表,支撑全流程数据驱动
能长期稳定迭代的自动化项目,核心不靠硬编码写死逻辑,而是数据驱动 + 配置化管理。
设计三张核心数据表,覆盖菜品自定义、UI 图像坐标配置、价格数据全量溯源三大场景。
1. 菜品库:个性化点餐配置中心
用来存储所有常吃套餐的自定义参数,支持模糊搜索匹配、预算限制、平台优先级自定义。
CREATE TABLE 菜品库 ( 菜品ID INT PRIMARY KEY, 菜品名称 VARCHAR(100), -- "香辣鸡腿堡套餐" 别名列表 TEXT, -- 模糊搜索适配多关键词 目标预算 DECIMAL(5,2), -- 个人预算上限 历史最低价 DECIMAL(5,2), -- 记录历史底价 偏好平台权重 JSON -- 自定义平台优先级);
2. 平台配置库:视觉自动化最核心模块
整套系统能否精准自动点击、识别价格,全靠这张表。通过 UI 图像模板匹配 + 动态相对坐标定位,记录三大外卖平台全部操作控件区域,实现无差错自动触控。
CREATE TABLE 平台配置库 ( 平台名称 VARCHAR(50), 搜索框坐标 X,Y, -- 图像识别锁定搜索框精准坐标 价格区域坐标 X,Y,W,H, -- 划定OCR专属价格识别区域 模板图片路径 VARCHAR(200), -- UI图像匹配模板,适配页面变动 是否启用 BOOLEAN);
关键优势:
系统不会依靠固定坐标死磕页面。每次操作先通过图像模板匹配识别,如果无法找到会按照逻辑上下滑动。动态计算控件坐标完成点击。即便平台页面小幅改版,只要最开始记录的整体 UI 结构不变,程序就能正常运行,容错率较高。
3. 价格快照库:全网比价核心数据仓库
全量存储 OCR 识别清洗后的真实到手价,既支撑实时比价计算,也可以长期复盘平台定价、优惠券溢价规律。
CREATE TABLE 价格快照库 ( 菜品ID INT, 平台名称 VARCHAR(50), 店铺名称 VARCHAR(100), 价格 DECIMAL(5,2), 采集时间 DATETIME, 原始OCR文本 TEXT -- 用于排查识别误差,校准OCR模型);
三、视觉自动化碾压人工比价
整套比价系统分层解耦,分为调度总控层、视觉采集层、智能决策层,所有操作全部依托图像识别驱动,逻辑清晰、方便后续维护扩展。
第一层:调度总控层
系统总指挥,自动读取待比价任务,批量触发多平台采集,内置随机延时策略模拟真人操作节奏,规避平台风控封禁。
def 主流程(): 待办任务列表 = 数据库.查询("SELECT * FROM 任务队列 WHERE 状态='待执行'") for 单个任务 in 待办任务列表: 菜品信息 = 数据库.查询菜品(单个任务.菜品ID) 报价列表 = 多平台采集比价(菜品信息) 最优选择 = 决策引擎(报价列表, 菜品信息.目标预算) if 最优选择 != NULL: 执行下单(最优选择) 数据库.更新任务状态(单个任务.ID, "已下单") 随机延时(3~8秒) # 模拟真人操作,规避机器特征第二层:整套工具灵魂模块
不抓接口、不调用平台底层 API,全程纯视觉交互:
图像模板匹配页面元素 → 动态定位按钮控件 → 模拟器模拟手指点击 → OCR 精准识别价格区域,再通过正则清洗提取真实支付价格。
def 多平台采集比价(菜品信息): 报价列表 = [] 平台列表 = 数据库.查询("SELECT * FROM 平台配置库 WHERE 是否启用=true") for 平台 in 平台列表: 启动App(平台) 图像定位点击(平台.搜索框坐标) 输入菜品名称 + 回车搜索 等待页面加载(3秒) for i in range(1, 4): 图像定位点击第i个店铺() 等待加载(2秒) 原始文本 = OCR区域识别(平台.价格区域坐标) 实付价格 = 正则清洗提取数字() 报价列表.存入数据() 返回桌面() return 报价列表第三层:智能决策层,自动输出最优下单方案
负责清洗无效价格数据、过滤超出个人预算的套餐;
多套餐价格相同时,按照自定义平台权重择优推荐,最终直接返回唯一最优解。
def 决策引擎(报价列表, 目标预算): 有效报价 = 报价列表.筛选正常价格() 有效报价.价格升序排序() 最低价 = 有效报价.第一个() if 最低价.价格 > 目标预算: return NULL if 多单价格并列: 按平台权重择优 return 最低价
四、安全兜底机制:严守边界,杜绝风险
整套自动化系统的安全底线提前焊死,绝不越界操作,彻底规避误扣款、恶意批量下单的风险。
核心安全规则
所有自动化操作仅执行至提交订单页面,最终支付步骤必须手动确认,程序无权自动扣款。
配套全套平台防封策略:
✅ 随机操作延时:打破机器固定点击频率,高度模拟真人使用习惯
✅ 模拟滑动浏览:复刻用户上下滑动查看店铺的行为,降低风控判定概率
✅ 异常降级机制:单平台采集失败不会导致整套程序崩溃,剩余平台正常兜底比价
✅ 人工总开关:一键暂停所有比价、下单任务,全流程完全可控
作者有话说
你平时点外卖,会反复切换多个 APP 比价吗?有没有遇到过线上外卖和线下到店差价巨大的情况?
欢迎在评论区聊聊你的省钱小技巧。