首发于无法说
用Python抓取新版裁判文书网(附代码,针对初学者修订)

用Python抓取新版裁判文书网(附代码,针对初学者修订)

本文首发于审判研究,内容略有不同。

引:

曾听一个理科同学说他同事的逸事。这位同事对占用时间超过5秒,不必用脑又必须做的事情,都会写个小程序替他解决。工作邮件来往就不用说了,连在讨论项目的工作群里,也是自动处理。检测到某人说话、内容与自己工作相关、又或是有人@了自己之类后,连接一个语句库自动回复。

听过之后甚是羡慕,如果我们司法人员也会一点编程技巧,将可以节省大量时间。比方说把填入办案系统、摘录证据等事交给电脑,既可以节省时间,又可以减少错误,还可以省下时间好好分析下证据材料和法律关系。

带着对程序员的艳羡,再加上各种机缘巧合,我开始了自己的Python之旅。现在稍微尝到了点编程的好处,比方说我们工作中要查询很多法律文件和文书,如果只是一两份我们在网页上直接下载就可以,但如果有很多份需要操作,将很不方面。而爬虫功能,可以很方便地替我们实现这一需求,而且还可以顺带删除掉各种广告和无关内容。

下面以法律人都会接触到的裁判文书网为例,简单介绍下爬虫功能的实现。

正文:

一、准备工作

开始前,先简单介绍下Python和一些基础问题。

Python是一种语法简单、模块多的电脑语言,可以很方便地实现很多功能;而且不用去操心具体如何实现,只要找到合适的模块,告诉它去做就可以,很适合非程序员入手。比如说从网上抓取数据,如果用别的语言来写程序,要很多行,但如果用Python,可以几行就解决问题。

再选择Python之后,有语言版本和模块两个问题。语言版本方面,主要有2.7和3两种。2.7的优势是有历史“悠久”,可以用的模块多;3的优势是它是未来的发展方向,而且大多数我们用得上的模块都已经支持3,并且3对中文的支持要好得多。所以,个人建议用直接上3。当然,这些对我们外行人来说并不是很重要,两者都差不多,能用就行,不要卷入程序员之间的口水战。

除此之外就是模块问题。模块就像日常工作中的笔墨纸砚之类的工具,它省去我们自己去“造工具”的时间。这里推荐Anaconda,它像普通软件一样,大家只要在Google一下就它的官方网址进行下载安装,你的电脑就可以用Python一样进行编程了。我们用得上的模块,它都已经一起打包安装,省去了我们去找模块、装模块和处理模块之间兼容性的时间,可以说是工具的工具。

总结一下,准备工作就是一句话,搜索Anaconda,下载,安装,DONE!

二、上手爬虫

互联网是网,而在网上替我们搜索资料的程序,就是爬虫。

我们要动手的裁判文书网跟一般的网站复杂一点,无法直接用网址进行抓取。因此,我们首先弄明白两个问题,一是网上显示的文书内容是哪发过来的,二是网站要满足什么条件才会向我们发送这些内容。

1. 跟踪网页

直接搜索“执行”两个字,这是我们在浏览器上可以看到的网址,但直接抓不到内容,需要用软件网页进行跟踪。这个软件不用安装,无论是IE,还是Chrome,你按F12的话,这个软件都会蹦出来。下面以chrome为例。

按F12后,右边就弹出了软件的界面。选中上面的network的大项,刷新下网页。浏览器与网站的所有交互内容,就出现在下面的name小项中,里面就藏着我们要的内容。在这个网页里,内容藏在划圈的Listcontent项下。

我们选中Listcontent,从右边Headers的详情可以看到,请求方式是POST,而Request URL后跟着的,就是真正的内容请求地址。

下面我们解决第二个问题,我们要发送什么内容,这个网址才会返回我们需要的信息?同样在这个界面下,我们继续往下翻,可以看到Form Data内容(如下图)。

我们可以看到,信息内容分别是:搜索条件“全文检索:执行”,Index:1(第一页),Page:5(每页出现5个文书,最大值为20,我们可以直接在程序里设为20),order:法院层级(按法院层次来排序),最后一个参数是解码的,照抄即可。也就是说,我们给网页必发送的检索要求是:全文内容含有“执行”二字,如果有符合条件的按这个格式给网页发送内容,就可以取得我们想要的资料了。

2.代码

知道用什么格式发送信息、发送到哪之后,就该写代码了。下面我们打开刚刚提到的软件Anaconda项下的Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。Spyder是负责写编码的工具。

就会出现下面这个界面。

