您的位置:首页 > 新闻频道 > 国内新闻 > 深度报道>正文

裁判文书网数据爬虫-2019年我破解“中国裁判文书网”-爬取裁判文书数据-爬虫技术破解哪些事儿

时间:2019-09-06 18:03:21    来源:国际财经网    浏览次数:    我来说两句() 字号:TT

Python深度爬虫-2019年我破解“中国裁判文书网”-爬取裁判文书数据-爬虫技术破解哪些事儿

最近在深入研究AI深度爬虫技术,主要是想通过AI技术把我之前写的各种网爬虫代码进行升级,2018年我破解过中文裁判文书网、专利网、商标网、天x猫、淘x宝、天某查、企某查、启某宝等各种网站各种反爬技,当时为数据分析使用,训练AI模型时候需要用很多数据源,每个网站的数据源都建立一个数据库主要用于做数据分析和训练AI模型使用。

最近自己在用python+mongdb+mysql+多进程+cookie+代理池 写了一套分布式多进程的某裁判网数据爬虫系统,主要是用来帮助一个朋友做案件的判例数据分析使用,实现了对中x裁判网整个网站的全部数据各种维度的采集和存储,并且根据中x裁判网页的数据结构建立数据库表来存储数据,最后对这些数据分析文本分析、模糊算法分析接触非常有价值的风险控制模型解决方案,很多做技术的朋友爬取某某裁判网的时候会遇到不少,比如封IP爬不了,比如验证码破解了等等问题,我把我的经历和解决方案分享给大家。

(需要爬虫技术交流的朋友欢迎加我qq2779571288),首先我们先分析它的反爬机制:

一、裁判网如何判断我们是否浏览器访问还是爬虫访问:

想要解决绕过裁判网爬数据的问题,首先我们要分析是在什么情况下才会出现验证码,裁判网是通过以下两种方式进行识别我们是否浏览器访问还是爬虫访问:

方法1:通过识别我们的请求头,来识别是否真实用户,我们打开裁判网站的时候,正常浏览器打开会有一个请求头,请求头会按顺序带上相应的参数去请求裁判网的网站,裁判网的技术工程师会头这个头进行参数验证,如果发现您发送过来的请求头参数缺少或者顺序不同或者不对,那么就可以识别出来您是爬虫来采集他的数据,不是正常的真实用户用浏览器访问的,那么就会提示302301等各种禁止访问的提示。每个网页的请求头参数我们都可用chrome查看元素去查看浏览器打开这个网页的时候具体包含了那些请求头参数,下面是刑事案件列表请求头:访问网址:

http://wenshu.court.gov.cn/List/List?sorttype=1&conditions=searchWord+1+AJLX++%E6%A1%88%E4%BB%B6%E7%B1%BB%E5%9E%8B:%E5%88%91%E4%BA%8B%E6%A1%88%E4%BB%B6

请求头参数:


通过分析这个请求头我们就知道里面有一个cookie是加密的,还有请求的参数,我们如果要模拟采集这页面的数据我们就得模拟这个请求头。然后用pythonrequest.get(url)方法去请求获取数据。

方法2:通过监控同一个IP段的访问频率,如果用我们的电脑运行爬虫程序去裁判网,那么我们的外网IP就一个,你一分钟之内如果访问的速度超过十几次,那么中文裁判网明显知道您是用爬虫程序来访问他的网站的,他就会让你稍等再来,或者禁止访问。那么我们怎么知道裁判网的请求头是什么呢?我们模拟发送一个get请求的时候,应该带哪些头参数呢?

方法3cookie加密,如果一个网站做了cookie加密算法来拦截爬虫,一般的手段是你必须先打开首页,然后才能再打开列表页或者详细页,如果发现你都没有打开过首页你就直接访问详细页了,那么根据页面访问的记录cookie加密算法可以直接识别出来您是非法访问,你是爬虫,直接把您拦截了或者拉入黑名单了。

二、采集中文裁判时需要带header头哪些参数?

您用火狐或者chrome打开裁判网的刑事案件栏目的首页,然后用浏览器的查看元素-网络-看到请求头如下


