db.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. print(proxies)
  15. return proxies
  16. def put(self, proxy):
  17. """将代理压入Pool中。
  18. 用Redis的set容器来负责去重,如果proxy能被压入proxy_set,
  19. 就将其放入proxy pool中,否则不压入。
  20. """
  21. if self._db.sadd("set", proxy):
  22. self._db.rpush("proxies", proxy)
  23. else:
  24. pass
  25. def put_many(self, proxies):
  26. """将一定量的代理压入Pool。
  27. """
  28. for proxy in proxies:
  29. self.put(proxy)
  30. def pop(self):
  31. """弹出一个可用代理。
  32. """
  33. try:
  34. return self._db.rpop("proxies").decode('utf-8')
  35. except:
  36. raise PoolEmptyError
  37. @property
  38. def queue_len(self):
  39. """获取proxy pool的大小。
  40. """
  41. return self._db.llen("proxies")
  42. def flush(self):
  43. """刷新Redis中的全部内容,测试用。
  44. """
  45. self._db.flushall()
  46. if __name__ == '__main__':
  47. conn = RedisClient()
  48. print(conn.pop())