裁判文书网 爬虫 最新更新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  加好获取提取码

有啥情况可以联系!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联上收集信息。其主要功能是访问页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对站造成过大负担或触发反爬虫机制,爬虫需要遵守站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重站的使用政策,并确保对被访问站的服务器负责。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值