网上大部分的教程都已经失效了,主要是因为vl5x值的计算升级了,比之前复杂很多。
一、爬取业务流程
(1)构造guid
核心代码如下:
//js代码
(((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
其实是随机数,有类似的算法也可以。官网上的结果形式为:
// 例如: `194cb81f-cec7-1baa9226-aa547f73b7fd`
fn()+fn()+'-'+fn()+'-'+fn()+fn()+'-'+fn()+fn()+fn()
(2) 根据guid获取number
这个很简单,带上guid参数去拿就行了。关键是中间有坑:
- 有时候会返回
服务不可用 - 有时候会返回
502 360安全域
遇到坑的时候就是重试了。后面还有类似的坑。。
(3)拿到vjkl5值
这个值有点意思,它是你访问网站的时候,系统写入到cookie中的。cookie有效期是1个小时,而实际只有10分钟(目前为止),后续的请求都要使用这个值。系统会根据这个值在客户端算出vl5x,然后请求到服务器的时候,服务器会根据vjkl5算出vl5x,然后将客户端的值和服务端算出的值进行对比,如果一致则说明校验通过,然后才会返回数据,不然就会返回remind key
拿到这个值很简单,只要获取cookie即可获得,这个值可以缓存到本地10分钟,减少请求次数。
(4)计算vl5x值
这个是核心的参数,步骤说简单也简单,说复杂也挺复杂,关键看实现方法。
首先我跳一步枯燥的分析,直接告诉你,这个值是一个** getKey() **的方法算出来的,有经验的小伙伴都知道
然后我经过调试,跟踪,发现这个方法的依赖文件有如下几个:
sha1.js
base64.js
md5.js
key.js (是getKey的方法体,可以直接在控制台输入getKey获得)
那么解决办法也就有了:
- 最简单的办法就是把依赖都下载到本地,然后使用js运行环境加载这些文件,然后调用getKey()方法,这个值就出来了。这里需要说明下,这个值计算的时候需要vjkl5的值,但是js里是从cookie里读取的,因此需要稍微改造一下key.js
- 复杂点的办法就是按照官网的算法去实现,毕竟源码都有,就是语言改造的问题。
(5)获取列表
如果以上值都已经获取,那么现在就可以去获得列表了。参数如下:
- vl5x 查看(3)
- guid 查看(1)
- number 查看(2)
- Param 这个参数很关键,因为返回的数据最多可以查询200条(最近刚放开,之前是30条)。根据筛选条件来缩小结果集是必要的。参考:** 上传日期:{0} TO {1},案件类型:{2},法院地域:{3} ** 但是这个并不能将所有文书下载下来,还需要添加更多的条件才行。
- Index 页码
- Page 每页条数(最大20)
- Order 排序字段
- Direction 排序规则 默认asc
(6)后续的坑
坑有很多,目前发现的总结一下
- 即便是所有参数都正确,仍有可能提示remind key,此时重新计算vl5x,如果还不行,就重头开始
- 会有502错误,可以多重试几次
- 会有服务不可用的提示(可能是乱码,用utf-8编码转换之后得到:服务不可用),解决办法依然是重试
- 前面有提到,目前最多返回200条,那么之后的内容就是重复的了,因此需要判断返回是不是重复的内容,如果是重复的,本次查询条件就可以结束了
- 某些时候官网会放验证码,验证码地址:http://wenshu.court.gov.cn/waf_verify.htm
(7)后续
目前使用以上方法是可以的,我已经采集了百万数据,后续官网更新算法,我会在这里更新(如果能破解的话..)。然后这个程序的话,我就不开源了,毕竟是个黑暗的蜘蛛程序,核心已经告诉大家,大家可以自行动手。不过有什么问题还是可以交流的~~