该程序采用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相关推荐

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

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

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

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

  3. 裁判文书网爬虫Docid解密思路

    1. 使用node.js本地搭建web,运行js,返回解密结果.getValue()函数获取解密结果 // 创建服务器http.createServer( function (request, res ...

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

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

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

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

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

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

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

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

  8. Python爬虫Selenium手动接管Edge爬取裁判文书网“环境污染”数据(Mac环境)

    目标数据:爬取从2007年到2022年,各地级市中级法院历年关于"环境污染"的裁判文书数量. 由于裁判文书网需要登录,Selenium手动接管爬取可避免频繁登录造成的封号风险. S ...

  9. 2023-5裁判文书网数据库更新

    裁判文书网日更新量相对以前有所减少,目前更新量近1.4亿条,做了一些分析报告,研究了一些类案-- 持续更新中,为一些法律工作者提供一些辅助. 相关事宜,之前的博文有相应介绍.

最新文章

  1. 分享:Gunicorn 0.17 发布,Python HTTP 服务器
  2. 关于使浏览器崩溃的代码尝试
  3. python 函数前有一个下划线_【Python】怎么写好一个 Python 函数?
  4. Fiori Elements的metadata和ui annotation
  5. 重读经典:《ImageNet Classification with Deep Convolutional Neural Networks》
  6. python通过ssh配置交换机_配置(通过SSH)Cisco交换机的Python脚本
  7. android学习笔记---48_实现软件国际化,实现文字国际化,和图片国际化
  8. 深度推荐模型(EDRMs):面向Web级应用的基于二进制码的Hash Embedding
  9. 建站基础知识之CSS 究竟什么来头?
  10. mysql二进制日志管理
  11. 【HAL库系列】1.STM32CubeIDE下载与配置
  12. Windows网络编程——查询本机的主机名称及IP地址(控制台应用程序)
  13. MATLAB 棋类小游戏合集(围棋,六子棋,走四棋,九子棋,含禁手五子棋等等)
  14. C盘空间不足怎么办?试试这款软件
  15. SSM用户注册登录案例
  16. 1415-2个人读后感作业
  17. aic值检验 p值_R语言入门之独立性检验
  18. vscode 实时运行代码插件 Quokka
  19. Android作为客户端,PC作为服务端:实现网络通信
  20. 桌面窗口管理器dwm.exe内存过高,intel核显内存泄漏问题(附核显升级链接)

热门文章

  1. Java中 DecimalFormat 用法详解
  2. 适定、超定和欠定方程及压缩传感技术
  3. 2018全球机器学习技术大会7月27-28日就等你来!
  4. 太牛了!我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档
  5. python-数据分析案例汇总
  6. 实拍视频、图片素材库,高质量、免费下载。
  7. 计算时针与分针之间的夹角
  8. ubuntu给手机建wifi
  9. 淘宝排名查询接口,关键词排名API,宝贝排名查询,在线淘宝排名查询
  10. 《桃花庵歌》- 唐寅