裁判文书网 爬虫 最新更新2020-08-12
该程序采用Node模拟人工操作,自动获取页面内容,并将获取的数据保存到excel中(每1000条保存一个文件,可以设置保存的条数)。excel文件内容如下图:
声明:本文章是以学习和交流为目的,数据源所有权归属原网站及所有者,严禁利用本文所提流程和数据进行盈利。
如果该代码对您有用,或者产生了帮忙,可以请我吃个冰棍或者来瓶可乐。感谢!
具体代码实现如下:
'use strict'
//软件名称:文书网自动爬虫 SuuperWenShuToExcel
//软件说明:本nodejs用于模拟浏览器爬取文书网的文书内容,并保存到excel中。
//作者:myhot 2020-07-01
//注意事项:
// 1、获取文书时,不能将chrome最小化,否则程序不能获取到文件内容而暂停
// 2、文书网中文书是定期进行发布,但获取文书是按裁判日期,因此每天发布的数据中裁判日期有1个月前的数据,因此需要获取1个月前的数据,才能保证完整。
//当前存在问题:
// 1、由于翻页时有可能不成功,重复获取当前页的文书,导致文书重复,加入重复判定,同时也会造成会丢失一页的文书数据
//使用协议:
// 1、您应当对使用该程序下载的数据具有管理负责,应用于正当目的;对于所产生的后果,本程序概不负责;
// 2、本程序已开源,您可以在此基础上进行任意修改和发布,但不可应用于商业目的。
//版本历史:
//2020-08-02 v0.3
// 1、每1000个文件存一个新的文件前缀,因为达到2000个文书左右时,由于过大导致程序停止的bug
//2020-07-31 v0.2
// 1、增加法院、开始裁判日期等参数
// 2、每次获取1个月前的数据时,可先通过总数量进行判断,如果大于了本地数量,则再进行下载,否则认为本地是最新的,可不必依次下载,这样减少获取文书的时间
//2020-07-20 v1.1
// 1、实现指定检索条件,按日期依次爬取文书网内容,并存储到excel中,每日检索条件最多爬取10页
//以下为参数配置*************************************
//设置本次获取文书的裁判起始时间
var sdateTime=new Date('2019-06-21');
//设置本次获取的天数,默认180天
let nTday=365;
//设置法院名称筛选条件
let sFyName='山东省淄博市中级人民法院';
//每多少条数据,存一个文件
let nSaveNums=1000;
//以下为代码正文*************************************
// 引入 fs 模块
const fs = require('fs');
// 引入 xlsx 模块
const xlsx = require('node-xlsx').default;
const puppeteer = require('puppeteer');
//序号
let iIndex = 1;
//每100保存一大份 ,起始为100,每次加100
let iThousandIndex = nSaveNums;
(async () => {
// 设定 puppetter 启动参数
// 主要是要配置 chrome.exe 的路径 文章后边会给下载链接
const browser = await puppeteer.launch({
// 把安装后的 chrome 路径填到当前js下面
executablePath: './chrome-win/chrome.exe',
// 是否开启无头模式, 可以理解为是否有可视的浏览器界面
headless: false, // 开启界面
defaultViewport: null, //全屏
slowMo: 80, //慢动作
//ignoreDefaultArgs: ["--enable-automation"]//去除自动化测试的提醒 这个参数会使navigator.webdriver 为 True 文书网会判定为爬虫,不能请求返回数据
});
// 新建一个网页
const page = await browser.newPage();
//第一页加入反爬---navigator.webdriver 为 True 文书网会判定为爬虫,不能请求返回数据
await page.evaluateOnNewDocument(() => {
const newProto = navigator.__proto__;
delete newProto.webdriver;
navigator.__proto__ = newProto;
});
// 设置 excel 表头
//裁判理由1 文书类型1 法律依据1 两个暂无
const wenshuTitle = [['DocID','审判程序', '裁判法院', '裁判日期', '案号', '案件名称', '裁判理由', '案由','案件类型','文书类型','当事人','法律依据1','案件内容']];
//初始化
let data = [].concat(wenshuTitle);
//设置起始天数
let days = 0;
while (days < nTday) {
sdateTime=new Date(sdateTime);
let starttime1= sdateTime.toISOString().substring(0,10);
console.log("取该日期:" +starttime1);
// 跳转至文书网
try {
await page.goto('https://wenshu.court.gov.cn/');
} catch (error) {
console.error('访问网页发生错误error:', error);
console.error('重试访问');
//退出本次循环,继续重试,还是在本页
continue;
}
//未访问出该页面,则重试退出本次循环
const teelement = await page.$('#_view_1540966814000');
if (teelement==false)
{
//退出本次循环
console.error('当前页面无法访问,重试访问');
continue;
}
await page.waitFor(500);
// waitForSelector 等待 目标 渲染出来
await page.waitForSelector('#_view_1540966814000 > div > div.search-wrapper.clearfix > div.advenced-search');
//等待
//await page.waitFor(2000);
// 模拟点击高级检索 输入条件
await page.click('#_view_1540966814000 > div > div.search-wrapper.clearfix > div.advenced-search');
// 配置全文检索的关键词
// const searchText = '安全';
// 全文检索关键字
// await page.type('#qbValue', searchText);
//法院名称
if (sFyName!=''){
await page.type('#s2', sFyName);
}
// 点击全文检索类型
//await page.click('#qbType');
// 选择理由
//await page.click('#qwTypeUl > li:nth-child(6)');
//案件类型--
//await page.click('#selectCon_other_ajlx');
// 民事案件
//await page.click('#gjjs_ajlx > li:nth-child(4)');
// 行政案件-myhot 注释
//await page.click('#gjjs_ajlx > li:nth-child(5)');
// 文书类型
//await page.click('#_view_1540966814000 > div > div.advencedWrapper > div.inputWrapper.clearfix > div:nth-child(9) > div > div > div');
// 判决书
//await page.click('#gjjs_wslx > li:nth-child(3)');
// 裁决书--myhot 注释
//await page.click('#gjjs_wslx > li.on');
//年份开始(2017-01-01)
sdateTime=new Date(sdateTime);
let starttime= sdateTime.toISOString().substring(0,10);
//每次请求一天
await page.type('#cprqStart', starttime);
//年份结束(2020-12-31)
await page.type('#cprqEnd', starttime);
//当事人
//await page.type('#s17', '');
//点击检索
await page.click('#searchBtn');
//等待 页面内容刷出
await page.waitFor(2000);
//设置起始页数 从1开始必须的
let pageNum = 1;
let pageCount =0;
//文书结果总数量
let rTotalCount = 0;
//更改分页15
//myhot 注释 采用每页默认数量,不更改每页数量
const element = await page.$('#_view_1545184311000 > div.left_7_3');
if (element){
//await page.waitForSelector('#_view_1545184311000 > div.left_7_3 > div > select');
// 页容量改为15, 这样从一个页面采集的数量比较多 ---myhot 注释
//await page.select('#_view_1545184311000 > div.left_7_3 > div > select', '15');
// 等待 页面内容刷出
//await page.waitFor(1000);
//搜索结果数量------------------------------------
const viewtmp1 = await page.$('#_view_1545184311000 > div.LM_con.clearfix > div.fr.con_right > span');
if (viewtmp1)
{
rTotalCount = await viewtmp1.evaluate(node => node.innerText) ;
}
console.log('文书结果总数:' +rTotalCount );
}
//计算总页数 每页5条 采用上整除方法
pageCount= Math.ceil(rTotalCount / 5);
if (pageCount>0)
{
console.log('搜索结果共' + pageCount +"页");
}else//如果无分页,则说明该日期无文书记录,则直接下一轮日期
{
console.log('暂无分页数据');
}
// while 里面配置采集多少页 最多100页
while (pageNum <= pageCount) {
console.log('开始爬取第' +pageNum +'页');
// 获取页面列表数据区域
const view = await page.$('#_view_1545184311000');
const lists = await view.$$('.LM_list');
let href_url="";
//重试标识
let nRetry=0;
// 循环数据列表
for (const list of lists) {
try {
// 获取列表汇总每个信息的超链
const href = await list.$('div.list_title.clearfix > h4 > a');
// 获取指向的地址
href_url = await href.evaluate(node => node.href);
// 根据 href_url 获取 docid, docID 即为文书编号, 这里使用正则
let docid = href_url.match(/docId=(\S*)/)[1];
// 获取文书的案号
let ah = await list.$('div.list_subtitle > span.ah');
// 后边会经常用到这个方法, innerText 用以获取 字符串
ah = await ah.evaluate(node => node.innerText);
//裁判理由
let cply = await list.$('div.list_reason > p');
cply = cply !== null ? await cply.evaluate(node => node.innerText) : '';
//2020-08-02 增加docid查重操作 由于翻页时可能不成功,重复获取当前页的文书,导致文书重复,加入重复判定,同时也会造成会丢失一页的文书数据
for(let aa of data )
{
let bb =aa[0];
if (bb==docid)
{
console.log('docid重复,该文书丢弃,案号:'+ah);
continue;
}
}
//每2个写一次
if (pageNum%2==0)
{
console.log('写入fs');
// 新建 xlsx 文件, 进行相应配置
const buffer = xlsx.build([
{
name: 'sheet1',
data,//必须用data,不能使用其它变量名,否则为空
}
]);
//每当大于1000的时候,就保存另外一个文件名,并清空data
if (iIndex >= iThousandIndex)
{
fs.writeFileSync(iIndex +'-'+ Date.now() +'文书.xlsx', buffer, { 'flag': 'w' });
iThousandIndex=iThousandIndex + nSaveNums;
//重新赋值
data = [].concat(wenshuTitle);
}
//fs.writeFileSync('文书'+Date.now()+'.xlsx', buffer, { 'flag': 'w' });
}
}
//加1天 取下一个日期
sdateTime=sdateTime.setDate(sdateTime.getDate()+1);
days++;
}
// 整体采集完后关闭浏览器
await browser.close();
// 新建 xlsx 文件, 进行相应配置
const buffer = xlsx.build([
{
name: 'sheet1',
data,
}
]);
// fs 方法写入内容
fs.writeFileSync(iIndex +'-'+ Date.now() +'文书.xlsx', buffer, { 'flag': 'w' });
console.log('整体数据采集完');
})();
————————————————————————————————————————————————————————
完整文件下载:链接:链接:https://pan.baidu.com/s/1VkH73tbLNpQhQBhAAFTp9A
QQ与微信同号:115392406 加好获取提取码
有啥情况可以联系!
裁判文书网 爬虫 最新更新2020-08-12相关推荐
- 裁判文书网 爬虫 升级最新版本0.7 更新时间2020-12-17
接上一篇文件:裁判文书网 爬虫 最新更新2020-08-12 https://blog.csdn.net/myhot/article/details/108046389 本次升级主要已支持写入mys ...
- python爬取裁判文书并分析_裁判文书网爬虫攻克
最近因为公司需要爬取裁判文书网的某一类别文章数据,于是简单研究了一下,发现网站数据全是js加载的,于是想都没想直接用selenium尝试爬取,没想到竟然有selenium都抓取不到的js(刚毕业的py ...
- 裁判文书网爬虫Docid解密思路
1. 使用node.js本地搭建web,运行js,返回解密结果.getValue()函数获取解密结果 // 创建服务器http.createServer( function (request, res ...
- 2020-11-08裁判文书网数据python爬虫更新下载
2020年9月1日更新 文书网2020年8月31日晚更新之后就需要手机注册验证登录了,所以,账号是个问题. 分析 1. 登录 比较简单哦,主要难题是多账号的登录及session的更新维护. 2.其它 ...
- 爬虫修正:裁判文书网20200901更新增加登录系统
爬虫修正:裁判文书网20200901更新增加登录系统 一.登录系统的增加 二.增加登录函数 三.一个比较纠结的地方 一.登录系统的增加 导致需要登录,直接是无法进入了.以往可以直接进入具体的类别如 现 ...
- 2021-04-01裁判文书网数据python爬虫更新下载
长期持续更新数据 2020-11-08裁判文书网数据python爬虫更新下载添加链接描述 截至3月已从数据库中下载1亿1200万条裁判文书数据,有需要数据的伙伴可以(。・∀・)ノ゙嗨前台QQ7900- ...
- python 爬虫 裁判文书网 19年4月更新版
完整版代码github地址:https://github.com/Monster2848/caipanwenshu 爬虫主体逻辑: import re import time import pymon ...
- Python爬虫Selenium手动接管Edge爬取裁判文书网“环境污染”数据(Mac环境)
目标数据:爬取从2007年到2022年,各地级市中级法院历年关于"环境污染"的裁判文书数量. 由于裁判文书网需要登录,Selenium手动接管爬取可避免频繁登录造成的封号风险. S ...
- 2023-5裁判文书网数据库更新
裁判文书网日更新量相对以前有所减少,目前更新量近1.4亿条,做了一些分析报告,研究了一些类案-- 持续更新中,为一些法律工作者提供一些辅助. 相关事宜,之前的博文有相应介绍.
最新文章
- 分享:Gunicorn 0.17 发布,Python HTTP 服务器
- 关于使浏览器崩溃的代码尝试
- python 函数前有一个下划线_【Python】怎么写好一个 Python 函数?
- Fiori Elements的metadata和ui annotation
- 重读经典:《ImageNet Classification with Deep Convolutional Neural Networks》
- python通过ssh配置交换机_配置(通过SSH)Cisco交换机的Python脚本
- android学习笔记---48_实现软件国际化,实现文字国际化,和图片国际化
- 深度推荐模型(EDRMs):面向Web级应用的基于二进制码的Hash Embedding
- 建站基础知识之CSS 究竟什么来头?
- mysql二进制日志管理
- 【HAL库系列】1.STM32CubeIDE下载与配置
- Windows网络编程——查询本机的主机名称及IP地址(控制台应用程序)
- MATLAB 棋类小游戏合集(围棋,六子棋,走四棋,九子棋,含禁手五子棋等等)
- C盘空间不足怎么办?试试这款软件
- SSM用户注册登录案例
- 1415-2个人读后感作业
- aic值检验 p值_R语言入门之独立性检验
- vscode 实时运行代码插件 Quokka
- Android作为客户端,PC作为服务端:实现网络通信
- 桌面窗口管理器dwm.exe内存过高,intel核显内存泄漏问题(附核显升级链接)