db.py 1.4 KB

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