爬取网站总是被封?大神教你搭建Cookies池,以后…

2018-07-13 02:46:27来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

摘要

本文作者:崔庆才

GitHub地址:https://github.com/Python3WebSpider/CookiesPool

小编推荐一本崔大大写的网络爬虫的书籍《Python3网络爬虫开发实战》

Python学习交流群:125240963即可获取

很多时候,在爬取没有登录的情况下,我们也可以访问一部分页面或请求一些接口,因为毕竟网站本身需要做SEO,不会对所有页面都设置登录限制。

但是,不登录直接爬取会有一些弊端,弊端主要有以下两点。

  1. 设置了登录限制的页面无法爬取。比如论坛,博客等等
  2. 如果没有登录请求频繁就很容易被限制或者IP直接被封

下面我们就第二种情况做一个简单的实验。以微博为例,我们先找到一个Ajax接口,例如新浪财经官方微博的信息接口

如果用浏览器直接访问,返回的数据是JSON格式,如下图所示:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

但是如果频繁访问的话:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

登录微博账号之后重新打开此链接,则页面正常显示接口的结果,而未登录的页面仍然显示请求过于频繁,如下图所示:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

我们以新浪微博为例来实现一个Cookies池的搭建过程。

准备工作

搭建之前肯定需要一些微博的账号。需要安装好Redis数据库并使其正常运行。需要安装Python的RedisPy、requests、Selelnium、Flask库。另外,还需要安装Chrome浏览器并配置好ChromeDriver。

Cookies池架构

Cookies的架构和代理池类似,同样是4个核心模块,如下图所示。

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

Cookies池架构的基本模块分为4块:存储模块、生成模块、检测模块、接口模块。

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

Cookies池的实现

存储模块

需要存储的内容无非就是账号信息和Cookies信息。

建立两个Hash,结构分别如下图所示。

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

Hash的Key就是账号,Value对应着密码或者Cookies。

接下来我们创建一个存储模块类,用以提供一些Hash的基本操作,代码如下:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

生成模块

生成模块负责获取各个账号信息并模拟登录,随后生成Cookies并保存。

这里主要逻辑就是找出那些还没有对应Cookies的账号,然后再逐个获取Cookies,代码如下:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

因为我们对接的是新浪微博,前面我们已经破解了新浪微博的四宫格验证码,在这里我们直接对接过来即可,不过现在需要加一个获取Cookies的方法,并针对不同的情况返回不同的结果,逻辑如下所示:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

这里返回结果的类型是字典,并且附有状态码status,在生成模块里我们可以根据不同的状态码做不同的处理。例如

状态码为1的情况:表示成功获取Cookies,我们只需要将Cookies保存到数据库即可。

状态码为2的情况:代表用户名或密码错误,那么我们就应该把当前数据库中存储的账号信息删除。

状态码为3的情况:代表登录失败的一些错误,此时不能判断是否用户名或密码错误,也不能成功获取Cookies,那么简单提示再进行下一个处理即可。

代码实现如下所示:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

检测模块

检测模块需要做的就是检测Cookies失效,然后将其从数据中移除。

我们还需要增加一个定时检测模块,它负责遍历池中的所有Cookies,同时设置好对应的检测链接,我们用一个个Cookies去请求这个链接。

为了实现通用可扩展性,我们首先定义一个检测器的父类,声明一些通用组件,实现如下所示:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

如检测微博的就可以定义为WeiboValidTester,实现其独有的test()方法来检测微博的Cookies是否合法,然后做相应的处理,所以在这里我们还需要再加一个子类来继承这个ValidTester,重写其test()方法,实现如下:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

接口模块

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

调度模块

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

运行效果

三个进程全部开启:

爬取网站总是被封?大神教你搭建Cookies池,以后远离IP被封

 

Python学习交流群:125240963领取小编精心准备的海量Python学习资料

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:动态网页怎么爬?这样爬才是最适合零基础小白的!刚学两天就会了

下一篇:来自非专业Python讲师的一份Django考题,面试无忧!