基于 Mihomo 的动态 IP 切换系统,适用于网页爬虫、流量提升(CSDN/GitHub/博客)、数据采集等场景。
✨ 完全独立运行 | 自带内核 | 支持所有主流协议 | 前台运行模式
# 1. 编辑订阅链接(首次使用)
# 编辑 src/fetch_proxies.py,填入你的机场订阅链接
# 2. 一键启动(前台运行,Ctrl+C自动停止)
python start_proxy.py up --fetch --check -f
# 3. 使用代理
curl -x http://127.0.0.1:17890 https://www.google.com支持的协议: VLESS (Reality/gRPC) | Hysteria2 | VMess | Shadowsocks | Trojan
📖 详细文档: USAGE.md
在网络爬虫开发或提升网站流量时,经常遇到这些问题:
- IP 被封禁:频繁访问同一网站容易被检测
- 流量统计:需要不同 IP 访问来增加真实浏览量
- 地理限制:某些内容仅对特定地区开放
- 反爬机制:网站会识别并限制机器人访问
本项目提供完整的动态 IP 解决方案:
- ✅ 使用机场订阅,自动获取上百个代理节点
- ✅ 每次访问自动切换不同的出口 IP
- ✅ 泊松分布间隔,模拟真实用户行为
- ✅ 无头浏览器运行,节省资源
- ✅ 完整的访问日志记录
- 动态 IP 切换:每次访问使用不同的代理节点
- 智能间隔:支持固定间隔和泊松分布两种模式
- 无头模式:后台运行,不显示浏览器窗口
- 反检测:随机 User-Agent、窗口大小、滚动行为
- 并发检测:快速测试所有节点可用性(异步并发)
- 自动配置:从机场订阅自动生成配置文件
- Python 3.8+
- Chrome 浏览器
- Mihomo (Clash Meta) 客户端
- 机场订阅链接
pip install -r requirements.txt- 根目录只保留两个入口:
start_proxy.py:一键管理代理(fetch/generate/start/stop/status/up/doctor/download)run_selenium.py:运行 Selenium 访问任务
- 源码与工具脚本集中在
src/(fetch/generate/check/test/mihomo_manager)。 - 内核放在
bin/mihomo/<平台>/,运行时文件在proxies/(配置与测试结果)、logs/(访问日志)、.runtime/(PID、日志)。
- 打开
src/fetch_proxies.py填好subscriptions(你的机场订阅链接)。 - 把对应平台的 Mihomo 内核放到
bin/mihomo/<平台>/(或用脚本下载)。
-
配置机场订阅
编辑src/fetch_proxies.py的subscriptions列表,填入你的订阅链接。 (带“订阅”字样的占位符会被忽略,必须替换成真实 URL) -
准备 Mihomo 内核(可选,如果你用内置核心)
- 手动:从官方 release 下载对应平台资产,解压到
bin/mihomo/<平台>/。 - 或脚本下载:
将 URL 换成你的平台资产直链,脚本会解压到正确目录。
# 按平台推测资产名(推荐提供 version 或直接给 url) python start_proxy.py download --version v1.18.9 # 或直接指定直链 python start_proxy.py download --url https://github.com/MetaCubeX/mihomo/releases/download/v1.18.9/mihomo-darwin-arm64-v1.18.9.gz
- 手动:从官方 release 下载对应平台资产,解压到
-
一键拉起代理(默认会强制切到 global 模式,且不会改系统代理开关)
# 全流程:拉订阅 -> 生成配置 -> 启动内核 -> (可选)检测节点 python start_proxy.py up --fetch --check # 如果订阅已拉过,可直接: python start_proxy.py up # 单独查看/停止: python start_proxy.py status python start_proxy.py stop
提示:
start_proxy.py只是入口,内部调用src/下的各脚本。 若直接运行python start_proxy.py不带参数,会显示帮助示例。 体检与排错:python start_proxy.py doctor --check-api -
运行 Selenium 访问任务
python run_selenium.py
配置在
src/selenium_with_proxy.py的CONFIG段;日志写入logs/visit_log.csv。 -
调试/诊断
- 并发检测节点:
python start_proxy.py check - 智能诊断 IP 切换:
python src/test_ip_switch_smart.py(需要代理已启动) - 手动切换测试:
python src/test_ip_switch_manual.py
- 并发检测节点:
编辑 src/selenium_with_proxy.py 的 CONFIG 部分:
CONFIG = {
# 基础配置
"URL": "https://blog.csdn.net/your_article", # 目标网址
"MAX_VISITS": 100, # 访问次数
"WAIT_AFTER_LOAD": 2, # 页面加载等待时间
# 间隔模式
"INTERVAL_MODE": "poisson", # fixed 或 poisson
"INTERVAL_MEAN": 15, # 平均间隔(秒)
# 代理设置
"USE_PROXY": True,
"HEADLESS": True,
"MIHOMO_API": "http://127.0.0.1:9090",
"MIHOMO_PROXY": "http://127.0.0.1:7892",
"SWITCH_GROUP": "GLOBAL",
}固定间隔模式(适合测试):
"INTERVAL_MODE": "fixed",
"INTERVAL_MEAN": 10, # 每次等待 10 秒泊松分布模式(推荐,更自然):
"INTERVAL_MODE": "poisson",
"INTERVAL_MEAN": 15, # 平均 15 秒,但每次随机泊松分布模拟真实用户访问行为。真实用户不会机械地每隔固定时间点击,而是有快有慢。泊松过程正好描述了这种随机事件的发生规律(比如网站访问、排队到达等),两次访问之间的时间间隔服从指数分布。
| 文件 | 功能 |
|---|---|
start_proxy.py |
根目录入口,代理管理(fetch/generate/start/stop/status/up) |
run_selenium.py |
根目录入口,启动 Selenium 任务 |
src/fetch_proxies.py |
从机场订阅获取节点 |
src/generate_clash_profile.py |
生成 Mihomo 配置文件 |
src/check_proxies.py |
并发检测节点可用性 |
src/test_ip_switch_manual.py |
快速测试 IP 切换 |
src/test_ip_switch_smart.py |
智能诊断和自动修复 |
src/selenium_with_proxy.py |
主程序:动态 IP 访问 |
$ python run_selenium.py
✅ 加载 159 个可用节点
🚀 开始访问任务
📍 目标 URL: https://blog.csdn.net/xxx
🔢 最大访问次数: 100
⏱️ 间隔模式: poisson (均值: 15秒)
👻 无头模式: 开启
🌐 使用代理: 是
📊 代理池大小: 159
------------------------------------------------------------
[访问 #1]
🔄 切换节点: 日本全解锁 (延迟: 599ms)
✅ 节点切换成功
🔍 查询出口 IP...
🌍 当前 IP: 156.246.92.93
🖥️ 设备: 1366x768
👻 模式: 无头模式(后台运行)
✅ 访问成功 - 页面: CSDN博客
⏳ 等待 12.3 秒(泊松分布)...
[访问 #2]
🔄 切换节点: 菲律宾家宽 (延迟: 995ms)
✅ 节点切换成功
🌍 当前 IP: 61.245.11.176
...访问日志保存在 logs/visit_log.csv:
# 查看所有记录
cat logs/visit_log.csv
# 查看最近 10 条
tail -n 10 logs/visit_log.csv
# 统计不同 IP 数量
awk -F',' '{print $5}' logs/visit_log.csv | sort -u | wc -l日志格式:
timestamp_utc,visit_number,url,proxy_node,exit_ip,user_agent,screen_width,screen_height,status,note
2025-10-30T14:20:00Z,1,https://blog.csdn.net/xxx,日本节点,156.246.92.93,Mozilla/5.0...,1366,768,SUCCESS,CSDN博客
原因:Mihomo 可能运行在 rule 模式
解决方法:
# 方法 1:运行智能诊断
python src/test_ip_switch_smart.py
# 方法 2:手动切换模式
curl -X PATCH -H "Content-Type: application/json" -d '{"mode":"global"}' http://127.0.0.1:9090/configs检查:
- Mihomo 是否正在运行
- API 端口是否正确(默认 9090)
- 防火墙是否阻止
验证:
curl http://127.0.0.1:9090/configs可能原因:
- Mihomo 未启动或配置错误
- 机场订阅已过期
- 网络环境问题
解决步骤:
# 重新获取节点
python start_proxy.py fetch
# 重新生成配置
python start_proxy.py generate
# 重新导入 Mihomo# 使用国内镜像
export WDM_CHROME_DRIVER_MIRROR=https://npm.taobao.org/mirrors/chromedriver
python run_selenium.py在 src/selenium_with_proxy.py 中添加:
def get_fast_node(self, max_latency=500):
"""只使用延迟低于 max_latency ms 的节点"""
fast_nodes = [n for n in self.available_nodes
if n.get('latency_ms', 9999) < max_latency]
return random.choice(fast_nodes) if fast_nodes else self.get_random_node()def get_node_by_country(self, country='香港'):
"""按国家筛选节点"""
country_map = {'香港': '🇭🇰', '新加坡': '🇸🇬', '日本': '🇯🇵', '美国': '🇺🇸'}
flag = country_map.get(country, '')
nodes = [n for n in self.available_nodes
if flag in n['name'] or country in n['name']]
return random.choice(nodes) if nodes else None使用 crontab(Linux/macOS):
# 每天早上 9 点运行
0 9 * * * cd /path/to/project && python run_selenium.py
# 每小时运行一次
0 * * * * cd /path/to/project && python run_selenium.py⚠️ 不要泄露订阅链接:包含你的 token,建议加入.gitignore- 📝 遵守网站规则:查看目标网站的
robots.txt - ⏱️ 控制访问频率:避免对服务器造成过大压力
- ⚖️ 合法使用:仅用于学习和合法用途
推荐的 .gitignore 配置:
# 敏感文件(包含订阅链接)
src/fetch_proxies.py
# 节点数据
proxies/
logs/
# Python
__pycache__/
*.pyc
*.pyo- Mihomo 完整教程 - 配置、API 使用、故障排查
- 快速参考手册 - 常用命令速查
MIT License
作者: Ronchy2000
版本: 2.0
更新: 2025-10-30