裁判文书网文书数据采集Java

  • 需求
    • 准备工作
    • 开始整活
      • 抓包
      • 请求
    • 总结
    • 附件

需求

需求是通过java根据关键字采集到相关的裁判文书内容(本帖仅作技术交流用,望各位不要用在不法途径)。

准备工作

  1. 浏览器(建议谷歌浏览器);
  2. 创建一个SpringBoot项目,引入pom依赖(我这边持久层使用的mybatis plus,用啥持久层框架看你心情,主要的是hutool和json转换的依赖)
   <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version></properties><dependencies><!-- 阿里的JSON解析--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency><!-- lombok偷懒工具--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- hutool爬虫工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.5</version></dependency><!-- 苞米豆的mybatis plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>2.3</version></dependency><!-- jdbc--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

开始整活

抓包

1、打开裁判文书网、先注册然后登录(不登录没法搜索)。
2、打开浏览器的控制台,一般浏览器按F12即可,打开控制台的Network(浏览器的请求基本在这都能看到,我们需要的数据就需要在这找)

3、在搜索框中输入一个关键字(我这以“企鹅”为例)搜索,然后开始抓网页数据的常规操作,在所有请求中查找关键字以找到对应的接口,查找方式如图(常规抓取网页未加密的数据这方法屡试不爽)。

4、通过常规方式发觉这网页的数据无法直接获取,那肯定是通过某种加密让数据变了样,ok,那就人工在请求列表中找,看哪个接口返回的像加密数据,经过手动查找,发觉这个rest.q4w的接口是统一像后端请求的接口,其中一个rest.q4w的接口返回了一个包含一堆字符的字段result,以及一个名为secretKey字段,从命名揣测这应该就是我们想要的数据,这个secretKey应该就是加密时的盐值

5、这数据就是找到了也没法用啊,这时就需要对加密的数据进行解密,他能在页面展示成我们能看到的信息,那肯定是通过js解密,那接下来就是去翻这网页关联的js文件,控制台的Sources下有网页的静态资源。

6、通过浏览这些js文件,找到类似加密的js函数打上断点debug,不停的测试,最终发现了加密的方法。

7、看这变量名猜测是DES3加密,先写个程序解密一下这个返回结果看看,使用hutool包自带的des3解密,emmm,咋一直失败。继续回js找问题(为了看着舒服我给js文件都复制到了idea内),才发觉数据通过一个叫CryptoJS的对象进行处理过再解密的,但js文件并没找到这个叫CryptoJS的文件,问度娘,原来这是一个js加密包。

8、那这不清楚这包咋加密的,那我们就直接写个简单html,引用CryptoJS,以及包含加密的website.js中的DES3对象放进去(代码里面js的路径自己改下,CryptoJS我会放在文末,或者你们自己网上搜索下载,npm也能直接搞到)。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<script src="crypto-js.js所在的路径" type="text/javascript"></script>
<script>// import CryptoJS from '../static/crypto-js/crypto-js.js';function dec() {let key = document.getElementById("key").value;let data = document.getElementById("data").value;console.log(data)let result = DES3.decrypt(data,key)console.log(result)document.getElementById("result").value = result;}var DES3 = {iv: function() {let v=new Date();let format = "yyyyMMdd";if (!v)return "";var d = v;if (typeof v === 'string') {if (v.indexOf("/Date(") > -1)d = new Date(parseInt(v.replace("/Date(", "").replace(")/", ""), 10));elsed = new Date(Date.parse(v.replace(/-/g, "/").replace("T", " ").split(".")[0]));// 用来处理出现毫秒的情况,截取掉.xxx,否则会出错} else if (typeof v === "number") {d = new Date(v);}var o = {"M+": d.getMonth() + 1,// month"d+": d.getDate(),// day"h+": d.getHours(),// hour"m+": d.getMinutes(),// minute"s+": d.getSeconds(),// second"q+": Math.floor((d.getMonth() + 3) / 3),// quarter"S": d.getMilliseconds()// millisecond};format = format || "yyyy-MM-dd";if (/(y+)/.test(format)) {format = format.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));}for (var k in o) {if (new RegExp("(" + k + ")").test(format)) {format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));}}return format;},encrypt: function(b, c, a) {if (c) {return (CryptoJS.TripleDES.encrypt(b, CryptoJS.enc.Utf8.parse(c), {iv: CryptoJS.enc.Utf8.parse(a || DES3.iv()),mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})).toString()}return ""},decrypt: function(b, c, a) {if (c) {return CryptoJS.enc.Utf8.stringify(CryptoJS.TripleDES.decrypt(b, CryptoJS.enc.Utf8.parse(c), {iv: CryptoJS.enc.Utf8.parse(a || DES3.iv()),mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})).toString()}return ""}};
</script>
<body>
<!--<form>-->
<label for="key">密钥</label><input type="text" id="key"/>
<br/>
<label for="data">密文</label><textarea id="data"></textarea>
<br/>
<label for="result">结果</label><textarea id="result"></textarea>
<br/>
<button id="submit" onclick="dec()">提交</button>
<!--</form>-->
</body>
</html>