我们在写代码的时候就必须带上这些参数,而且值是一模一样,顺序也不要颠倒,那么我们的请求头问题解决了,下面我们只要再解决封IP问题就可以正常采集裁判网数据。

三、为什么采用代理IP后还是被封了?

我们做爬虫的时候不能使用自己电脑的IP去循环采集裁判网站否则会直接封IP,要解决这个问题其实很简单就是采用动态的代理IP,但是呢很多人用代理IP还是出现会封,其实原因是您用的这个代理IP质量不行,或者你用的是那种网上公开的或者免费的代理IP。使用代理IP还是被封会有以下原因:

1) 您的代理IP失效时间太短,还没成完一个http请求就失效了,导致永远被封或者无效

2) 您的代理IP网络不到达不通导致,原因是您的代理IP网络不行。

3) 你的代理IP不是高匿名的,直接被识别出来,需要购买高匿名、高私密的的代理IP

4) 您的代理IP已经被其他人用过裁判网了,早被列入黑名单,导致你永远IP被封。

5) 你是不是老是一直用几个代理IP循环去爬?正确做法是每个请求都随机换不同IP,所以您需要网上选那种不限制数量的代理IP,而不是固定几个IP。

四、、爬裁判网应该选用什么样的代理IP?

建议您的代理IP应该满足以下要求:

(1) 、高匿名,普通匿名不行,一定是高匿名,具体哪里可有购买这种,可去百度网上搜索,反正价格不菲。

(2) 、有效期时间长,至少2分钟之内是有效的,如果2分钟就过去了,网页还没有加载完,数据还还没有解析完IP就失效了,导致数据永远爬不下来。

(3) 、不重复,至少在30天内不重复的IP,因为动态IP是采用vps自动拨号原理来生成的,存在重复的可能,所以您需要过滤掉一些已经用过的IP.

(4) 、不限量,每天IP的数据不限制,随机改变

五、海量的裁判文书如何解析和存储?

裁判网有几个亿的裁判文书,我们爬下来的是html原始数据,下一步是需要对html原始数据清洗解析加工结构化存储,我们解析网页最好的工具肯定是python的BeautifulSoup,可以方便的解析案件内容,可以把被告、原告、时间、类型、内容、关键词、标题等解析出来然后结构化存储到数据库供后面的应用开发做检索和分析使用。裁判网数据量太大可以用mongdb,mongdb是一款做大数据结构化和非结构化存储的数据库,适合做爬虫的数据存储数据库,裁判网的数据量比较大,如果您全部吧数据存储到一个表去,那么前台系统的搜索几乎是动不了,所以我们需要按时间分库存储,比如2018年的数据做一个库,2019年的数据又做一个库,这样建立索引关系就解决数据量大查询速度问题。

六、代理IP池的搭建:

我们需要搭建自己高质量的代理IP池,这样才能保证源源不断的产出IP然后去请求目标网站,当时我用了几百台vps搭建了我自己的代理IP池,解决了封IP的问题。

七、数据清洗、数据提炼问题:

在爬数据的时候,会存在重复数据的问题,尤其是像这种网站数据的采集,我去年爬的时候整个网站大概有几百万的数据量,越爬到后面就越大,因为每次爬入库的时候都做了对比是否重复,这样导致速度很慢,最后我重新架构的数据库的结构,把数据库分为2个库,第一个库叫做原始数据库,也就是把爬虫从网站爬下的数据先存储到原始数据库,第二个数据库就是 标准库 我写一个数据清洗提炼的机器人,每天从原始数据库读取数据 进行去重分析 把完整的数据清洗提炼到标准库去,那么用户正式使用链接的数据库就是标准完整的不存在重复的数据库,这样爬虫和用户正式分开,性能非常好。下图是我做的爬虫系统的架构分享给大家。


原始库:数据库我们实现读写分离的简易架构,python爬虫不断的把数据采集下来并且写入到原始数据库,写入的时候不用做去重的判断,因为如果您在写入的时候就判断是否存在再去入库,那么当一个表里面有几千万的数据你逐个去匹配去重时候速度是非常慢的,几十分钟你才能成功插入一条新的数据,所以这个时候我们就应该把判断去重的工作交付给异步清洗处理,尽可能让采集新数据的工作压力越小越好,这样采集的速度就很快,爬虫就负责一直采集入库即可。

