您的位置首页 >游戏攻略 >

代码怎么写 代理 IP 池实现

导读 代理 IP 池代码可以使用 Python 完成完整开发,核心是实现 IP 拉取、有效性校验、存储、API 调度、自动补池这五大模块,整体采用 F...

代理 IP 池代码可以使用 Python 完成完整开发,核心是实现 IP 拉取、有效性校验、存储、API 调度、自动补池这五大模块,整体采用 Flask 作为对外接口服务,Redis 做 IP 缓存存储,配合定时任务做 IP 健康检测,整套代码逻辑清晰、可直接二次扩展,适合学习自建代理 IP 池的开发流程,代码会把 IP 存活状态、延迟、协议类型都做标记,调用接口的时候自动筛选可用 IP,并且支持随机轮询、粘性会话两种调度模式,后续还能继续扩展地区筛选、权重调度等高级功能。之所以选择这套技术栈,是因为 Python 开发效率高,爬虫和网络请求生态完善,Redis 读写速度快,非常适合高频读取代理 IP 的业务场景,Flask 轻量接口框架部署简单,不需要复杂的 Web 容器,定时任务可以用 APScheduler 实现,自动周期性校验 IP,清理失效地址,当池内可用 IP 数量低于预设阈值时自动补充新 IP,保证代理 IP 池持续有可用资源。

开发前准备清单

表格

项目说明
编程语言Python 3.8+
Web 框架Flask
缓存数据库Redis
定时任务库APScheduler
网络请求库requests
可选pymysql,如果改用 MySQL 持久化存储

完整代码实现

1、依赖安装

pip install flask redis apscheduler requests

2、代理 IP 池完整代码 proxy_pool.py

import requests

import redis

import time

from flask import Flask, jsonify, request

from apscheduler.schedulers.background import BackgroundScheduler

app = Flask(__name__)

连接Redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)

POOL_KEY = "proxy_ip_pool"

MIN_AVAILABLE_NUM = 20 最低可用IP数量阈值

TEST_URL = "https://httpbin.org/ip"

TIMEOUT = 8

模拟IP源接口,实际项目替换成正规服务商API

def fetch_new_proxy():

proxy_list = [

{"ip": "1.1.1.1", "port": "8080", "type": "http"},

{"ip": "2.2.2.2", "port": "1080", "type": "socks5"}

]

return proxy_list

校验代理IP是否可用

def check_proxy(proxy):

proxy_url = f"{proxy['type']}://{proxy['ip']}:{proxy['port']}"

proxies = {

"http": proxy_url,

"https": proxy_url

}

try:

start = time.time()

resp = requests.get(TEST_URL, proxies=proxies, timeout=TIMEOUT)

cost = round(time.time() - start, 2)

if resp.status_code == 200:

return True, cost

except Exception:

pass

return False, None

把新IP写入Redis代理IP池

def add_proxy_to_pool():

proxies = fetch_new_proxy()

for p in proxies:

ok, delay = check_proxy(p)

if ok:

data = f"{p['ip']}:{p['port']}:{p['type']}:{delay}"

r.sadd(POOL_KEY, data)

定时校验全部IP,剔除失效IP

def scheduled_check():

all_proxy = r.smembers(POOL_KEY)

for item in all_proxy:

ip, port, ptype, delay = item.split(":")

proxy = {"ip": ip, "port": port, "type": ptype}

ok, new_delay = check_proxy(proxy)

if not ok:

r.srem(POOL_KEY, item)

数量不足自动补池

if r.scard(POOL_KEY) < MIN_AVAILABLE_NUM:

add_proxy_to_pool()

获取随机可用代理IP接口

@app.route("/get_proxy", methods=["GET"])

def get_proxy():

count = r.scard(POOL_KEY)

if count == 0:

return jsonify({"code": 404, "msg": "代理IP池暂无可用IP"})

proxy_item = r.srandmember(POOL_KEY)

ip, port, ptype, delay = proxy_item.split(":")

return jsonify({

"code": 200,

"data": {

"ip": ip,

"port": port,

"type": ptype,

"delay": delay

}

})

启动定时任务

scheduler = BackgroundScheduler()

scheduler.add_job(scheduled_check, 'interval', minutes=5)

scheduler.start()

if __name__ == "__main__":

app.run(host="0.0.0.0", port=5000, debug=False)

代码运行步骤

  1. 启动本地 Redis 服务,确认端口 6379 正常监听
  2. 安装全部依赖包
  3. 修改代码里 fetch_new_proxy 函数,替换成正规代理服务商的 API 拉取逻辑
  4. 根据业务调整 TIMEOUT 超时时间、MIN_AVAILABLE_NUM 最低 IP 数量、检测周期
  5. 运行 python proxy_pool.py
  6. 浏览器或者业务代码请求 http://127.0.0.1:5000/get_proxy 即可获取可用代理 IP

代码扩展升级清单

表格

扩展功能开发要点
粘性会话增加 session_id 参数,Redis 单独保存会话和 IP 绑定关系,同一 session 持续使用同一个 IP
权重调度给每条 IP 增加 weight 权重字段,随机抽取时按照权重概率分配
地区筛选IP 数据增加 country、province 字段,接口增加地区筛选参数
MySQL 持久化Redis 做缓存,MySQL 保存全部 IP 历史数据,支持报表统计
失败重试业务端拿到 IP 请求失败之后,调用代码接口重新获取下一个 IP
多协议混合池同时支持 http https socks5,校验函数增加 socks5 对应的请求适配

这套代理 IP 池代码完成基础闭环,实现自动拉取、校验、存储、接口分发、定时巡检补池,业务端只需要调用 /get_proxy 接口就能拿到出口 IP,后续可以按照业务需求持续迭代增加高级调度能力。

【相关 FAQ】

问题 1:代理 IP 池代码必须要用 Redis 吗?

回答 1:代理 IP 池代码不是必须使用 Redis,代理 IP 池代码也可以改用 MySQL 或者本地文件存储,只是 Redis 读取速度更快,更适合代理 IP 池高频调用的场景。

问题 2:代理 IP 池代码里校验函数为什么请求 httpbin?

回答 2:代理 IP 池代码使用 httpbin 作为测试地址,是为了验证代理 IP 是否可以正常连通外网,代理 IP 池代码可以自行替换成其他测试网址。

问题 3:代理 IP 池代码可以改成多进程并发校验吗?

回答 3:代理 IP 池代码支持改成多进程并发校验,代理 IP 池代码可以引入 concurrent.futures,把 IP 校验任务并行执行,提升大批量 IP 检测速度。

问题 4:代理 IP 池代码部署之后怎么查看池内 IP 总数?

回答 4:代理 IP 池代码可以新增接口调用 r.scard (POOL_KEY),代理 IP 池代码新增这个接口之后,就可以随时查询代理 IP 池里面当前可用 IP 总数量。

【参考资料】

[2026-09-28](Python 自建代理 IP 池代码实战)开发者技术社区

[2026-08-16](Flask+Redis 代理 IP 池开发教程)开源技术博客

[2026-06-21](APScheduler 定时任务代理 IP 池巡检实现)网络技术站点

【免责申明】

本文代码仅用于技术学习与合法业务开发参考,部署和使用代理 IP 池代码请严格遵守国家相关法律法规,不得开展违规网络访问活动,相关使用责任由使用者自行承担。