python爬虫-代理IP池的维护

  • 内容
  • 相关


使用代理的初衷:

  • 防止对方服务器的反爬

  • 隐藏自己的真实的IP地址,防止被追究责任

服务器在很多时候都会根据我们对应客户端的访问频率来对我们的程序进行判断是否是爬虫,尤其是对ip地址这一块,因为ip是用来标记电脑在网络上的唯一位置,一个电脑对应的会有一个ip地址,当我们在当前的一台电脑上运行我们的爬虫程序的时候,由于爬虫速度很快,不像是一个正常人在访问对方的服务器,那么对方很容易的就会将我们的程序识别为爬虫,将我们的程序进行反爬。 解决这种问题的话,我们可以使用代理ip的方式来进行访问对方的服务器,通过购买代理ip,来组建代理ip池,在每一次访问的时候我们随机的使用一个代理ip来访问对方的网站,或者是降低我们访问的频率。

代理IP的话,在网上有大量公开的免费的代理IP,这种免费公开的代理是极其不稳定的,我们可以找一下付费的代理,来提高代理IP的使用效率,但是代理不论是免费的还是付费的,都不能保证都是可用的,因为可能此IP被其他人使用来爬取同样的目标网站而被封禁,或者代理服务器发生故障或者网络繁忙,也有可能要抓取的网站也购买了代理网站上的代理IP用来判断我们爬虫程序的IP是否是属于代理IP网站上的IP。

在上面也说了,不管是免费的代理还是付费的代理,在使用的过程中都是不稳定的,所以我们在使用代理之前,还是要对代理进行提前的筛选,将不可用的代理剔除掉,保留可用的代理。

1.存储模块

负责存储抓取下来的代理,设计的存储模块的时候,我们应该考虑到的是保证代理不重复,要标识出代理的可用情况,还要动态实时处理每个代理,考虑到这种情况,我们就需要一种比较高效和方便的存储方式来对代理IP进行存储,这里可以选用redis的zset 也就是有序集合。

2.获取模块

需要定时的在各大代理网站进行数据的抓取,代理可以是免费的公开代理,也可以是付费的代理,代理的形式都是IP+端口号,此模块尽量从不同的来源获取,尽量的抓取高匿代理,抓取成功之后将可用 代理保存到数据库中。

3.检测模块

需要定时到的检测数据库中的代理,这里需要设置一个检测连接,最好是爬取那个网站就检测那个网站,这样更加的有针对性。我们还需要标识每一个代理的状态,在存储模块的时候我们说了,我们选择 redis 中的 zset 来进行存储,我们就可以给代理设置一个分数的标识,100 分表示可用,分数越少表示代理越不可用,检测一次,如果代理可用,我们可以将分数的标识立即设置为 100,也可以在原基础上 +1 ,如果代理不可用,可以将分数 -1 ,当分数减到一定的阈值后,代理就直接从数据库中移除。

4.接口模块

需要用 API 来提供对外服务的接口,这里的话我们可以直接的去连接数据库来获取代理的数据,但是这样的话我们需要知道数据库的连接信息,并且要配置连接,比较安全和方便的方式就是提供一个 WebAPI 的接口,我们可以通过访问接口就可以拿到可用代理,另外,由于可用的代理有多个,那么我们就可以设置一个随机返回某个可用代理的接口。

代理池维护设计图:

ippool.png


代理池分为 4 个模块 : 存储模块、获取模块、检测模块、接口模块。

  • 存储模块 使用 Redis 的有序集合,用来做代理的去重和状态标识,同时它也是中心模块和基础模块,将其他模块串联起来 。

  • 获取模块 定时从代理网站获取代理,将获取的代理传递给存储模块,并保存到数据库 。

  • 检测模块 定时通过存储模块获取所有代理,并对代理进行检测,根据不同的检测结果对代理 设置不同的标识。

  • 接口模块 通过 WebAPI 提供服务接口,接口通过连接数据库并通过 Web形式返回可用的代理。

最终实现的效果

run.gif


您阅读这篇文章共花了:  

本文标签:

版权声明:转载请带上版权原创为《星城

解压密码:若设有密码均为:www.xcooo.cn

收录状态:百度已收录点击查看详情

python爬虫-代理IP池的维护

发表评论

您可以选择匿名评论,保护个人隐私 !