标准库:我们中间会有一个数据清洗过程,数据清洗其实很简单,就是把原始库的数据异步复制到标准库中,只是在复制插入到标准库的过程中先判断标准库是否已经存在该条数据了,如果存在就更新之前没有的字段,如果不存在就直接插入库一条。

数据清洗:我们一程序实现数据库复制和判断去重的,把原始库的数据复制一份到标准库后,立刻把原始库的意见清洗过的数据删除掉,为什么需要删除掉原始库已经清洗过的数据呢?因为如果不擅长,那么原始库越来越大,以后每次清洗数据量越来越大而且都是重复清洗,导致清洗工作重复和压力大。

代理IP:也许您会问这个代理IP池是做什么,又是怎么实现的呢?我们在爬网站的时候,需要用代理ip不能用我们自己电脑的IP去爬,原因是在你电脑直接运行代码那么爬虫的IP就是你电脑的IP ,如果一直频繁的去采集对方的网站,那么对方会检测到您的IP直接把您的IP列入黑名单导致你以后在也采集不了了。所以我所有的批量采集爬虫都采用代理IP去爬的,python怎么采用代理IP呢?其实很简单就那么一行代码就解决:

resp = requests.get(url, headers=self.headers, timeout=20, proxies=proxy)

我们调用的是 requestsget方法 里面有url、和headers以及 , proxies代理IP设置的参数。

url:就是我们采集的目标网站地址

headers:就是我们模拟访问对方网站时候需要模拟的头参数(这个参数怎么来呢,其实很简单,直接用火狐打开对方网站查看网络里面有和请求头那些参数复制过来即可)

Proxies:就是我们的设置我们的代理IP,代理IP是什么意思呢?代理服务器的工作机制很象我们生活中常常提及的代理商,假设你的机器为A机,你想获得的数据由B机提供,代理服务器为C机,那么具体的连接过程是这样的。 首先,A它与C机建立连接把请求发给C,C机接收到A机的数据请求后马上与B机建立连接,下载A机所请求的B机上的数据到本地,再将此数据发送至A机,完成代理任务。这样下载对方网站的数据的是代理服务器,而这个代理服务器IP是随机变动,对方就抓不到是谁一直采集他的数据了。那这个代理ip我们清楚了,这个ip代理池又是什么呢?我们运行我们的python程序的时候,每秒发一个http请求去爬对方网站一次,请求一次需要一个IP,那么这个ip怎么来呢?我们可以网上购买第三方那种ip接口,比如:每10秒中会返回1个IP给我们用,如果我们每次爬数据都先要调取代理IP接口得到IP了再去爬对方网站 那么这个效率和代码质量就低了,因为人家是10秒中才一个IP,您的程序速度和效率就直接卡在因为代理IP接口控制问题了,所以这个时候您需要改进代理IP代码架构,首先每10秒中读取代理IP接口得到的IP 缓存到reis去,并且设置60秒过期,那么这个redis就会形成一个代理IP池了,您的程序代码爬对方网站时候直接从redis读取IP去爬,这样速度就快了,程序架构就优化了。

今天时间不多了,先分享到这里,

最近我一直从事大数据挖掘技术研发和AI研发,曾经通过网络神经技术研发了数据挖掘AI模型,采用网络数据挖掘技术开发了天某查企、中文裁判文书网、专利网的数据深度挖掘系统,采用分布式+集群技术实现千万级的数据深度挖掘,最近在深入探究健康医疗、土地交易、酒店、地图等领域数据深度挖掘技术研究,欢迎广大对大数据和AI技术感兴趣的朋友,欢迎加我q2779571288交流!

(特别说明:本文章主要是Python网络请求协议、数据采集技术学习交流和分享讨论,主要是用公开、开放的网站部分数据作为学习案例,交流技术思路,不牵涉到保密和隐私数据)。

转载来源:https://www.fagaoba.com/article/156776115957518980.html

请选择您浏览此新闻时的心情

相关新闻
网友评论
本文共有人参与评论
用户名:
密码:
验证码:  
匿名发表