乐于分享
好东西不私藏

【实战案例】APP京东JD商品数据自动化爬取

【实战案例】APP京东JD商品数据自动化爬取

前言

有客户找到我,需求是爬取JD京东APP中所有的折扣数据。借这个案例给大家分享一下开发思路。

需求分析

  1. 支持多设备多任务排队执行
  2. 支持可视化商品爬取数据管理
  3. 数据只存在app,协议逆向对抗风控成本高,选择自动化爬取比较稳妥的方式。
  4. 考虑本地或者服务器维护成本

框架选型

1. autojs

源框架不支持各大厂平台,衍生分支面临跑路和收费的情况,暂不考虑。

2. 冰狐

支持安卓,Sass多租户平台,支持设备管理和平台暴露API对接,基本功能不收费。首选。

系统架构

  1. 冰狐提供获取设备列表、执行设备脚本API接口,商品系统调用接口。
  2. 冰狐接收到执行设备脚本接口调用,实际调度设备执行脚本。
  3. 设备数据采集完成上报数据到商品系统。

结果

部分核心代码

functionmain(goodId, deviceId, ip, port{let res = null;    backAppHome()// 更新设备状态为忙碌    httpPost("http://"+ip+":"+port+"/api/devices/status", {"id":deviceId, "workStatus""繁忙"}, 'json');if(launchApp("com.jingdong.app.mall") == 1) {console.log("启动成功")        waitForLoad("id:com.jingdong.app.mall:id/h8"20000)if(switchPage("id:com.jingdong.app.mall:id/h8""id:com.jd.lib.search.feature:id/oe").length > 0) {let input = findView('id:com.jd.lib.search.feature:id/a0x')if (input.length > 0) {console.log("输入")                setClipboardData(goodId)                click('id:com.jd.lib.search.feature:id/a0x', {isLongClicktrueafterWait1500});// waitForLoad("txt:粘贴", 5000, true)                click("txt:粘贴", {root"txt:粘贴"afterWait1000});                click('txt:搜索', {clicktrueafterWait1000})let comp = waitForLoad("txt:一键领取|txt:去购买|txt:客服|txt:查看商品|id:com.jd.lib.search.feature:id/a7e"60000)if (comp.length > 0 && comp.view[0].text != "客服") {console.log("进入商品首页")let btn = findView("txt:一键领取|txt:去购买|txt:查看商品")if (btn.length < 1) {// 兼容id搜索                        btn = findView("id:com.jd.lib.search.feature:id/a7e")                    }let pickCouponBtn = btn.views[0]                    gestureClick(pickCouponBtn.left + (pickCouponBtn.width / 2), pickCouponBtn.top + (pickCouponBtn.height / 2), {});                    waitForLoad("txt:客服"60000)                }                res = {"goodId": goodId,"goodInfo": parseData()                }console.log(res)let ret = httpPost("http://"+ip+":"+port+"/api/products/goodsInfo", res, 'json');console.log('ret:' + ret);            }        }        backAppHome()// exitApp()    } else {console.log("启动失败")    }// 更新设备状态为空闲    httpPost("http://"+ip+":"+port+"/api/devices/status", {"id":deviceId, "workStatus""空闲"}, 'json');return res}

商品数据页

支持模拟器、真机多设备多任务执行采集

设备信息页

支持从冰狐系统中同步设备,脚本运行实时更新工作状态。

系统配置页

设置商品上报ip和端口,支持本地网络/服务器运行。冰狐token和采集模式设置