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

前言:

    当分布式爬虫使用代理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 __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

 

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值