githu源码地址:
https://github.com/Germey/ProxyPool
更好的代理池维护:
https://github.com/Python3WebSpider/ProxyPool 下面文章的源地址:https://blog.csdn.net/polyhedronx/article/details/81485458 针对代理池中的代理IP可能会重复的问题,提出了一种解决方法,实测可行。 代理IP之所以会重复,和Redis数据库使用的数据结构有很大关系,原程序使用的是列表(list)结构,数据以列表形式存入数据库后是有序但允许重复的,当有新的数据存入时,并不会对数据的重复性进行检查和处理。但Redis不仅有列表结构,常见的Redis数据结构有String、Hash、List、Set(集合)和Sorted Set(有序集合),使用Set和Sorted Set结构就不会出现重复元素。 Set是无序集合,元素无序排列,当有重复元素存入时,数据库是不会发生变化的;Sorted Set是有序集合,有序集合是可排序的,但是它和列表使用索引下标进行排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据,当存入一个元素时,同时需要存入该元素的分数。 Sorted Set使用起来较复杂,主要是分数分配问题比较难搞,所以这里使用Set代替原程序中的List作为数据库的数据结构,将以下内容代替原来的“db.py”文件中的内容即可: # db.py import redis
from proxypool.error import PoolEmptyError
from proxypool.setting import HOST, PORT, PASSWORD class RedisClient(object):
def __init__(self, host=HOST, port=PORT):
if PASSWORD:
self._db = redis.Redis(host=host, port=port, password=PASSWORD)
else:
self._db = redis.Redis(host=host, port=port) def get(self, count=1):
"""
get proxies from redis
"""
proxies = []
for i in range(count):
proxies.append(self._db.spop("proxies"))
return proxies def put(self, proxy):
"""
add proxy to right top
"""
self._db.sadd("proxies", proxy) def pop(self):
"""
get proxy from right.
"""
try:
return self._db.spop("proxies").decode('utf-8')
except:
raise PoolEmptyError @property
def queue_len(self):
"""
get length from queue.
"""
return self._db.scard("proxies") def flush(self):
"""
flush db
"""
self._db.flushall() if __name__ == '__main__':
conn = RedisClient()
print(conn.pop())
将数据结构改为Set以后,便不会出现代理池中代理IP重复的问题,但这样做也是有弊端的,因为Set是无序的,所以更新代理池的过程中每次弹出的代理IP也是随机的,这样代理池中的某些代理可能永远也不会被更新,而我们获取代理时采用pop方法得到的也是代理池中随机弹出的代理,该代理有可能是很久没有被更新的已经失效的代理。 总结一下就是使用Set结构可以保证代理池中的代理不会重复,但不能保证调用代理池获取代理时得到的代理是最新的和可用的,而List结构可以保证当前获取的代理是最新的,但代理池中的代理可能会有很大的重复。总之,两种方法都是有利有弊的,当然也可以尝试用有序集合(Sorted Set)构建一种完美的方法了。

最新文章

  1. 建模前的数据清洗/ETL(python)
  2. 《DSP using MATLAB》示例Example5.11
  3. CSS大美集
  4. 神舟K650c i7(W350STQ)上成功装好Mac OS X 10.9,兼谈如何安装WinXP、7、8.1、OSX、Ubuntu五系统(Chameleon、MBR)
  5. Linux编辑器的选择使用
  6. PPT扁平化手册 2
  7. POJ2250:Compromise(LCS)
  8. PHP版本的区别
  9. Quartz入门指南
  10. [转载] Dubbo实现RPC调用使用入门
  11. 【总结】Java异常分类
  12. 图解HTTP第七章
  13. java时间计算
  14. C++11之 std::atomic (不用锁实现线程互斥)
  15. linux程序的常用保护机制
  16. PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题
  17. centos 6无法上外网
  18. 2017-2018-1 JAVA实验站 冲刺 day05
  19. 求矩阵中各列数字的和 Exercise08_01
  20. go——切片

热门文章

  1. 如何配置React Native真机调试-iOS
  2. Centos7单机部署ELK+x-pack
  3. mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)
  4. Spring IOC分析
  5. Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法
  6. Apache-Flink深度解析-SQL概览
  7. Ubuntu环境下mysql常见的操作
  8. 使用awk和sed获取文件奇偶数行的方法总结
  9. python使用多进程
  10. Redis持久化及其配置