分享-python爬虫遇到封IP+验证码+登陆限制,如何解决?

2019-11-11 18:02:14 浏览数 (1)

python爬虫遇到封IP 验证码 登陆限制,如何解决?方案分享

现在国家在鼓励做大数据、全面进行数字化中国建设,很多企业包括很多有前瞻性的创业人都开始进军大数据,各种根据自己的擅长领域开始储备数据源,我们需要做大数据第一步就是利用网络爬虫技术解决数据源聚合问题。我2018年主要利用python3 mysql cookie池 代理IP池自己研发了一套AI智能深度数据挖掘系统,主要是解决企业工商数据源、商标数据源、专利数据源、招标中标数据源、土地数据源、食品药品数据源等多种国家开放的数据源的聚合。当时在做企业工商数据源聚合挖掘时候遇到了封IP、验证码、还有会员登陆等等各种反爬机制,最终我通过各种技术方式解决了所有问题,下面将分享一下个人的一些经验。

二、分享python爬虫、数据挖掘遇到的那些坑

举例:我们企某查或者企某查这种企业工商大数据网站的数据爬取的数据,首先应该评估一下数据量有多大,企某查应该是千万级上亿级的数据,我们需要做一个大数据架构来支撑这个亿级的数量存储和爬取工作,免得到时数据大了都动不了了反而就是这个灾难。整个数据架构分为原始库 标准库 数据清洗 代理IP池等。

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

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

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

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

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

我们调用的是 requests的get方法 里面有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去爬,这样速度就快了,程序架构就优化了。

采集速度太频繁了,会被封IP问题 怎么解决

当我们发出去的http请求到天谋查网站的时候,正常情况下返回200状态,说明请求合法被接受,而且会看到返回的数据,但是天谋查有自己的一套反爬机制算法,如果检查到同一个IP来不断的采集他网站的数据,那么他会被这个IP列入异常黑名单,您再去采集它网站数据的时候,那么就永远被拦截了。怎么解决这个问题呢,其实很简单,没有错用代理IP去访问,每一次请求的时候都采用代理IP方式去请求,而且这个代理IP是随机变动的,每次请求都不同,所以用这个代理IP技术解决了被封的问题。

自己搭建代理池ip

做爬虫技术都知道,代理IP的质量决定了爬虫的效率,要想爬快一点,必须选择质量好,高匿名、不重复、时间长的IP,在选择代理IP的时候,市场价格好的搭理IP一般是6000/月,所以当时为了避免这个费用成本,就自己搭建了自己IP代理池,利用技术优势节省了一大截成本。

爬企某查是怎么知道我们使用代理IP的呢?

想知道代理IP的问题,我先要理解清楚 代理IP里的“透明”“匿名”“高匿”分别是指什么:

透明代理IP::就是我们用这个代理IP去采集企某查的时候,不会隐藏我们自己的IP,我们的IP一种是暴漏透明的,那么企某查会很快识别到同一个客户端IP重复访问采集它的网站数据,就会把这个IP拉入黑名单做个标记,下次你在去采集的时候直接被封了。

普通匿名代理IP:能隐藏我们客户机的真实IP,但是有一个坏处就是但会改变我们的请求信息,企某查有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip,所以这种IP是不适合去采集企某查的数据的。

高匿名代理IP: 这种IP是不会改变客户机的请求,这样在服务器看来就像有个真正的客户用浏览器在访问它,这时客户的真实IP是隐藏的,服务器端(企某查)不会认为我们使用了代理,我们在采集企某查的应该选用这种高匿名的IP,那么哪里去找这种代理IP呢,下面的小结将会给大家介绍。

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

怎么知道企某查封了我们的IP呢?

您去爬企某查的时候,如果您的IP被封或者不正常,企某查就会返回登录页面,出现登录界面就说明您的ip被封了,或者被监控到异常了。所以我们在爬数据的时候,用正则匹配一下是否有注册登录的界面html标签字符,如果出现登录界面马上重新换一个IP重新请求,就一直执行循环直到换到正常的可用的IP为止即可。

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

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

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

(2) 您的代理IP网络不到达不通导致

(3) 你的代理IP不是高匿名的,直接被识别出来

(4) 您的代理IP已经被其他人用过爬企某查了,早被列入黑名单,导致你永远IP被封。

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

4、爬企某查应该选用什么样的代理IP?

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

(1) 、高匿名,普通匿名不行,一定是高匿名

(2) 、有效期时间长,至少2分钟之内是有效的

(3) 、不重复,至少在30天内不重复的IP

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

时间有限,先分享到这里,我得写代码去..........

0 人点赞