前言:
当分布式爬虫使用代理IP技术时,通过直接在爬虫程序中添加平台api接口的方式已经不能满足我们了,因为分布式的爬虫架构每秒的代理IP-URL的请求数会远远大于平台限制的请求频率,当然,对于没有限制的套餐此处不考虑,但为了爬虫能够稳定的获取代理IP,我们仍需要维护一个本地的代理IP池。
准备工作:
需要的工具:
- 搭建好的一台Redis服务器
思路:
要动态维护一个代理IP池,需要实现两个必须的功能:
1、往Redis服务中push新的IP
2、定时监测Redis服务中代理IP池中的剩余IP数量,当少于N个时,添加M个新的IP
可优化的功能:
1、将使用过的IP数量单独存储在Redis服务的另一个key中
程序需要拥有的特性:
1、良好的可移植性
2、模块化
3、使用简便
使用:
1、proxy_2_redis模块参数配置:
"""必要配置""" #获取代理IP的url:示例为【快代理平台-开放代理-vip套餐,返回json数据】,其他平台则根据情况修改download_proxy_ip函数 proxy_url = 'http://dev.kuaidaili.com/api/getproxy/?orderid=952388528527534&num=20&b_pcchrome=1&b_pcie=1&b_pcff=1&protocol=1&method=1&an_an=1&an_ha=1&sp1=1&sp2=1&quality=1&format=json&sep=1' #redis中代理IP池存储的key名 list_key = 'proxy_list' #当IP池内IP数小于多少时添加新的IP lower = 10 #redis中使用过的IP数量存储的key名 used_ip_number_key = 'used_ip_number'
2、运行proxy_2_redis.py,输出如下:
3、在spider中导入相关函数,获取并为spider设置代理,以下为在scrapy中的应用:
from proxy_2_redis import init_redis,list_key class HeaderMiddleware(object): def process_request(self,request,spider): request.headers.setdefault('Referer',spider.begin_url) r = init_redis() ip = r.rpop(list_key) if ip: proxy = 'http://'+ ip #print proxy request.meta['proxy'] = proxy else: print 'middleware:没有IP了'
4、启动Spider,查看proxy_2_redis输出日志。
提示:实际使用此模块时,需要根据爬虫对代理的请求频率动态调整lower参数和每次添加的IP数(在URL中修改),以尽量确保代理池中IP的实时性。
模块获取地址(点个star犒劳一下吧): Github