天天看点

代理池搭建代理池文档

代理池文档

项目配置

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. 配置项

  1. 共享配置
# 日志文件路径
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 可自动调配

           
  1. 开发配置
# 本地模式为True
DEBUG = True
# 允许所有访问
ALLOWED_HOSTS = ['*']
# Mongo的IP和端口
MONGODB_HOST = "127.0.0.1"           #本地
MONGODB_HOST = "xxxxxxxx"      #线上
MONGODB_POST = 27017

           
  1. 线上配置
# 线上日志配置
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 。

​ 排序算法:不稳定因素,越少排的越快。

代理池搭建代理池文档