在左侧,我们就可以开始自己写代码了。在进入具体代码前针对初学者再啰嗦两句。

  • l 一是心理问题。初学者一般有两个问题,1)会不由自主地想为什么这么写?这样写的“法理基础”是什么?这种问题是程序员中的精英考虑的,一般的程序员都没琢磨明白。我们非专业人员奉行的应该是拿来主义,能用就行。法律主业搞好了,还有兴趣再研究不迟。要是兴趣太大一不小心彻底转行了,那……恭喜你加入了一个高薪行业(一般的Python程序员月薪中位数在18000左右),哈哈。2)想搞懂一个例子里涉及的所有问题,这种钻究态度是好的,但在初上手时会成为你的障碍。学编程其实就是学语言,只不过是跟电脑说的语言。想想我们在初学一门外语时是怎么做的?背!所以,初学编程,最简单有效地办法是,我们先把代码一个字不差的,一行一行的自己敲进电脑里。敲完了,你就懂了。
  • l 二是技术问题。也是两个:1)“#”后跟的是注释,用来给大家解释代码,无须输入电脑,输入了也会被电脑忽略掉,不影响程序运行。2)代码这东西,错一个地方电脑就不认,特别是符号不能错,格式不能错。①所有的符号,除了被英文单引号、双引号包起来的内容,都必须是英文输入法下的符号;②所有代码顶格写,但如果有从属关系,注意在空四个空格(下面要讲的代码涉及到一个while的循环语句就涉及这个问题,我会在代码里进一步解释)。如果有一句太长了可以回车,电脑看得懂,不影响程序运行。

现在开始上正菜,以下代码的作用是,搜索全文含有“执行”二字的案件,并将其时间、案号、案件名称提取出来放在excel表里。

#到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。

#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。

#到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-

#用("""      """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016

@author: 检
"""


#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re

#这是刚才我们通过F12查找到的网页
url='http://wenshu.court.gov.cn/List/ListContent'

#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]

#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:

    #这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
    my_headers={'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400',}

    #这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人   民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
    #如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中加红的区域即可。
    data={'Param':'全文检索:执行', 'Index': Index,'Page':'20','Order':'裁判日期','Direction':'asc'}

    #将网址、请求头、搜索条件等数据上传并取得内容
    r=req.post(url, headers=my_headers, data = data)

    #用 json解码取得的网页内容
    raw=r.json()

#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(')前的内容截取出来。
    pattern1 = re.compile('"裁判日期":"(.*?)"', re.S)
    date = re.findall(pattern1,raw)
    pattern2 = re.compile('"案号":"(.*?)"', re.S)
    num = re.findall(pattern2,raw)
    pattern3 = re.compile('"案件名称":"(.*?)"', re.S)
    title = re.findall(pattern3,raw)

#把筛选出的数据添加到开始的三个空列表里
    dates+=date
    titles+=title
    nums+=num

#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
    time.sleep(SleepNum)
    Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。

#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({'时间':dates,'案号':nums, '案件名称':titles})
df.to_excel('C:\\result.xlsx')


好,工作结束,保存一下,点击软件界面上的绿色小三角形或者按F5运行下,过一会我们就会发现在C盘里安静地躺着一个名称为result的excel表,里面存放着我们想要的资料。以后我们都不用打开编程软件Spyder,把代码另存为放在桌面上,双击一下,它就会自动的按设定的搜索条件把相关的文书案号找好,保存为excel,不用再登陆那个响应缓慢的文书网了,是不是很方便?

如果只是想要结果的话,直接粘贴到Spyder左侧的框里就可以直接运行。(但是如果你看完本文后对编程想进一步学习的话,个人强烈不建议这样做。因为很多细节你不自己输入进去,是注意不到的。比方说刚提到的while语句,在回车下一行之前是有个“:”号,光看代码是很容易忽略掉的。当然,Spyder这个编程软件很智能,会替我们补全,但我们不能依赖机器对吧。)

其他的补充:

首先,编程的益处很多。它可以提高我们工作的效率(像上文中的代码,运行2、3分钟,可以下载几千份的法律文书);而且因为编程很像教一个什么都不懂的小孩怎么做事,有一个前提没交代清楚,它就做不下去了,所以它的逻辑性很强,可以反哺法律工作,比方说分析法律关系时,编程的思维方式可以帮助我们意识到自己忽略掉的隐含前提。

其次,编程并不难。这种层次的编程,不用考虑机器怎么会明白我写的是什么意思这种问题,更像是在做游戏的高级设置选项,多数代码直接就是英文单词,可以看成是写一篇英文小作文。我们的困难主要在于不习惯,绝不是理解不了,多敲几遍代码就可以解决这个问题。

最后,如果这篇文章有幸激起了你学Python的兴趣,可以到这个网站学习下基础知识,通俗易懂,每一小节还随带小练习,很适合初学者(课后练习一定要做啊,写出来才是真的会了)。

编辑于 2017-06-16

文章被以下专栏收录