ssdbClient.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. -------------------------------------------------
  15. """
  16. __author__ = 'JHao'
  17. from config.setting import PY3
  18. from redis.connection import BlockingConnectionPool
  19. from redis import Redis
  20. class SsdbClient(object):
  21. """
  22. SSDB client
  23. SSDB中代理存放的结构为hash:
  24. 原始代理存放在name为raw_proxy的hash中, key为代理的ip:por, value为代理属性的字典;
  25. 验证后的代理存放在name为useful_proxy的hash中, key为代理的ip:port, value为代理属性的字典;
  26. """
  27. def __init__(self, name, **kwargs):
  28. """
  29. init
  30. :param name: hash name
  31. :param host: host
  32. :param port: port
  33. :param password: password
  34. :return:
  35. """
  36. self.name = name
  37. self.__conn = Redis(connection_pool=BlockingConnectionPool(**kwargs))
  38. def get(self, proxy_str):
  39. """
  40. 从hash中获取对应的proxy, 使用前需要调用changeTable()
  41. :param proxy_str: proxy str
  42. :return:
  43. """
  44. data = self.__conn.hget(name=self.name, key=proxy_str)
  45. if data:
  46. return data.decode('utf-8') if PY3 else data
  47. else:
  48. return None
  49. def put(self, proxy_obj):
  50. """
  51. 将代理放入hash, 使用changeTable指定hash name
  52. :param proxy_obj: Proxy obj
  53. :return:
  54. """
  55. data = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.info_json)
  56. return data
  57. def delete(self, proxy_str):
  58. """
  59. 移除指定代理, 使用changeTable指定hash name
  60. :param proxy_str: proxy str
  61. :return:
  62. """
  63. self.__conn.hdel(self.name, proxy_str)
  64. def exists(self, proxy_str):
  65. """
  66. 判断指定代理是否存在, 使用changeTable指定hash name
  67. :param proxy_str: proxy str
  68. :return:
  69. """
  70. return self.__conn.hexists(self.name, proxy_str)
  71. def update(self, proxy_obj):
  72. """
  73. 更新 proxy 属性
  74. :param proxy_obj:
  75. :return:
  76. """
  77. self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.info_json)
  78. def pop(self):
  79. """
  80. 弹出一个代理
  81. :return: dict {proxy: value}
  82. """
  83. # proxies = self.__conn.hkeys(self.name)
  84. # if proxies:
  85. # proxy = random.choice(proxies)
  86. # value = self.__conn.hget(self.name, proxy)
  87. # self.delete(proxy)
  88. # return {'proxy': proxy.decode('utf-8') if PY3 else proxy,
  89. # 'value': value.decode('utf-8') if PY3 and value else value}
  90. return None
  91. def getAll(self):
  92. """
  93. 列表形式返回所有代理, 使用changeTable指定hash name
  94. :return:
  95. """
  96. item_dict = self.__conn.hgetall(self.name)
  97. if PY3:
  98. return [value.decode('utf8') for key, value in item_dict.items()]
  99. else:
  100. return item_dict.values()
  101. def clear(self):
  102. """
  103. 清空所有代理, 使用changeTable指定hash name
  104. :return:
  105. """
  106. return self.__conn.execute_command("hclear", self.name)
  107. def getNumber(self):
  108. """
  109. 返回代理数量
  110. :return:
  111. """
  112. return self.__conn.hlen(self.name)
  113. def changeTable(self, name):
  114. """
  115. 切换操作对象
  116. :param name: raw_proxy/useful_proxy
  117. :return:
  118. """
  119. self.name = name