|
|
@@ -1,130 +0,0 @@
|
|
|
-# -*- coding: utf-8 -*-
|
|
|
-# !/usr/bin/env python
|
|
|
-"""
|
|
|
--------------------------------------------------
|
|
|
- File Name: ssdbClient.py
|
|
|
- Description : 封装SSDB操作
|
|
|
- Author : JHao
|
|
|
- date: 2016/12/2
|
|
|
--------------------------------------------------
|
|
|
- Change Activity:
|
|
|
- 2016/12/2:
|
|
|
- 2017/09/22: PY3中 redis-py返回的数据是bytes型
|
|
|
- 2017/09/27: 修改pop()方法 返回{proxy:value}字典
|
|
|
- 2020/07/03: 2.1.0 优化代码结构
|
|
|
--------------------------------------------------
|
|
|
-"""
|
|
|
-__author__ = 'JHao'
|
|
|
-
|
|
|
-from redis.connection import BlockingConnectionPool
|
|
|
-from random import choice
|
|
|
-from redis import Redis
|
|
|
-
|
|
|
-
|
|
|
-class SsdbClient(object):
|
|
|
- """
|
|
|
- SSDB client
|
|
|
-
|
|
|
- SSDB中代理存放的结构为hash:
|
|
|
- key为代理的ip:por, value为代理属性的字典;
|
|
|
- """
|
|
|
-
|
|
|
- def __init__(self, **kwargs):
|
|
|
- """
|
|
|
- init
|
|
|
- :param host: host
|
|
|
- :param port: port
|
|
|
- :param password: password
|
|
|
- :return:
|
|
|
- """
|
|
|
- self.name = ""
|
|
|
- kwargs.pop("username")
|
|
|
- self.__conn = Redis(connection_pool=BlockingConnectionPool(decode_responses=True, **kwargs))
|
|
|
-
|
|
|
- def get(self):
|
|
|
- """
|
|
|
- 从hash中随机返回一个代理
|
|
|
- :return:
|
|
|
- """
|
|
|
- proxies = self.__conn.hkeys(self.name)
|
|
|
- proxy = choice(proxies) if proxies else None
|
|
|
- if proxy:
|
|
|
- return self.__conn.hget(self.name, proxy)
|
|
|
- else:
|
|
|
- return None
|
|
|
-
|
|
|
- def put(self, proxy_obj):
|
|
|
- """
|
|
|
- 将代理放入hash
|
|
|
- :param proxy_obj: Proxy obj
|
|
|
- :return:
|
|
|
- """
|
|
|
- result = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
|
|
|
- return result
|
|
|
-
|
|
|
- def pop(self):
|
|
|
- """
|
|
|
- 顺序弹出一个代理
|
|
|
- :return: proxy
|
|
|
- """
|
|
|
- proxies = self.__conn.hkeys(self.name)
|
|
|
- for proxy in proxies:
|
|
|
- proxy_info = self.__conn.hget(self.name, proxy)
|
|
|
- self.__conn.hdel(self.name, proxy)
|
|
|
- return proxy_info
|
|
|
- else:
|
|
|
- return None
|
|
|
-
|
|
|
- def delete(self, proxy_str):
|
|
|
- """
|
|
|
- 移除指定代理, 使用changeTable指定hash name
|
|
|
- :param proxy_str: proxy str
|
|
|
- :return:
|
|
|
- """
|
|
|
- self.__conn.hdel(self.name, proxy_str)
|
|
|
-
|
|
|
- def exists(self, proxy_str):
|
|
|
- """
|
|
|
- 判断指定代理是否存在, 使用changeTable指定hash name
|
|
|
- :param proxy_str: proxy str
|
|
|
- :return:
|
|
|
- """
|
|
|
- return self.__conn.hexists(self.name, proxy_str)
|
|
|
-
|
|
|
- def update(self, proxy_obj):
|
|
|
- """
|
|
|
- 更新 proxy 属性
|
|
|
- :param proxy_obj:
|
|
|
- :return:
|
|
|
- """
|
|
|
- self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
|
|
|
-
|
|
|
- def getAll(self):
|
|
|
- """
|
|
|
- 字典形式返回所有代理, 使用changeTable指定hash name
|
|
|
- :return:
|
|
|
- """
|
|
|
- item_dict = self.__conn.hgetall(self.name)
|
|
|
- return item_dict
|
|
|
-
|
|
|
- def clear(self):
|
|
|
- """
|
|
|
- 清空所有代理, 使用changeTable指定hash name
|
|
|
- :return:
|
|
|
- """
|
|
|
- return self.__conn.delete(self.name)
|
|
|
-
|
|
|
- def getCount(self):
|
|
|
- """
|
|
|
- 返回代理数量
|
|
|
- :return:
|
|
|
- """
|
|
|
- return self.__conn.hlen(self.name)
|
|
|
-
|
|
|
- def changeTable(self, name):
|
|
|
- """
|
|
|
- 切换操作对象
|
|
|
- :param name:
|
|
|
- :return:
|
|
|
- """
|
|
|
- self.name = name
|