- 前言
中国裁判文书网的反爬策略也是对爬虫们毫不怜惜,今天给大家简单讲一下关于裁判文书网中的js加密问题,分为两部分来讲,方便大家了解学习。还是老规矩,仅供学习参考,切勿用于商业用途。
一、介绍
打开裁判文书网,发现浏览器访问不了List页面,只好改用火狐浏览器。进入到List页面(也就是可以看到很多案件的那一页),发现是Ajax异步更新页面,也就是说它用JS来加载更新数据,而不更新整个页面。那么我们只有两种方案,一种是用selenium+浏览器,来驱动浏览器来加载数据,但是此方案效率非常感人,如果采集数据量大或更新频率高,非常不推荐这种方式。另一种就是找数据加载的接口位置,这里不明白的可以看我之前的文章python爬虫项目(新手教程)之知乎。这一步一般都会有JS加密来防范爬虫。
二、页面分析
我们先找到案件数据加载的接口位置,如图2-1所示:
找到接口位置后,查看请求方式为post,那么意味着我们需要参数访问。我们先看此页面的cookies,后面会需要用到,如图2-2所示:
这里的vjkl5,后面会用到,先圈出来。我们接下来查看post请求参数,如图2-3 所示:
这里的参数前面都很好理解,Param:案件类型,Index:索引页面,Page:设置当前页面数据请求条数,Order:是哪个级别,Direction:返回文件格式。后面三个参数vl5x,number,guid不知道是什么意义,其它的可以自己选择设置,所以我们今天我们需要做的就是找到这三个参数的获取方式。
三、JS加密研究
我们既然知道是JS方式加载的参数,所以检索所有加载的JS文件,找到vl5x和guid两个关键字。这一步没什么好方法,地毯式搜索。总共38个JS文件,从Lawyee.CPWSW.List.js 文件找到如下代码如图3-1所示:
可以看到data里面写了所有参数获取位置,我们先看number,同样在这个js文件的代码中顺着number:yzm1,可以发现如图3-2所示:
可以顺着发现,number等于yzm1,yzm1等于subyzm[7,11],subyzm又为当前链接url下&number参数坐标+1位置开始的子串subyzm,如当前链接为http://wenshu.court.gov.cn/Assets/js/20180919/Lawyee.CPWSW.List.js,没有&number所以坐标为-1+1,subyzm=url[0:],yzm1=subyzm[7:11]=wens,大家不理解可以看下JS代码,我这里翻译成python语言是这样。
这样我们找到了number,同样方法在此文件下检索guid,发现如图3-3所示:
很容易发现guid等于guid1,guid1又等于几个createGuid( )组合起来的一串数字,而CreateGuid函数也已经给出,随机数字产生。
这样我们只需要找到vl5x就可以了,这个放最后讲也是因为这个参数最麻烦,在当前文件下,我们根据图3-1只能知道vl5x:getKey(),我们只要找到getKey()这个函数即可,但是此文件没有找到getKey( ),意味着这是一个外部函数。我们需要从其它文件下获取。
同样,我们一个一个搜索着getKey()函数,在Lawyee.CPWSW.ListExtend.js文件下找到如图3-4所示:
我们得到这个参数了,想要和之前一样去读懂这个函数是不可能的了,因为不仅非常长非常长,而且还有JS混淆,关于js混淆,就是把其中的变量、方法位置顺序打乱,但是又用一些无关的变量或者方法来保证执行顺序,这种js混淆的也很好处理,复制完整的混淆代码去js混淆还原网站还原。也可以利用chrome中的Console后台调试JS代码了,直接copy这段代码进去发现如图3-5所示:
发现de没有定义,我们在此文件发现de函数定义后,加进去发现如图3-6所示:
其中_fxxx没有,我们又找到_fxxx定义后加入发现如图3-7所示:
我们发现这里要获取网页Cookie值,但是JS代码发现如图3-8所示:
这是一段加密的JS代码,根本看不到什么意思,但是用chrome浏览器source可以看到其中真正的代码,这里要如何使用呢,就是调试的时候设置断点,这样到这里就可以显示出来,当然也可以去js混淆网站去解密也可以看到相关内容,这里在chrome调试下发现如图3-9所示:
这里的cookie值要去得到cookie中vjkl5的值,所以我们要想得到vl5x这个参数,事先还必须得到网站给我请求加的cookies上vjkl5的值才行。然后我们在这里需要改写这段代码,方法也很简单,在此函数前自定义一个getCookie的函数,直接返回我们获取到的cookies上vjkl5的值,这里我们以参数的形式传进去,改写如图3-10所示:
加入我们自定义的getCookie方法后,我们继续测试,调试代码,输入getKey(‘123’)发现如图3-11所示:
继续缺少函数,这里我们找hex_md5,发现在/Assets/js/dist/libs/md5.js文件下,我们继续copy下来,放入进去调试。如图3-12所示:
到这里基本上就是重复以上步骤,找到所缺函数定义位置,加入进去。这里找到Base64函数定义,放进去
就可以惊喜发现,代码运行成功。这里我们加入之前图2-2所展示的cookie值vjkl5的值放进去,结果如图3-13所示:
比对2-2和2-3的cookie和vl5x参数,发现结果正确。到此我们已经将所需要的关键参数全部集齐。
四、代码实现
代码放上来就被简书网管查水表了,后面会一起放在Github上,整理好后会贴出来。当然这些不重要,重要的是加密的方式和解密的思路以及手段。
运行结果如图4-1所示:
结语
中国裁判文书网目前作为全球最大的裁判文书网站,每天面临的访问量也是非常巨大,反爬严密也是可以看出来,之前也做过一次解密,不过此次反爬策略又全面更新了一次,访问前要经过360安域排查,文书ID做了加密,JS混淆加密,jsfuck加密,随机参数也做了一些修改,下一次会给大家分享关于对裁判文书网文书ID加密研究的过程讲解。如果大家有什么问题,欢迎一起学习探讨。