游客发表
美团外卖的网络外卖页面不是静态的。你右键查看源代码,爬虫爬看到的美团是一堆JavaScript引用和加密后的字符串,真正的网络外卖商家列表、价格、爬虫爬销量数据,美团全在接口返回的网络外卖JSON里。所以想爬它,爬虫爬第一步不是美团写Python,是网络外卖打开Chrome开发者工具,切到Network面板,爬虫爬刷新页面,美团盯着XHR请求一条条冒出来。网络外卖
我最初以为这事很简单。爬虫爬拿requests直接怼首页URL,美团返回的HTML里连个菜名都找不到。后来才搞明白,美团用的是前端渲染,服务端只给一个壳,数据靠浏览器执行JS后异步加载。这就意味着,纯requests方案基本走不通,除非你能逆向出它那套签名算法。
签名算法是第一个硬骨头。美团请求里有个_token参数,还有mtgsig之类的字段,都是JS运行时生成的。你翻它打包后的代码,变量名全是a、b、c,混淆得亲妈都不认识。有人用PyExecJS直接调它的JS文件,但那个文件依赖浏览器环境,window、document对象在Node里根本不存在。补环境是个体力活,得一个个把缺失的对象伪造出来,navigator、location、localStorage,少一个就报错,报错还不告诉你哪缺了。
更麻烦的是风控。你请求频率稍微高一点,接口就返回{ "code": 403, "msg": "请求异常"}。不是封IP那么简单,它还会检测你的User-Agent、Referer、甚至Cookie里的uuid是否和之前一致。我试过用同一个uuid换IP继续跑,跑了二十来条就被识别了。后来改成每个请求随机生成uuid,配合代理池轮换,才勉强稳住。
代理池又是一笔开销。免费代理基本不能用,延迟高不说,十个里九个连不上。付费代理按流量计费,爬美团这种图片多、接口返回大的站,流量跑得飞快。我算过一笔账,爬一个城市的商家列表加菜单,大概要消耗200MB流量,按每GB三块钱算,一个城市六毛钱。听起来不多,但你要爬全国三百多个城市呢?
数据解析反而成了最简单的一环。接口返回的JSON结构很规整,data.poi_list下面是商家数组,每个商家有name、address、avg_score、month_sales。菜单在另一个接口,用poi_id去查,返回food_spu_list,里面嵌套sku_list,价格、规格、库存状态一目了然。写个递归函数把嵌套结构拍平,存进MongoDB,完事。
但这里有个坑。美团返回的销量字段是字符串,比如"月售300+",你得正则提取数字。价格字段有时候是"¥25.5",有时候是"25.5",甚至还有"起"字后缀。这些脏数据不处理,后面做分析全是坑。
法律风险得提一嘴。美团用户协议里明确禁止爬虫,robots.txt也把大部分路径都Disallow了。你爬公开的商家信息,它可能睁一只眼闭一只眼;但你要是爬用户评论、骑手位置、或者高频请求把服务器搞出压力,法务函就来了。我见过有人爬了商家数据做竞品分析,被美团起诉不正当竞争,赔了十几万。
技术本身中立,用在哪才是关键。我最后没继续跑这个爬虫,把代码删了。原因很简单:爬来的数据我根本用不上,纯粹是技术验证。但验证过程中学到的JS逆向、风控对抗、代理管理,倒是实打实的手艺。你要是也想试试,建议拿自己的账号在测试环境跑,别碰生产接口,更别拿数据去卖钱。这行水太深,淹死的都是会游泳的。
友情链接