2023.02.13 更新
文书网又恢复了之前的加密方式,此文现在又有效了,我不会再更新具体内容,避免文书网服务器因爬虫而承受巨大压力,有智慧的朋友请自行参悟。
2021.12.20 更新
文书网反爬已更新,此文失效。
随着反爬的不断升级,文书网的爬虫也越来越难了。
为了降低反爬再次升级的可能性,本文仅展示部分思路和代码,如果想要数据,可以联系我 xxxxxx。
一、数据的样貌
以获取北京互联网法院的数据为例(下同):
有用的数据是后两个rest.q4w
的json数据,体积较大的那个是文书数据,较小的那个是左边栏的分类。
文书数据的json内容:
没错,数据是加密的,需要将密文解密为明文才是我们需要的数据。
但事情远没有这么简单,我们再看一下这个响应的请求体:
请求体的一些数据都是加密的。
二、寻找解决办法
我们可以确定第一步要做的事就是找一找请求体中比较特别的参数来自哪里。
1 pageId
pageId
在当前页面的 url 里:
https://wenshu.court.gov.cn/website/wenshu/181217BMTKHNT2W0/index.html?pageId=0cc75a376282f1729e60324a0ea5c379&s40=132&fymc=%E5%8C%97%E4%BA%AC%E4%BA%92%E8%81%94%E7%BD%91%E6%B3%95%E9%99%A2
那 url 里的pageId
又是从哪里来?
index.js
文件里有一行代码:
我们按图索骥,看一看$.WebSite.uuid()
方法的代码:
这就是源头了,将这个函数的代码转成你正在用的语言对应的代码即可,比如 python 代码:
2 s40
没什么可找的,就是一个分类标识 / id 。
3 sortFields
也没什么可说的,排序标识。
4 ciphertext
很明显的二进制,转为字符串后:
7OCOHRGqXNozUql6NpzY6qpt202104069M0AJ6beqt9EniWl05VPNw==
很明显的base64编码,解码试一下:
可以看见,解码后的内容不是正常字符,无需多想,肯定是加密了,我们再找一找:
找到了,ciphertext
是则cipher()
函数生成的,再找一找这个函数是如何实现的:
又找到源头了,其中还有一个方法WebSite.random
也需要看一下,但比较简单,就不上图了。
上面的代码可以直接调用,或者转码,比如转码为 python 代码:
5 cfg
也是固定的值,没什么好说的。
6 __RequestVerificationToken
用到的也是random
方法,和ciphertext
中的random
方法相同。
三、最后结果
结果能获取到了,但文书网为了反爬虫,特意做了条数限制,只显示前60条,若想获取更多数据,还需要精确搜索条件以缩小查询结果条目数量到60或60以内。