[爬虫架构] 如何在分布式爬虫架构中动态维护一个代理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
相关文章推荐
- [爬虫架构] 如何设计一个分布式爬虫架构
- 如何设计一个麻雀般的微型分布式架构?
- .NET : 如何动态根据一个业务实体类型创建XSD架构文件
- 爬虫如何正确使用动态代理?
- .NET : 如何动态根据一个业务实体类型创建XSD架构文件
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- 如何利用动态代理技术构建一个通用的,获取代理类的简单框架?
- 如何构建一个分布式爬虫:理论篇
- Redis 集群模式的工作原理?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?如何动态增加和删除一个节点?
- 【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式
- 如何构建一个分布式爬虫
- Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)
- 企业级分布式爬虫使用代理IP抓数据思路架构与实现_用百变IP抓数据
- 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理
- 如何写一个RPC框架(二):利用Bean容器和动态代理简化客户端代码
- java中如何使用asm动态的生成或修改一个class文件以及asm的架构思想
- 请画出一个抓虫系统的架构图并说明你的爬虫需要如何优化来提升性能
- 分布式下的爬虫Scrapy应该如何做-关于动态内容js或者ajax处理(2)
- 如何构建一个分布式爬虫:基础篇
- 如何直接维护一个已经存在的透明表(转账表)