db.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """
  2. -------------------------------------------------
  3. File Name: db.py
  4. Description: 数据库操作模块,负责对象与底层数据库
  5. 的交互。
  6. Author: Liu
  7. Date: 2016/12/9
  8. -------------------------------------------------
  9. """
  10. import redis
  11. from .error import PoolEmptyError
  12. from .setting import HOST, PORT
  13. class RedisClient(object):
  14. """
  15. Redis数据库操作类。
  16. """
  17. def __init__(self, host=HOST, port=PORT):
  18. self.__db = redis.Redis(host, port)
  19. def get(self, count=1):
  20. """从Pool中获取一定量数据。"""
  21. proxies = self.__db.lrange("proxies", 0, count - 1)
  22. self.__db.ltrim("proxies", count, -1)
  23. return proxies
  24. def put(self, proxy):
  25. """将代理压入Pool中。
  26. 用Redis的set容器来负责去重,如果proxy能被压入proxy_set,
  27. 就将其放入proxy pool中,否则不压入。
  28. """
  29. if self.__db.sadd("proxy_set", proxy):
  30. self.__db.rpush("proxies", proxy)
  31. else:
  32. pass
  33. def put_many(self, proxies):
  34. """将一定量的代理压入Pool。
  35. """
  36. for proxy in proxies:
  37. self.put(proxy)
  38. def pop(self):
  39. """弹出一个可用代理。
  40. """
  41. try:
  42. return self.__db.blpop("proxies", 30)[1].decode('utf-8')
  43. except:
  44. raise PoolEmptyError
  45. @property
  46. def queue_len(self):
  47. """获取proxy pool的大小。
  48. """
  49. return self.__db.llen("proxies")
  50. def flush(self):
  51. """刷新Redis中的全部内容,测试用。
  52. """
  53. self.__db.flushall()