Sfoglia il codice sorgente

[update] 为验证的代理不再入库,只储存useful :electric_plug:

jhao 6 anni fa
parent
commit
2619a70b6a
4 ha cambiato i file con 143 aggiunte e 12 eliminazioni
  1. 3 6
      DB/DbClient.py
  2. 2 3
      DB/redisClient.py
  3. 135 0
      DB/ssdbClient.py
  4. 3 3
      Test/testRedisClient.py

+ 3 - 6
DB/DbClient.py

@@ -8,7 +8,8 @@
    date:          2016/12/2
 -------------------------------------------------
    Change Activity:
-                   2016/12/2:
+                   2016/12/02:   DB工厂类
+                   2020/07/03:   取消raw_proxy储存
 -------------------------------------------------
 """
 __author__ = 'JHao'
@@ -26,10 +27,6 @@ class DbClient(object):
     """
     DbClient DB工厂类 提供get/put/update/pop/delete/exists/getAll/clean/getCount/changeTable方法
 
-    目前存放代理的有两种, 使用changeTable方法切换操作对象:
-        raw_proxy: 存放Fetch的原始代理;
-        use_proxy: 存放校验后的代理信息;
-
 
     抽象方法定义:
         get(): 返回一个proxy;
@@ -41,7 +38,7 @@ class DbClient(object):
         getAll(): 返回所有代理;
         clean(): 清除所有proxy信息;
         getCount(): 返回proxy统计信息;
-        changeTable(name): 切换操作对象 raw_proxy/use_proxy
+        changeTable(name): 切换操作对象
 
 
         所有方法需要相应类去具体实现:

+ 2 - 3
DB/redisClient.py

@@ -23,8 +23,7 @@ class RedisClient(object):
     Redis client
 
     Redis中代理存放的结构为hash:
-        原始代理存放在name为raw_proxy的hash中, key为ip:port, value为代理属性的字典;
-        验证后的代理存放在name为use_proxy的hash中, key为代理的ip:port, value为代理属性的字典;
+    key为ip:port, value为代理属性的字典;
 
     """
 
@@ -124,7 +123,7 @@ class RedisClient(object):
     def changeTable(self, name):
         """
         切换操作对象
-        :param name: raw_proxy/use_proxy
+        :param name:
         :return:
         """
         self.name = name

+ 135 - 0
DB/ssdbClient.py

@@ -0,0 +1,135 @@
+# -*- 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}字典
+-------------------------------------------------
+"""
+__author__ = 'JHao'
+
+from config.setting import PY3
+
+from redis.connection import BlockingConnectionPool
+from redis import Redis
+
+
+class SsdbClient(object):
+    """
+    SSDB client
+
+    SSDB中代理存放的结构为hash:
+        原始代理存放在name为raw_proxy的hash中, key为代理的ip:por, value为代理属性的字典;
+        验证后的代理存放在name为useful_proxy的hash中, key为代理的ip:port, value为代理属性的字典;
+
+    """
+    def __init__(self, name, **kwargs):
+        """
+        init
+        :param name: hash name
+        :param host: host
+        :param port: port
+        :param password: password
+        :return:
+        """
+        self.name = name
+        self.__conn = Redis(connection_pool=BlockingConnectionPool(**kwargs))
+
+    def get(self, proxy_str):
+        """
+        从hash中获取对应的proxy, 使用前需要调用changeTable()
+        :param proxy_str: proxy str
+        :return:
+        """
+        data = self.__conn.hget(name=self.name, key=proxy_str)
+        if data:
+            return data.decode('utf-8') if PY3 else data
+        else:
+            return None
+
+    def put(self, proxy_obj):
+        """
+        将代理放入hash, 使用changeTable指定hash name
+        :param proxy_obj: Proxy obj
+        :return:
+        """
+        data = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.info_json)
+        return data
+
+    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.info_json)
+
+    def pop(self):
+        """
+        弹出一个代理
+        :return: dict {proxy: value}
+        """
+        # proxies = self.__conn.hkeys(self.name)
+        # if proxies:
+        #     proxy = random.choice(proxies)
+        #     value = self.__conn.hget(self.name, proxy)
+        #     self.delete(proxy)
+        #     return {'proxy': proxy.decode('utf-8') if PY3 else proxy,
+        #             'value': value.decode('utf-8') if PY3 and value else value}
+        return None
+
+    def getAll(self):
+        """
+        列表形式返回所有代理, 使用changeTable指定hash name
+        :return:
+        """
+        item_dict = self.__conn.hgetall(self.name)
+        if PY3:
+            return [value.decode('utf8') for key, value in item_dict.items()]
+        else:
+            return item_dict.values()
+
+    def clear(self):
+        """
+        清空所有代理, 使用changeTable指定hash name
+        :return:
+        """
+        return self.__conn.execute_command("hclear", self.name)
+
+    def getNumber(self):
+        """
+        返回代理数量
+        :return:
+        """
+        return self.__conn.hlen(self.name)
+
+    def changeTable(self, name):
+        """
+        切换操作对象
+        :param name: raw_proxy/useful_proxy
+        :return:
+        """
+        self.name = name

+ 3 - 3
Test/testRedisClient.py

@@ -14,12 +14,12 @@ __author__ = 'JHao'
 
 
 def main():
-    from db.DbClient import DbClient
+    from db.dbClient import DbClient
     from helper.proxy import Proxy
 
     db = DbClient("redis://:_@Fintell@10.10.61.65:6379")
-    db.changeTable("raw_proxy")
-    proxy = Proxy.newProxyFromJson(
+    db.changeTable("use_proxy")
+    proxy = Proxy.createFromJson(
         '{"proxy": "27.38.96.101:9797", "fail_count": 0, "region": "", "type": "",'
         ' "source": "freeProxy03", "check_count": 0, "last_status": "", "last_time": ""}')