前言

可以参考另一篇文章,一个更高效的代理池程序,本文仅作存档

因为某个还处于脑海中的项目需要一个代理池,所以从GitHub上找了一个,记录一下部署的过程。

开源项目地址:链接

安装过程

  1. 创建虚拟环境
    亲测使用较新的依赖库会有小问题,而且此项目的requirements.txt里所有的依赖版本都是写死的,所以最好创建一个虚拟环境。
    安装virtualenv

    pip3 install virtualenv

    创建纯净的虚拟环境

    virtualenv --no-site-packages [环境名称]

    激活虚拟环境

    cd [环境名称]
    source ./bin/activate

    当看到命令提示符前缀改变了,就说明虚拟环境切换成功了。

  2. 克隆仓库

    git clone https://github.com/jhao104/proxy_pool
  3. 安装依赖

    cd proxy_pool
    pip3 install -r requirements.txt
  4. 配置数据库、访问端口
    配置文件路径proxy_pool/Config/setting.py

    #第36行
    DB_TYPE = getenv('db_type', 'REDIS').upper() #可以是'SSDB'或者'REDIS'
    DB_HOST = getenv('db_host', '127.0.0.1') #数据库IP
    DB_PORT = getenv('db_port', '6379') #数据库端口
    DB_PASSWORD = getenv('db_password', '')
    #第68行
    SERVER_API = {
     "HOST": "127.0.0.1", #代理池绑定的IP,为了安全起见,只允许本地访问
     "PORT": 5010 #代理池绑定的端口
    }
  5. 修改启动脚本
    文件路径proxy_pool/cli/start.sh
    替换原有内容:

    #!/usr/bin/env bash
    source ~/venv/bin/activate
    python3.6 proxyPool.py webserver &
    python3.6 proxyPool.py schedule
  6. 自定义API【可选】
    文件路径proxy_pool/Api/ProxyApi.py
    第50-85行,可以根据需要修改API,我删掉了delete、'refresh'这两个API

    @app.route('/')
    def index():
     return api_list
    #
    @app.route('/get/')
    def get():
     proxy = ProxyManager().get()
     return proxy.info_json if proxy else {"code": 0, "src": "no proxy"}
    #
    @app.route('/refresh/')
    def refresh():
     # TODO refresh会有守护程序定时执行,由api直接调用性能较差,暂不使用
     # ProxyManager().refresh()
     pass
     return 'success'
    #
    @app.route('/get_all/')
    def getAll():
     proxies = ProxyManager().getAll()
     return [_.info_dict for _ in proxies]
    #
    @app.route('/delete/', methods=['GET'])
    def delete():
     proxy = request.args.get('proxy')
     ProxyManager().delete(proxy)
     return {"code": 0, "src": "success"}
    #
    @app.route('/get_status/')
    def getStatus():
     status = ProxyManager().getNumber()
     return status

    添加获取纯代理API

    @app.route('/get_raw/')
    def getRaw():
     proxy = ProxyManager().get()
     return proxy.proxy if proxy else {"code": 0, "src": "no proxy"}
    #
    @app.route('/get_all_raw/')
    def getAllRaw():
     proxies = ProxyManager().getAll()
     return '\n'.join([_.proxy for _ in proxies]) if proxies else {"code": 0, "src": "no proxy"}

    添加错误页处理

    @app.errorhandler(404)
    @app.errorhandler(403)
    @app.errorhandler(502)
    @app.errorhandler(500)
    def error_page(e):
     return api_list #出错显示API信息,也可以使用redirect重定向。

运行

建议使用screen开一个虚拟终端运行

screen -S proxy_pool

启动服务

./start.sh

使用

API地址 方法 说明 参数
/ GET api介绍 -
/get GET 随机获取一个代理 -
/get_raw GET 随机获取一个代理,去除无关信息 -
/get_all GET 获取所有代理 -
/get_all_raw GET 获取所有代理,去除无关信息 -
/get_status GET 查看代理数量 -
/delete GET 删除代理 proxy=host:ip

例如,想获取服务器状态就可以访问http://127.0.0.1:5010/get_status/

Nginx反代【可选】

添加到server{}里面

location /
{
    proxy_pass http://127.0.0.1:5010/;
    proxy_set_header Host $host;
}

安全性

  • 另外创建一个用户来运行该服务,
  • 将整个虚拟环境以及proxy_pool放进该用户的home目录,修改属主,并设置权限为700
  • 使用su - [用户名]切换用户名,然后使用该用户运行代理池程序
最后修改:2020 年 07 月 05 日
Null