在爬虫的过程中若爬取速度过快可能会导致IP地址被封,短时间内无法再去访问想要爬取的网站信息内容。
这时候我们就要去代理池模块中调取代理,若出现再次被封的情况再去从代理池中获取新的代理,如此循环。
但如果每次爬虫都要复写一段这样的调取代码,那为什么不做成一个模块后期使用引入呢?代理池辅助接口便由此诞生
思路:
根据前面分析该类中需有以下三种方法:
1.连接代理池,从代理池中把可用的IP代理地址以列表形式存储起来;
2.获取代理列表的首个代理作为初始代理IP;
3.检测到当前代理失效或者被封无法返回信息时剔除该代理,并从列表中读取下一个IP作为代理进行爬虫
在这边值得注意的是如果检测到代理列表为空,也就是代理都用完了,就再去调用连接代理池获取IP代理地址的模块,重新生成新的代理池,这样也就形成了一个闭合环,程序能够无限循环不中断。
具体代码如下:
#导入IP代理池获取IP模块
from ip_pool import IP_Pool
class ProxyHelper(object):
IP_poll = []
#列表当前索引
poll_index = 0
def __init__(self):
self.get_proxy_from_ip_pool()
#初始化代理IP地址
self.proxy = self.IP_poll[self.poll_index]
#得到代理IP地址
def get_proxy(self):
print('当前使用的IP是:'+self.proxy)
return self.proxy
#更新代理IP地址
def update_proxy(self):
#移除当前被封IP
self.IP_poll.remove(self.IP_poll[self.poll_index])
#判断IP列表是否为空
if len(self.IP_poll):
self.proxy = self.IP_poll[self.poll_index]
else:
self.get_proxy_from_ip_pool()
self.proxy = self.IP_poll[self.poll_index]
#从ip_pool接口得到可用IP地址列表
def get_proxy_from_ip_pool(self):
self.IP_poll = IP_Pool().ip_pool_func()
if __name__ == '__main__':
ProxyHelper().update_proxy()
关于获取测试代理ip可以跳转至下面这个博文 :
https://blog.csdn.net/weixin_44354777/article/details/100803598
补充:多进程在Windows下运行必须从Main函数开始(if __name__ == '__main__'),否则会报错。
建议处理方式:在 scrapy 中 建立 run xx.py 中 scrapy crawl py文件名 上面先跑一遍代理池 (用多进程写的) 不会报错