Skip to content

Auto-switch between 100+ proxy nodes for web scraping, traffic boosting (CSDN/GitHub), and anonymous browsing. Features Poisson distribution intervals, headless browser, and anti-detection mechanisms.

License

Notifications You must be signed in to change notification settings

Ronchy2000/Dynamic-Proxy-Pool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌐 Dynamic Proxy Pool

基于 Mihomo 的动态 IP 切换系统,适用于网页爬虫、流量提升(CSDN/GitHub/博客)、数据采集等场景。

✨ 完全独立运行 | 自带内核 | 支持所有主流协议 | 前台运行模式

License: MIT Python 3.8+


🚀 快速开始(30秒上手)

# 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
  • ✅ 泊松分布间隔,模拟真实用户行为
  • ✅ 无头浏览器运行,节省资源
  • ✅ 完整的访问日志记录

✨ 功能特性

  • 动态 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/<平台>/(或用脚本下载)。
  1. 配置机场订阅
    编辑 src/fetch_proxies.pysubscriptions 列表,填入你的订阅链接。 (带“订阅”字样的占位符会被忽略,必须替换成真实 URL)

  2. 准备 Mihomo 内核(可选,如果你用内置核心)

    • 手动:从官方 release 下载对应平台资产,解压到 bin/mihomo/<平台>/
    • 或脚本下载:
      # 按平台推测资产名(推荐提供 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
      将 URL 换成你的平台资产直链,脚本会解压到正确目录。
  3. 一键拉起代理(默认会强制切到 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

  4. 运行 Selenium 访问任务

    python run_selenium.py

    配置在 src/selenium_with_proxy.pyCONFIG 段;日志写入 logs/visit_log.csv

  5. 调试/诊断

    • 并发检测节点:python start_proxy.py check
    • 智能诊断 IP 切换:python src/test_ip_switch_smart.py(需要代理已启动)
    • 手动切换测试:python src/test_ip_switch_manual.py

⚙️ 配置说明

编辑 src/selenium_with_proxy.pyCONFIG 部分:

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博客

🛠️ 常见问题

❓ IP 地址不切换?

原因: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?

检查:

  1. Mihomo 是否正在运行
  2. API 端口是否正确(默认 9090)
  3. 防火墙是否阻止

验证:

curl http://127.0.0.1:9090/configs

❓ 所有节点检测都失败?

可能原因:

  • Mihomo 未启动或配置错误
  • 机场订阅已过期
  • 网络环境问题

解决步骤:

# 重新获取节点
python start_proxy.py fetch

# 重新生成配置
python start_proxy.py generate

# 重新导入 Mihomo

❓ Chrome 驱动下载失败?

# 使用国内镜像
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

🔒 安全提示

  1. ⚠️ 不要泄露订阅链接:包含你的 token,建议加入 .gitignore
  2. 📝 遵守网站规则:查看目标网站的 robots.txt
  3. ⏱️ 控制访问频率:避免对服务器造成过大压力
  4. ⚖️ 合法使用:仅用于学习和合法用途

推荐的 .gitignore 配置:

# 敏感文件(包含订阅链接)
src/fetch_proxies.py

# 节点数据
proxies/
logs/

# Python
__pycache__/
*.pyc
*.pyo

📚 详细文档


📄 许可证

MIT License


🙏 致谢


作者: Ronchy2000
版本: 2.0
更新: 2025-10-30

About

Auto-switch between 100+ proxy nodes for web scraping, traffic boosting (CSDN/GitHub), and anonymous browsing. Features Poisson distribution intervals, headless browser, and anti-detection mechanisms.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages