[爬虫架构] 如何在分布式爬虫架构中动态维护一个代理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 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


猜你喜欢

转载自blog.csdn.net/sc_lilei/article/details/79973112