您的位置:首页 > 运维架构 > 网站架构

[爬虫架构] 如何在分布式爬虫架构中动态维护一个代理IP池(付费代理)

2018-04-17 13:21 274 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sc_lilei/article/details/79973112

前言:

    当分布式爬虫使用代理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模块参数配置:
 

[code]"""必要配置"""
#获取代理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中的应用:

[code]from proxy_2_redis import init_redis,list_key

class HeaderMiddleware(object):
def __init__(self):
r = init_redis()

def process_request(self,request,spider):
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的实时性。


模块获取地址:Github

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