Python爬虫入门(四)教你免费拥有自己的代理IP池

众所周知,目前有很多网站的服务器数据并不想很轻易的被别人抓取,并且当你的爬虫程序过于“霸道”时,很容易将一些小厂的服务器卡死。针对这些,一般服务器都会设置一下反爬策略。其中比较有效的反爬策略的就是针对来访者的IP做相关阈值限制。比如说当一个IP访问速度过快,超过设定的阈值,那么网站就会认为这不是用户行为,这是一个爬虫程序,然后就会封锁你的IP。轻则几个小时,重则永封。

然而作为爬虫程序的设计者,为了避免IP被封锁,或者是想快速的爬取数据,就需要使用多个IP地址。目前网上有很多能提供可靠、稳定的IP代理服务,但是基本都是收费的,而且价格不菲。下面小编来讲一下自己是如何建立免费的代理IP池的。

一、设计思路

爬取免费提供代理IP的网站,提取一定数量的IP,接着验证这些IP的可用性,然后保存这些IP供爬虫时使用。由于免费IP代理网站提供的IP可用性和稳定性都比较低,所以需要程序大量爬取才可以获得一些可用IP。

二、开发环境

Python3.6.1,IDE是pycharm,系统是win10。主要使用到的库:requests、re。由于验证IP可用性时单进程效率较低,小编最后也使用了multiprocessing进程池Pool来提供程序的效率,开进程池不属于本文重点,所以不做过多介绍。

三、设计过程

1、爬取“西刺代理”

这里需要说明以下,虽然西刺代理提供了API接口,但是要15分钟才会更新一次,对于想要快速抓取大量IP时并不好用。并且,由于这些免费IP有很多时效性很短,你必须快速抓取并且快速使用,不然很容易就失效了。所有西刺提供的这个API基本没用,很多时候还是需要爬取的,并没有起到减轻服务器压力的作用。

打开西刺代理的免费“高匿”服务选项,观察网页源码。如下图:

西刺是非常的厚道、良心啊,很简单的源码,爬取也很简单。IP地址、端口、协议等信息都存在了标签为table、属性IP为ip_list的下面,并且一次性加载,不存在动态加载。而且api也不用抓取,显示在地址栏,只需替换页面。第一页的api:http://www.xicidaili.com/nn/1,后续页面更换最后一个数字即可。小编由于很懒,非常非常的懒…所以就用正则re来匹配所有相应的内容了。也可以用xpath,beautifulsoup等方法很多,选择自己擅长顺手的即可。抓取及筛选并不复杂,小编就直接贴一下自己代码了。

OK,这个函数的参数为yeshu,所以你可以输入选择爬第几页。当然,如果只爬一页的话,最好还是爬第一页,因为第一页的IP比较新,时效性及稳定性都较好。爬取第一页结果如下:

很轻松就得到了100个IP,这里需要说明一下:上边代码中proxy是用format函数来设置的存贮格式,设置完的格式例如“HTTP#122.114.31.177:808”协议和地址端口用#分开存贮,我们后续用的时候只需split一下即可。

爬取函数设置完了,下边就该验证这些IP的可用性了。

2、测试IP的可用性

怎么测试IP是否能用?小编的思路是用这个IP去访问一个验证网址,然后看返回的网络状态码(这个之前的文章讲过),如果是200,说明访问成功,IP有效。如果访问出错或是返回的状态码不是200,说明IP不可用。这里要设定一个访问超时限制,根据自己需求而定,不然有些代理ip稳定性很差,访问一个网页需要5-10s,这样ip我们留着也没有意义。

需要注意的是,这里的验证网址一定要选择一个不怕被爬,服务器强大稳定的网站。有这样的网站吗?当然有,而且是大厂,https://www.baidu.com

这个测试部分代码也不难,所致直接放代码了,不懂的可以看注释

运行结果如下:

哎,免费的始终是免费的,100个里也就几个ip能用,所以需要多爬一些,然后多验证一些。在调试时小编发现这个验证的速度是真的慢,所以利用进程池pool开了多进程,我这个是4核电脑,所以我开了10个进程。符合基本“核数*2+2”的原则。开了多进程后效率明显提高8-10倍左右。

3、整合代码

关于多进程及进程池的内容我在这就不多说了,后续单开一篇再记录一下。我就直接贴我整合后源码了,仅供参考:

以上程序是开了10进程,爬取了西刺代理网站中的高匿IP前50页。速度很快,大概5分钟所有就爬取完毕了。需要说一下,这里如果想开更多进程,需要注意一下自己的宽带带宽,开太多进程的话如果达到了你带宽限制,就会出现求情后返回空页面的情况,反而会影响爬虫的效率。

上边程序运行的结果如下,还是有一定数量的IP是能用的,基本可以满足个人使用。

四、总结

通过这个方法,基本可以实现免费的个人代理ip池。由于这些免费的ip稳定性很差,所以建议在爬虫使用前再验证一遍,很容易实现,可以直接调用自己写过的测试函数。

还有就是,在爬取西刺代理时一定要注意速度。前段时间小编抽风开了50进程爬取…结果就是ip被封了。不,是在所有爬虫时都要适当降速。

文明爬虫,从我做起。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180610G0US9P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券