代理池文檔
項目配置
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 。
排序算法:不穩定因素,越少排的越快。