Python搭建代理IP池實(shí)現(xiàn)接口設(shè)置與整體調(diào)度
接口模塊需要用 API 來(lái)提供對(duì)外服務(wù)的接口,當(dāng)然也可以直接連數(shù)據(jù)庫(kù)來(lái)取,但是這樣就需要知道數(shù)據(jù)庫(kù)的連接信息,不太安全,而且需要配置連接,所以一個(gè)比較安全和方便的方式就是提供一個(gè) Web API 接口,通過(guò)訪問(wèn)接口即可拿到可用代理
代碼地址:https://github.com/Stevengz/Proxy_pool
另外三篇:
Python搭建代理IP池(一)- 獲取 IP
Python搭建代理IP池(二)- 存儲(chǔ) IP
Python搭建代理IP池(三)- 檢測(cè) IP
添加設(shè)置
添加模塊開(kāi)關(guān)變量
setting.py
# 數(shù)據(jù)庫(kù)地址 HOST = '127.0.0.1' # MySql端口 MYSQL_PORT = 3306 # MySQl用戶名、密碼 MYSQL_USERNAME = '***' MYSQL_PASSWORD = '***' # 數(shù)據(jù)庫(kù)名 SQL_NAME = 'test' # 代理等級(jí) MAX_SCORE = 30 MIN_SCORE = 0 INITIAL_SCORE = 10 VALID_STATUS_CODES = [200, 302] # 代理池?cái)?shù)量界限 POOL_UPPER_THRESHOLD = 1000 # 檢查周期 TESTER_CYCLE = 20 # 獲取周期 GETTER_CYCLE = 300 # 測(cè)試API,建議抓哪個(gè)網(wǎng)站測(cè)哪個(gè) TEST_URL = 'http://www.baidu.com' # API配置 API_HOST = '0.0.0.0' API_PORT = 5555 # 開(kāi)關(guān) TESTER_ENABLED = True GETTER_ENABLED = True API_ENABLED = True # 最大批測(cè)試量 BATCH_TEST_SIZE = 10
TESTER_ENABLED、GETTER_ENABLED、API_ENABLED 都是布爾類(lèi)型,True 或者 False。標(biāo)明了測(cè)試模塊、獲取模塊、接口模塊的開(kāi)關(guān),如果為 True,則代表模塊開(kāi)啟
定義接口
使用框架:Flask
api.py
from flask import Flask, g
from db import MySqlClient
__all__ = ['app']
app = Flask(__name__)
def get_conn():
if not hasattr(g, 'mysql'):
g.mysql = MySqlClient()
return g.mysql
@app.route('/')
def index():
return '<h2>Welcome to Proxy Pool System</h2>'
# 隨機(jī)代理
@app.route('/random')
def get_proxy():
conn = get_conn()
return conn.random()
# 代理池總量
@app.route('/count')
def get_counts():
conn = get_conn()
return str(conn.count())
if __name__ == '__main__':
app.run()
聲明了一個(gè) Flask 對(duì)象,定義了三個(gè)接口,分別是首頁(yè)、隨機(jī)代理頁(yè)、獲取數(shù)量頁(yè)。
只需要訪問(wèn)對(duì)應(yīng)的接口即可獲取到可用代理:

調(diào)度模塊
調(diào)用定義的獲取、存儲(chǔ)、檢測(cè)三個(gè)模塊,將這三個(gè)模塊通過(guò)多進(jìn)程的形式運(yùn)行起來(lái)
scheduler.py
import time
from multiprocessing import Process
from api import app
from getter import Getter
from tester import Tester
from db import MySqlClient
from setting import *
class Scheduler():
# 定時(shí)測(cè)試代理
def schedule_tester(self, cycle=TESTER_CYCLE):
tester = Tester()
while True:
print('測(cè)試器開(kāi)始運(yùn)行')
tester.run()
time.sleep(cycle)
# 定時(shí)獲取代理
def schedule_getter(self, cycle=GETTER_CYCLE):
getter = Getter()
while True:
print('開(kāi)始抓取代理')
getter.run()
time.sleep(cycle)
# 開(kāi)啟API
def schedule_api(self):
app.run(API_HOST, API_PORT)
def run(self):
print('代理池開(kāi)始運(yùn)行')
if TESTER_ENABLED:
tester_process = Process(target=self.schedule_tester)
tester_process.start()
if GETTER_ENABLED:
getter_process = Process(target=self.schedule_getter)
getter_process.start()
if API_ENABLED:
api_process = Process(target=self.schedule_api)
api_process.start()
if __name__ == "__main__":
scheduler = Scheduler()
scheduler.run()
啟動(dòng)入口是 run() 方法,分別判斷了三個(gè)模塊的開(kāi)關(guān),如果開(kāi)啟的話,就新建一個(gè) Process 進(jìn)程,設(shè)置好啟動(dòng)目標(biāo),然后調(diào)用 start() 方法運(yùn)行,這樣三個(gè)進(jìn)程就可以并行執(zhí)行,互不干擾


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python入門(mén)學(xué)習(xí)之Python流處理過(guò)程
本篇文章屬于Python入門(mén)篇,本文主要教大家學(xué)習(xí)Python流處理過(guò)程,通過(guò)Faust流處理庫(kù)來(lái)為大家詳細(xì)講解,有需要的朋友可以借鑒參考下2021-09-09
Python并發(fā)編程多進(jìn)程,多線程及GIL全局解釋器鎖
這篇文章主要介紹了Python并發(fā)編程多進(jìn)程,多線程及GIL全局解釋器鎖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
python實(shí)現(xiàn)對(duì)數(shù)組按指定列排序
這篇文章主要介紹了python實(shí)現(xiàn)對(duì)數(shù)組按指定列排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python try...finally...的實(shí)現(xiàn)方法
這篇文章主要介紹了python try...finally...的實(shí)現(xiàn)方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
django 解決自定義序列化返回處理數(shù)據(jù)為null的問(wèn)題
這篇文章主要介紹了django 解決自定義序列化返回處理數(shù)據(jù)為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法
下面小編就為大家?guī)?lái)一篇利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
使用Python實(shí)現(xiàn)繪制發(fā)散條形圖
發(fā)散條形圖用于簡(jiǎn)化多個(gè)組的比較,它許我們比較各組中的數(shù)值,還幫助我們快速地想象出有利的和不利的或積極的和消極的反應(yīng),下面我們就來(lái)看看如何使用Python繪制發(fā)散條形圖吧2024-04-04
Python 時(shí)間操作例子和時(shí)間格式化參數(shù)小結(jié)
這篇文章主要介紹了Python 時(shí)間操作例子,例如取前幾天、后幾天、前一月、后一月等,需要的朋友可以參考下2014-04-04

