业务背景
由于公司民宿的业务需求,需要
- 在未登录情况下基于爬虫针对途家网的房源的房态、价格、房源信息、上下架情况等进行实时追踪,
- 在登录情况下,同步房东端的房源、订单、账单等信息;
- 在登录情况下,完成房东房源的开关房、上下架、改价、改库存等操作;
- 完成自动登录获取cookie的操作;
**其中房态与价格为业务核心**
爬虫与反爬发展过程
1.PC网页阶段;
2.手机H5阶段;
3.旧版本APP阶段;
4.APP逆向阶段;
5.佛系阶段;
具体过程
1.PC网页阶段:
*此时期,所有爬虫模块均为基于scrapy的单机式爬虫,业务量规模较小,所有接口均为途家网网页端接口;
*工作难点在于接口的js加密的逆向,破解TJH等相关参数的生成方式,debug时会有无限死循环函数导致chrome卡死,最终解决方案是一步一步单步调试,完全破解加密参数,使用python重写js的加密逻辑,也可以使用execjs调用js核心代码;
2.手机H5阶段:
*基于PC接口破解的方式存在两个弊端,一是途家TJH加密版本经常升级,导致爬虫也失效;二是会产生假的数据,脏数据会污染生产环境。在某个版本后发现途家h5端虽有加密参数但是加密参数不生效,遂改成此接口,但不久h5接口亦有加密参数,因此该阶段只是过渡,此时业务量一般;
3.旧版本APP阶段:
*由于网页易升级的弊端,因此切换为老版本途家APP,使用flidder抓包,虽有加密参数,然亦未做处理,该版本稳定一段时间后失效,而且此时业务量急速扩张,需要稳定的爬虫模块支持;
4.APP逆向阶段:
*使用新版本途家APP,使用flidder抓包,其中核心的房态与价格功能均加密,初期其虽有加密参数,但校验比较松散,经不断升级调整,其请求头的header与payload的数据耦合性极高。
*最终解决办法是基于jadx与IDA分析源代码,找出其加密.so文件,使用frida注入运行状态的app以调用生产加密参数的静态函数,并使用Flask发布接口获取frida的结果;
*此阶段业务量继续飞速扩张,房源数量已达数万套,同时对多个模块进行了改造,自建了分布式的系统以保证及时性
5.佛系阶段:
* 可以看出途家做了极多的反爬措施,无论是假数据、js加密,还是各种极高耦合性的加密参数,还是IP或者登陆校验,以至于现在取消了PC网页端的情况,但目前来看都不是很难攻克。
*针对速度及时性的要求,途家房源数量较多,目前的处理方案是:设计分布式架构,使用redis做任务队列,scrapy/request负责抓取(根据场景使用),request的请求都放在线程池多线程运行,scrapy的都是同时起多进程,一个主节点为master负责产生任务,使用reids的zset对优先级进行排序,多个woker节点负责从redis取出优先级高的任务进行消费,目前仍在继续解耦合中,最终目的是爬虫爬取与业务完全分离,只负责数据正确与及时的抓取;