中国裁判文书网数据爬取(2019.5.15更新)(组图)
优采云 发布时间: 2021-08-03 23:16中国裁判文书网数据爬取(2019.5.15更新)(组图)
裁判文书网数据抓取(2019.5.15更新)
一、前言
为避免不必要的侵权纠纷,本文文章不会贴核心代码。如果您有兴趣交流和讨论,请在非工作时间随时欢迎。项目采用的技术纯粹是获取数据,不会涉及暴力入侵、js注入等有害服务器行为。获得的数据是完全合理合法的公开数据。请监督。 文章使用的技术包括js去混淆、解码等,需要的支持环境很多。如有需要,请自行排除故障。我不会在这里重复它们。分析使用Charles抓包,因为我再做一遍就知道路径了,所以文章用浏览器自带的调试控制台引入了。
最近因为工作原因,好久没有更新博客了。今天为了总结一下新学到的知识,抽空更新了一篇关于中国裁判文书网数据爬取的文章。众所周知,文雪网的反爬虫机制简直是离谱。几乎都是网站自己定制的规则,再加上IP封号、验证码、量化检查等,但仔细分析还是有迹可循的。文雪网每两周小改,四个月大改,所以可能会发现前几天的爬虫突然不可用了。这是正常现象,尤其是今年4月份的大变化,就更难解释了。我试过用selenium,但速度确实感人,而且相对来说还不够稳定(重复数据、内存爆炸、异常处理等)。 是我遇到过的最难的,也是最反爬的机制网站。如果我能从头到尾分析一下,肯定对爬虫技术大有裨益。接下来介绍一下我的逆向分析流程:
二、analysis
A.分析需要获取的数据页面
图一、content_docid 请求页面
1、 可以看到这个URL就是我们需要的数据,但是控制台里没有数据。找xhr看看是否在后台返回的结构化数据中。不幸的是,没有数据。
2、这个docid绝对是唯一的索引。全局搜索了一下,发现还有一个aspx,正好是我们需要的数据,而且是get请求。接下来,查找 docid 参数。
B.分析真实数据页面请求
图二、aspx请求页面
3、分析了aspx的cookie,发现了wzws_cid、vjkl5等一系列参数,带上参数直接请求获取数据。
4、 先把cookie放在这里,然后找DocID。全局搜索没有发现,加密数据,定位到指定js页面。
5、网站 此处使用的eval混淆。将js代码解码后,发现是基于md5的自定义加密方式。直接翻译成python。一千多行太臃肿了。通过execjs库替换方法。直接执行解码后的js代码就可以得到加密后的docid,但是这段代码需要两个参数,RunEval和ID,必须在列表页。
C.分析列表页面
图三、全局搜索参数
6、找到加密后的docid的原材料RunEval和ID,在列表页面返回的xhr的ListContent中找到,但是要请求这个ListContent,需要提交表单,也就是说这是一个发布请求。
7、点击控制台参数,发现需要的参数如下表所示。这里前五项是数据请求的形式,后三项vl5x、number、guid也需要自己构造。不幸的是,这三个项目都在这里。这个变量仍然是加密的。
8、post 请求也需要cookies,这里需要vjkl5、wzws_cid等一系列参数。 cookie的问题和上面一样,所以我们先处理一下。提前说明一下,post表单和cookie老化大概是一分钟,也就是每次测试都需要重新构建,但是如果某个IP的请求频率达到每天5秒左右,就会被ban掉,并且第二天就会解决。 Seal,这里需要有足够的代理测试,同时保证构建速度足够快,否则报的错误很容易被误导到其他方向。 (这个操作越来越丑了……)
表一、数据的发布请求表
参数
全文搜索:管理
索引
1
页面
10
订购
*敏*感*词*级别
方向
升序
vl5x
068bef0cd4a1ed5c886cd2ed
数量
B5L4
指导
2955fa06-6042-02eba40d-d91e566c3163
图四、ListContent请求页面
9、 带参数的通过火狐浏览器请求,(这里之所以没有使用谷歌浏览器,是因为谷歌浏览器在执行重定向时,返回的是重定向前的请求,是后台通过抓包发现的浏览器机制问题)。
10、全局搜索vjkl5,找到vjkl5的加密js,同样需要去混淆、翻译和调用,使用execjs包执行vjkl5代码,发现可以得到你需要的vl5x代码。
11、 下面解决number和guid。这里的数字也是加密数据,不过不是js混淆加密,而是post请求加密。加密的原材料为guid,全局搜索guid,定位guid函数,发现这是一个随机生成的基础数据,翻译成python,得到三个参数。
图片五、number 的帖子请求页面
12、 找到了vjkl5的起始源,发现请求列表数据时返回的Set-Cookie刚好收录了这个值。得到后,发现请求如下图所示。未请求数据。这个和April一样在大更新中,增加了一个新的参数wzws_cid,作为请求标志,防止机器爬虫。
13、通过302重定向这个页面会返回一个新的cid,去混淆js,得到三个关键数据dynamicurl,wzwsfactor,wzwsquestion和一段js代码。
14、这里的js使用了反混淆sojson.v5加密。这种加密方式的介绍是:“请保存源代码,加密后无法恢复”,是的,无法解密。怎么办,有3种方法,第一种selenium(弃用,刚出selenium),第二种nodejs直接跑(内存爆,有一些注意事项),第三种暴力傻瓜式破解(手动替换变量调试,最后翻译成python)
图六、假cookie请求结果
15、 得到了禁止重定向请求的 wzws_cid。这里使用浏览器的隐身模式进行分析。 cookie 由服务器提供。如果要获取cookie,必须避免本地cookie的影响,配合第一个本次收到的假cookie再次发起请求,获取Set-Cookie字段的vjkl5值。
16、 不同ips返回的wzws_cid代码是不同的。由于 ip 阻塞机制,必须使用隐藏代理。云ssl隧道转发和本地ip会被后台识别,所以每一个新的页面链接都需要重新获取wzws_cid,到此逆向分析完成,下面是最终得到的json数据。
图七、最终得到的格式化数据
三、forward 请求步骤
1、Request list URL,这个URL需要带上生成guid后的编号和post请求来获取假cookies和wzws_cid
2、获取动态url、wzwsfactor、wzwsquestion三条数据,以三条数据为原料获取当前请求URL
3、 获取刚才伪造的 wzws_cid,从上一步构造的 URL 中请求数据。这里禁止redirect,获取vjkl5的值
4、decryption vjkl5值为vl5x值,再次获取guid和number,带上表单表单,这里表单数据应该和第一步构造的列表URL同义,请求ListContent,获取RunEval和ID,即可一次获取十项数据
5、通过RunEval和ID解密DocID,构造aspx请求链接
6、带vjkl5 请求上一个链接获取假cookies和wzws_cid
7、重复第二步
8、 重复第三步得到最终的文本数据
9、一次十条数据,由于cookie和vjkl5的时效性,而vjkl5完全兼容请求列表页面链接和post表单,再次请求时需要从第一个循环开始
四、注
1、当请求显示“请开启JavaScript并刷新页面”时,表示wzws_cid无效
2、当请求显示“remind key”时,表示vjkl5无效
3、aspx 可以使用docker+splash直接渲染最终数据。可用于亲测,但速度稍慢。这次我就不介绍了。稍后更新。
4、这里scrapy、lxml、代理设置等工具、框架、python中用到的支持为了节省篇幅就不介绍了。如果这方面有什么问题,请阅读崔庆才的《网络爬虫开发实践》
5、说起来容易做起来难
五、片曲
1、两个星期一,变化不大,刚赶上,本来运行良好的代码第二天突然失效了,心态崩溃了。幸运的是,我又发现了这个问题。建议留下selenium版本,防止网站大更后爬虫无法获取数据的问题。
2、规动计师网站 开发者喜欢在代码中评论他们的工作,设置环发起挑战,这是去年8月的一个大更新。
图八、接受挑战