记一次爬虫经历

130 阅读4分钟

背景:应某司要求,要爬取某电商平台(自己可以意淫下哪些国内电商平台)商品价格与公司自营商品价格做对比从而打价格战。

刚开始自己着手研究各个电商平台前端技术特点。APP和小程序一般不好抓取(有机会好好研究)。因此我主要分享网页数据的爬取。网页的渲染技术大家应该都知道,一般都是JS+HTML,关键数据(比如价格)的渲染几乎都是异步AJAX(不然早被扒光白嫖了),js混淆加密,更恶心的是F12进入调试就开始死循环匿名函数debugger,尝试关了下也可以关,但对于破解js很蛋疼,在上面调试是不可能了,看到这些一头雾水,无从下手。于是乎,冷静的分析下,怎么办?

我首先想到的是要想真正拿到价格数据必须得知道请求的关联,这涉及的一个流程问题,如从开始初始化页面拿到sessionid->ajax请求1携带sessionid拿到令牌token->然后再根据上一步的token去拿到价格(加密的)->解密数据->最终渲染结果。刚开始我是借助浏览器使用爬虫插件selenium驱动浏览器跑任务的后来发现1,:耗性能,2:部署不便,3、必须翻个墙去找对应测试版本浏览器加驱动麻烦。索性,开启了js的破解之路,一劳永逸。当我分析完他的请求流程之后,就开发分析各个流程节点的请求出入参关系,既然是流程肯定是下一步依赖上一步的,所以,我就从初始化页面开始找关联参数,中途并不顺利,因为js是混淆的,无法找到关系,然后,我就找页面的初始化js函数init,开始有了眉目,当我确认了这个函数肯定会第一个执行业务请求的时候,我就顺藤摸瓜在浏览器source那一栏js中找到了这个函数,不巧的是完全加密混淆,我把这个js贴到notepad上参数竟然会变动,这尼玛没玩过,顿时绝望了,想打退堂鼓。然后就开始疯狂在网上找在线破解方法,粘贴到各大工具上无解,网上说一般js都能破解,因为js的加密一般都是混淆的,高级的加密会影响性能,所以基本都能破解,一般看不出来的只能通过调试了。可眼下线上不能调试,依然蛋疼,因为本人是专注后端开发的,以前也接触过前端,但是不那么专业。思来想去,把网页代码下载下来本地调试了,我使用的谷歌浏览器火狐也可以,下载下来后打开js都压缩了,很难看,好在浏览器可以排版,直接粘贴复制,优美的代码就出现了。然后就开始调试了,但是那个循环debugger的匿名函数太碍眼,必须想办法去掉,但是这些js都是混淆加密的,只能在本地调试到该节点看调用链锁定业务函数,最终清除了。然后就开始调试那个初始化函数,经过大概一周的混淆函数翻译标注,通过全局替换,原来他们请求参数构造原来如此简单(详细不再多说),js破解后就着手建请求流程,这时就可以丢掉浏览器驱动了,自己在网上找个spider-flow平台开始建请求流程,在开源中国里面,很好用。但是最终拿到的数据是加密的,破解仍然需要js解码后才能看到原始数据,具体我不透了,后来这段js算法代码我也是研究了两天翻译成了java最终成功解密的数据。

但后续的问题来了,ip被封了,爬过的应该懂,反扒机制大一点的网站都有,一般限流、限ip、参数验证,各种方式,更甚者数据参假,很正常,此刻你就要仔细分析数据了。由于封的缘故,代理池是不可少的,要么自己搞个了,要么money找第三方解决。最终我写好java后端托管给springboot,定时爬取了,很稳定。

总的来说,算是一个数据抓取的尝试,希望能帮助各位!