裁判文书最新爬虫

439 阅读4分钟
原文链接: my.oschina.net

网上大部分的教程都已经失效了,主要是因为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)后续

目前使用以上方法是可以的,我已经采集了百万数据,后续官网更新算法,我会在这里更新(如果能破解的话..)。然后这个程序的话,我就不开源了,毕竟是个黑暗的蜘蛛程序,核心已经告诉大家,大家可以自行动手。不过有什么问题还是可以交流的~~