Score
0
Watch 1 Star 14 Fork 1

william / Proxy_poolPythonMIT

Join us
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
一个快速上手维护你的付费代理ip,采用AES对称加密保护你的代理安全,防止信息泄露被滥用 spread retract

Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

爬虫IP代理池

下载安装

  • 下载源码:
git clone https://gitee.com/Wiliam01/Proxy_pool.git
或者直接
https://gitee.com/Wiliam01/Proxy_pool/repository/archive/master.zip 下载zip文件
  • 安装依赖:
pip install -r requirements.txt

注意事项:因为使用了AES对称加密,所以要安装加密模块,这个没有写在 requirements.txt文件中:

在 Windows下使用AES时要安装的是pycryptodome 模块   
pip install pycryptodome 

在 Linux下使用AES时要安装的是pycrypto模块   
pip install pycrypto 
  • 配置Config/setting.py:
# Config/setting.py 为项目配置文件

# 配置数据库     
DB_TYPE = os.getenv('db_type', 'REDIS')
DB_HOST = os.getenv('db_host', '127.0.0.1')
DB_PORT = os.getenv('db_port', 6379)
DB_PASSWORD = os.getenv('db_password', '')
PROXY_NAME = "Proxy" #redis 里边的存储名字
Pool = redis.ConnectionPool(host=DB_HOST,
                            port=6379,
                            password=DB_PASSWORD,
                            max_connections=20)


# 配置 代理ip抓取方法

PROXY_GETTER = [
    "zhandaye",      # 这里是启用的代理抓取函数名,可在IP/get_ip_proxy.py 扩展
]

# 配置 API服务

SERVER_API = {
    "HOST": "0.0.0.0",#地址
    "PORT": 6010, #端口
    "token":"123456." #用于web访问,当作token参数使用
}
     
# 上面配置启动后,代理池访问地址为 http://127.0.0.1:6010

#加密算法key配置
KEY_STR = "123456." #key
IV_B = "123456." #偏移量

#加密解密文件 Encryption/python_aes.py
'''python
e = aes.encrypt("hello world")  # 加密
d = aes.decrypt(e)  # 解密
print("加密:", e)
print("解密:", d)
'''
  • 启动:
>>>python run.py
#linux 后台运行
nohup python run.py

使用

过一会你就能看到代理ip存储到PROXY_NAME 名字中

  也可以通过api访问http://127.0.0.1:6010 查看。

  • Api

公共参数: token 访问接口的密码,在配置文件中设置

api method Description arg
/ GET api介绍 None
/get GET 随机获取一个代理 参数:num 获取代理的数量,不超过100
/all GET 获取所有代理 为了减小数据量,返回1000,并返回总数
/del GET 删除代理 参数:proxy_str,获取到ip列表得到
  • 爬虫使用

  如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:

import requests

def get_proxy():
    #获取到的认证代理密码一定要解密
    return requests.get("http://127.0.0.1:6010/get?token={}&num=1").json()

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

扩展代理

  项目本身添加了站大爷的函数方法,添加了其他的函数方法,需要在Setting文件 PROXY_GETTER变量中添加函数名即可,这样才能在run.py文件中被调度


class Get_ip_proxy_:
    def __init__(self):
        self.proxy_json = {
           "proxy_ip":  "",
           "type":1,
           "user":"",
           "password":"",
           "last_status":   1,
           "last_time":  datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

    def zhandaye(self):
        while True:
            time.sleep(13)
            # 最快请求频率不得超过10s一次
            # 以下是购买站大爷提供的信息
            url = ""
            api_id = ""
            api_psw = aes.encrypt("").decode('utf-8')
            try:
                response = requests.get(url,timeout=3)
                data = json.loads(response.text)
                logger.info(data)
                if data["msg"] == "获取成功":
                    ip_list = data["data"]["proxy_list"]
                    for x  in ip_list:
                        ip = x["ip"]
                        port = x["port"]
                        self.proxy_json.update({"proxy_ip":ip+":"+str(port),"user":api_id,"password":api_psw})
                        Redis_cliient.put(self.proxy_json)
            except:
                fp = StringIO()
                traceback.print_exc(file=fp)
                message = fp.getvalue()
                logger.error(message)
  • 2、添加好方法后,修改Config/Setting.py文件中的PROXY_GETTER项:

  在PROXY_GETTER下添加自定义的方法的名字:

PROXY_GETTER = [
    "zhandaye",    
]

注意:自定义的扩展,一定要准守一下的准则才能被通用,否则会导致相对应的函数调度线程异常退出,每个函数方法需要使用while True:和time.sleep()保持方法可以一直运行下去,后期会优化为定时调度的方式。

存储代理ip请按照如下格式存储:

proxy_json = {
           "proxy_ip":  "", #代理ip:port
           "type":1, #代理类型,暂时区分是否用户认证,1为用户认证,2为非用户认证
           "user":"", #用户认证用户名
           "password":"", #用户认证密码
           "last_status":   1, #最后一次验证的状态,1可用,0不可用,其实这个字段作为保留,不可用时就删除了
           "last_time":  datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

代理采集

目前实现的付费代理商采集(以下测试是本人亲测,和任何代理商无任何关系。)

厂商名称 类型 可用率 地址 ip池数量
站大爷 短效3-6分钟 较好 地址 日ip 20-40万左右
小象代理 短效1-3分钟 较好 地址 日ip 不超过20万

问题反馈

因为开发时间只用了一天,所以可能会出现许多问题,请见谅!

  任何问题欢迎在Issues 中反馈
  你的反馈会让此项目变得更加完美。

贡献代码

  @William

参考

https://github.com/jhao104/proxy_pool

Comments ( 1 )

Sign in for post a comment

Python
1
https://gitee.com/Wiliam01/Proxy_pool.git
git@gitee.com:Wiliam01/Proxy_pool.git
Wiliam01
Proxy_pool
Proxy_pool
master

Help Search

205735 778617b6 1899542 205747 347fc4a1 1899542