Python爬虫代理池安装与使用

2019-11-12T17:10:00

前言

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

开源项目地址:链接

安装过程

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

安装virtualenv

pip3 install virtualenv

创建纯净的虚拟环境

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

激活虚拟环境

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

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

  1. 克隆仓库

  2. clone https://github.com/jhao104/proxy_pool

  3. 安装依赖

  4. proxy_pool
  5. install -r requirements.txt

  6. 配置数据库、访问端口
    配置文件路径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 #代理池绑定的端口
}
  1. 修改启动脚本
    文件路径proxy_pool/cli/start.sh

替换原有内容:

#!/usr/bin/env bash
source ~/venv/bin/activate
python3.6 proxyPool.py webserver &
python3.6 proxyPool.py schedule
  1. 自定义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地址方法说明参数
/GETapi介绍-
/getGET随机获取一个代理-
/get_rawGET随机获取一个代理,去除无关信息-
/get_allGET获取所有代理-
/get_all_rawGET获取所有代理,去除无关信息-
/get_statusGET查看代理数量-
/deleteGET删除代理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 - [用户名]切换用户名,然后使用该用户运行代理池程序
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »