代理池文档
项目配置
1.项目总体架构

采用了Django+Uwsgi+apscheduler,主要支持并发,自动任务,API接口提供。
模块如下:
apscheduler 自动任务包 pip安装或直接拉包都可以
ipredis 初始ip放入redis #自动任务执行
other 存放一些工具类,异步自动任务以及日志工具
Proxy 项目文件 存放全局配置setting url分发
requestsPull Client端调用,支持最短时延,成功标记,响应码,最优,随机先进先出,代理类型等。
···············多种调用方案。已更新为负载均衡模式。
responsePush Client端回传,将标记的ip回传,或者直接回传redis,效果一样。
sortCount 此模块为一些排序逻辑算法以及去重和存入mongo #等待后续可视化
spider_functool 日志工具以及工具类 上下文管理以及超时的装饰器 待后续使用
static 静态文件存放 js-css-html-txt-日志等
step_task 自动任务文件 已废弃转移到Proxy下
templates html文件 后续废弃掉
manage.py 本地调式模式
requirements.txt 批量安装环境包 # pip install -r requirements.txt
uwsgi.ini Uwsgi启动程序 配置线程进程等 #uwsgi --ini uwsgi.ini
README.md 项目使用文档
2. 配置项
- 共享配置
# 日志文件路径
VISIT_LOGGING = os.path.join(os.path.join(static_path, "logger"), "visit_logging.txt")
# ######################## 邮件配置 ########################
# 接受邮件的账号
RECEIVE_EMAIL_ADDR = [
'47****[email protected]', #日志邮件接收列表 接收直接放入下面列表邮箱地址
]
# 邮件端口
EMAIL_PORT = 587
# 邮件发送者
EMAIL_HOST_USER = '25*****[email protected]'
# 日志保存最大值
MAX_LOG_FILE_SIZE = 10 * 1024 * 1024 # 10MB 可自动调配
- 开发配置
# 本地模式为True
DEBUG = True
# 允许所有访问
ALLOWED_HOSTS = ['*']
# Mongo的IP和端口
MONGODB_HOST = "127.0.0.1" #本地
MONGODB_HOST = "xxxxxxxx" #线上
MONGODB_POST = 27017
- 线上配置
# 线上日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default': {
'format': '%(asctime)s %(funcName)s(%(levelno)s) %(message)s'
}
},
'handlers': {
'stu_hanlders': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 储存到的文件地址
'filename': TEST_LOG,
'formatter': 'default'
}
},
'loggers': {
'django': {
'handlers': ['stu_hanlders'],
'level': 'INFO',
'propagate': True,
},
},
}
# 开发模式为False
DEBUG = False
# 调整 允许 IP 访问
ALLOWED_HOSTS = ['*']
# ######################## Mongodb配置 ########################
MONGODB_HOST = "xxxxxxxx"
MONGODB_POST = 27017
代理池API(负载均衡)----调用方案
先进先出:
用于 获取先进先出(随机) 获取
eg: http://127.0.0.1:5000/pull/?method=XX
请求方式: GET
请求协议:
参数位于 URL 路径当中
{
method: 任务名 #任务名为必填选项 默认走先进先出
}
响应数据:
Success:
{
method: "XX", # 任务名
t_proxy: "WD", # 代理类型
level: 2, # 任务等级 预留
status_code: 200, # 状态码
timeval: 2587, # 响应时延
appcode: 0, #成功标识状态码 1->成功 0->失败
insert_date: 1594704627.4346092, #插入时间
ip: "127.0.0.1", #代理ip
start: 1595213278.7285383, #开始时间 ->时间戳
timeOut: 0 #超时 ->s单位
}
error:
{
code: 500,
msg: "IP回传参数获取失败"
}
worring:
{
}
最短时延:
用于 逐个获取最短时延ip
eg: http://127.0.0.1:5000/pull/?method=XX&sortTime=1
请求方式: GET
请求协议:
参数位于 URL 路径当中
{
method: 任务名
sortTime: 1/0 True->False 默认False #是否获取最短时延标识
}
响应数据: 同上。
成功标识:
优先获取成功标识为1的。
eg: http://127.0.0.1:5000/pull/?method=XX&sortSuccess=1
请求方式: GET
请求参数:
参数位于 URL 路径当中
{
method: 任务名
sortSuccess: 1/0 True->False 默认False #是否获取成功标识
}
响应返回: 同上
响应状态码:
优先获取短位状态码
eg: http://127.0.0.1:5000/pull/?method=XX&sortResponseCode=1
请求方式: GET
请求参数:
参数位于 URL 路径当中
{
method: 任务名
sortResponseCode: 1/0 True->False 默认False #是否获取最小状态码标识
}
响应数据: 同上
完美最优:
去重 >> 最短时延 >> 最小状态码 >> result
eg: http://127.0.0.1:5000/pull/?method=XX&sortPerfect=1
请求方式: GET
请求参数:
参数位于 URL 路径当中
{
method: 任务名
sortPerfect: 1/0 True->False 默认False #是否获取最优标识
}
响应返回: 同上
代理类型:
注 : 若搭配排优算法,请单独填写对应参数。
用于 获取指定代理类型
eg: http://127.0.0.1:5000/pull/?method=XX&ipType=XX
请求方式: GET
请求参数:
参数位于 URL 路径当中
{
method: 任务名
ipType: MY# 代理类型,默认蚂蚁代理,MY 蚂蚁;WD 豌豆;HW 华为;FREE 免费
}
响应数据: 同上
代理池API----回传方案
eg: http://127.0.0.1:8000/push/?ip=xxx
请求方式: GET
请求参数:
{"ip":'{"method": "XX", #当前任务
"t_proxy": "MY", #当前使用代理类型
"level": 2, # 任务级别 0最高级别 1其次级别 2最低级别
"status_code": 200, #当前http状态码
"timeval": 2587, #当前请求响应时延 单位毫秒
"appcode": 1, #标识成功 # 任务执行状态码 1.成功 0.失败
"insert_date": 1594704627.4346092, #写入时间
"ip": "139.159.220.133", #代理ip
"start": 1595213278.7285383, #请求开始时间
"timeOut":0 #超时时间 单位秒
}'
}
响应数据:
{
code: 200,
msg: "Success"
}
代理池性能方面
Django+Uwsgi 》》目前经过测试,1s支持200个并发。(1G1核)
[uwsgi]
#使用nginx连接时使用
;socket=0.0.0.0:8000
#直接做web服务器使用
http=0.0.0.0:5000
#服务停止时自动移除unix Socket和pid文件
vacuum = true
#项目目录
chdir= /opt/app/Proxy
#项目中wsgi.py文件的目录,相当于项目目录
wsgi-file=Proxy/wsgi.py
static-map=/static=/opt/app/Proxy/static
# 通过该端口可以监控 uwsgi 的负载情况
stats = 0.0.0.0:9999
# 设置一个超时,用于中断那些超过服务器请求上限的额外请求
;harakiri=60
# 代码修改后自动重启
py-autoreload = 1
# 最大缓存
;buffer-size = 32768
processes=2
threads=100
# 主进程
master=True
#设置每个工作进程处理请求的上限,达到上限时,将回收(重启)进程,可以预防内存泄漏
;max-requests=5000
#pid文件, 用于脚本启动,停止
pidfile=uwsgi.pid
daemonize=uwsgi.log
#uwsgi --ini uwsgi.ini 启动项目
# uwsgi --stop uwsgi.pid 关闭项目
本地单进程测试 push回传 平均120/s , pull调用代理平均120/s >> 测试为负载均衡+随机先进先出。
redis库内(300个ip,调用400次,后100为固定蚂蚁代理。)
排序3683个代理ip,排序需要2.5s ,500个代理ip排序需要 0.2s 。
4000个调用pull,需要时间29s 。平均138/s。
回传ip , 3683个需要30s , 平均122/s。
总结:回传和调用ip,单线程 保守均值 100/s 。
排序算法:不稳定因素,越少排的越快。