9、通过调用js果然解析出来了json格式的数据,数据与页面展示的相同(为了查看方便可以将json拷贝到网页工具中查看)。

10、列表的包以及解密我们是搞定了,但我们要的是详细的文书,就还得继续抓文书详情的包,按抓列表的包相同的方式,就能抓到文书详情的包,通过刚才的html工具,仍可以解析加密字符(一般网站也就用同一种加密方式)。

请求

1、至此任务已经完成一大半了,我们所需要的包都已经找到,并已可以实现数据的解密了,但我们需要关键词下所有的数据,那就还得实现代码发出请求。首先研究之前抓到的列表页的包,多抓几个包分析后,s21queryCondition经过分析是搜索的参数列表,sortFields是排序规则,pageNum顾名思义是分页,cfg是真正的接口参数,另外还有三个参数疑似加密参数。

2、通过在请求中查找,发现pageId是从首页就已经产生的,并后续经过测试发现可以复用,其他两个参数并未找到,那ciphertext和__RequestVerificationToken应该是js生成的,继续使用之前的方法在js文件中找,最终找到了这两个参数的生成规则。


3、为了省事,我们就直接把这些js拷贝出来,通过java调用js来获取参数,包括实现解密,JDK1.6之后java就有了ScriptEngineManager类可以实现js的调用(js文件路径记得改一下),我们通过hutool来请求。

调用JS来获取参数

使用hutool进行请求

4、如上法炮制请求文书详情即可,至此已可以实现对裁判文书网数据的采集。

总结

第一次独立实现对一个网站数据的解密采集,技术上没有什么难点,主要就是对js的了解以及善用工具(浏览器的搜索啥的),另外发一下该网站的公告,请大家遵守。

附件

附:CryptoJS
链接:https://pan.baidu.com/s/1JDXsaxrOLFIABtFt8K2wjw
提取码:abcd

裁判文书网文书数据采集相关推荐

  1. python 爬虫 裁判文书网 19年4月更新版

    完整版代码github地址:https://github.com/Monster2848/caipanwenshu 爬虫主体逻辑: import re import time import pymon ...

  2. 裁判文书网 爬虫 最新更新2020-08-12

    该程序采用Node模拟人工操作,自动获取页面内容,并将获取的数据保存到excel中(每1000条保存一个文件,可以设置保存的条数).excel文件内容如下图: 声明:本文章是以学习和交流为目的,数据源 ...

  3. 裁判文书网 爬虫 升级最新版本0.7 更新时间2020-12-17

    接上一篇文件:裁判文书网 爬虫 最新更新2020-08-12  https://blog.csdn.net/myhot/article/details/108046389 本次升级主要已支持写入mys ...

  4. python爬取裁判文书并分析_裁判文书网爬虫攻克

    最近因为公司需要爬取裁判文书网的某一类别文章数据,于是简单研究了一下,发现网站数据全是js加载的,于是想都没想直接用selenium尝试爬取,没想到竟然有selenium都抓取不到的js(刚毕业的py ...

  5. 关于裁判文书网的一些建议

    关于裁判文书网的一些建议 有部分小伙伴私聊我一些文书网的东西.原因应该是我关于文书网批量下载的博文,写得太过简单.但我认为实现思路其实就这么简单,登录爬取,就没其他操作可言了.今天整理一下大概的问题. ...

  6. 爬取裁判文书网(一)

    1.裁判文书网地址 http://wenshu.court.gov.cn/ 2.网站分析 (1)网站类型是动态网站. (2)网页源代码中并没有我们想要的页面内容,且引用许多js代码. (3)查看列表页 ...

  7. 2021-04-01裁判文书网数据python爬虫更新下载

    长期持续更新数据 2020-11-08裁判文书网数据python爬虫更新下载添加链接描述 截至3月已从数据库中下载1亿1200万条裁判文书数据,有需要数据的伙伴可以(。・∀・)ノ゙嗨前台QQ7900- ...

  8. 2020-11-08裁判文书网数据python爬虫更新下载

    2020年9月1日更新 文书网2020年8月31日晚更新之后就需要手机注册验证登录了,所以,账号是个问题. 分析 1. 登录 比较简单哦,主要难题是多账号的登录及session的更新维护. 2.其它 ...

  9. 爬虫修正:裁判文书网20200901更新增加登录系统

    爬虫修正:裁判文书网20200901更新增加登录系统 一.登录系统的增加 二.增加登录函数 三.一个比较纠结的地方 一.登录系统的增加 导致需要登录,直接是无法进入了.以往可以直接进入具体的类别如 现 ...

  10. 202106裁判文书网采集思路 理论无视更新

    严正声明:本文章是以学习和交流为目的,文书及其相关数据的知识版权完全归属文书网及权利所有者,严禁利用本文所提流程和数据进行盈利.相关代码及数据请在24小时以内删除.作者不承担由于非法使用程序和数据造成 ...

最新文章

  1. visual studio spy使用实现后台按键_多种精华液应该如何叠加使用?
  2. 深圳大学计算机暑期学校,The First Day-深度学习暑期学校
  3. 华中科大计算机冯丹,华中科大南加校友会欢迎母校代表团
  4. (52)系统调用阶段测试——基于 SSDT HOOK 的 FindWindowA 监视器
  5. c# forbidden.html,c# – 如何使用Forbidden状态web api返回ModelState
  6. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...
  7. 《中国大学--博弈论》
  8. hp服务器装vm系统,服务器虚拟化ESXi 5.5安装过程(HP)
  9. IBM刀片服务器虚拟化方案
  10. Navicat 数据库可视化工具远程连接MySQL及基本操作
  11. 隔空投送问题解决(高阶版)macbook以及iphone设备
  12. 2019 ICPC西安邀请赛 游记
  13. UVM中drain_time使用
  14. 寻找四叶草HTML5小游戏,寻找四叶草的作文四百字
  15. 《网络神采4》技术大揭密之:DedeCMS存储过程
  16. 番茄助手(Visual Assist X)过期的应对方法
  17. CC00047.bdpositions——|Hadoop实时数仓.V27|——|项目.v27|需求三:数据处理增量统计广告.V1|——|需求分析|
  18. xeon e5-2400 系列处理器能做四路服务器吗?,英特尔Xeon E5系列双路处理器大阅兵
  19. 请编写程序,读入CSV文件中数据,循环获得用户输入,直至用户直接输入“Q”退出。根据用户输入的星座名称,输出此星座的出生日期范围及对应字符形式。如果输入的名称有误,请输出“输入星座名称有误”
  20. 计算机教室论文,高校多媒体教室计算机维护措施

热门文章

  1. iOS App Store Connect 内购详解
  2. arduino uno连接超声波传感器测距
  3. sumo学习——sumo的路网介绍
  4. Request textDocument/codeAction failed.
  5. 网络分析仪自动化测试软件,高效矢量网络分析仪自动测试方法
  6. 小米Android版本不不一致,小米5s卡刷包android版本不一致怎么解决
  7. 计算机硬盘被制成动态硬盘,win10系统基本磁盘转换成动态磁盘的处理办法
  8. 已知基因名,如何在genbank中查询基因序列?
  9. 修改文件类型(txt文件改为bat、sh文件)
  10. 【Unity】由Unity资源的相对路径获取资源的AssetDatabase路径