SsdbClient.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. -------------------------------------------------
  5. File Name: ssdbClient.py
  6. Description : 封装SSDB操作
  7. Author : JHao
  8. date: 2016/12/2
  9. -------------------------------------------------
  10. Change Activity:
  11. 2016/12/2:
  12. 2017/09/22: PY3中 redis-py返回的数据是bytes型
  13. 2017/09/27: 修改pop()方法 返回{proxy:value}字典
  14. 2020/07/03: 2.1.0 优化代码结构
  15. -------------------------------------------------
  16. """
  17. __author__ = 'JHao'
  18. from redis.connection import BlockingConnectionPool
  19. from random import choice
  20. from redis import Redis
  21. class SsdbClient(object):
  22. """
  23. SSDB client
  24. SSDB中代理存放的结构为hash:
  25. key为代理的ip:por, value为代理属性的字典;
  26. """
  27. def __init__(self, **kwargs):
  28. """
  29. init
  30. :param host: host
  31. :param port: port
  32. :param password: password
  33. :return:
  34. """
  35. self.name = ""
  36. kwargs.pop("username")
  37. self.__conn = Redis(connection_pool=BlockingConnectionPool(decode_responses=True, **kwargs))
  38. def get(self):
  39. """
  40. 从hash中随机返回一个代理
  41. :return:
  42. """
  43. proxies = self.__conn.hkeys(self.name)
  44. proxy = choice(proxies) if proxies else None
  45. if proxy:
  46. return self.__conn.hget(self.name, proxy)
  47. else:
  48. return None
  49. def put(self, proxy_obj):
  50. """
  51. 将代理放入hash
  52. :param proxy_obj: Proxy obj
  53. :return:
  54. """
  55. result = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  56. return result
  57. def pop(self):
  58. """
  59. 顺序弹出一个代理
  60. :return: proxy
  61. """
  62. proxies = self.__conn.hkeys(self.name)
  63. for proxy in proxies:
  64. proxy_info = self.__conn.hget(self.name, proxy)
  65. self.__conn.hdel(self.name, proxy)
  66. return proxy_info
  67. else:
  68. return None
  69. def delete(self, proxy_str):
  70. """
  71. 移除指定代理, 使用changeTable指定hash name
  72. :param proxy_str: proxy str
  73. :return:
  74. """
  75. self.__conn.hdel(self.name, proxy_str)
  76. def exists(self, proxy_str):
  77. """
  78. 判断指定代理是否存在, 使用changeTable指定hash name
  79. :param proxy_str: proxy str
  80. :return:
  81. """
  82. return self.__conn.hexists(self.name, proxy_str)
  83. def update(self, proxy_obj):
  84. """
  85. 更新 proxy 属性
  86. :param proxy_obj:
  87. :return:
  88. """
  89. self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  90. def getAll(self):
  91. """
  92. 字典形式返回所有代理, 使用changeTable指定hash name
  93. :return:
  94. """
  95. item_dict = self.__conn.hgetall(self.name)
  96. return item_dict
  97. def clear(self):
  98. """
  99. 清空所有代理, 使用changeTable指定hash name
  100. :return:
  101. """
  102. return self.__conn.delete(self.name)
  103. def getCount(self):
  104. """
  105. 返回代理数量
  106. :return:
  107. """
  108. return self.__conn.hlen(self.name)
  109. def changeTable(self, name):
  110. """
  111. 切换操作对象
  112. :param name:
  113. :return:
  114. """
  115. self.name = name