Starbird265/ghost-bypass
GitHub: Starbird265/ghost-bypass
一个基于 ML 算法自动选择最优策略的高级隐蔽网页抓取框架,专门用于绕过 Cloudflare 等反机器人系统提取数据。
Stars: 1 | Forks: 0
# ghost_bypass
抓取任何网站。适用于受 Cloudflare 保护的站点、WAF、反机器人系统、GDPR 墙以及普通 HTTP 站点 —— 自动选择合适的技术。
## ✨ 独有特性
| 功能 | ghost_bypass |
|---------|-------------|
| **ML 级别选择** | UCB1 bandit 会记住每个域名有效的绕过级别 |
| **域名感知代理** | 代理 A 在站点 X 被封 ≠ 代理 A 在站点 Y 被封 |
| **12 个绕过级别 (L0–L11)** | 自动升级,从快速 → 隐蔽 → 有头浏览器 |
| **CF 跳转逻辑** | 检测到 Cloudflare → 立即提升为有头 UC |
| **多功能提取** | 返回 HTML、文本、链接、图像、元数据 —— 适用于任何网站 |
| **自定义提取器** | 传入你自己的 `fn(html, url)`,一次调用即可获取结构化数据 |
| **零配置** | 开箱即用,只需 `BypassEngine()`(如果缺少可选附加组件,会抛出明确的错误) |
## 📚 文档
- [入门指南](GETTING_STARTED.md) — 前置条件、安装(包括 brotli)以及你的第一次抓取。
- [使用指南](HOW_TO_USE.md) — 深入了解 ML 代理管理、UCB1 域名感知探索、SiteLearner、CF 绕过逻辑和三层提取系统。
## 安装
```
# 最小化(仅 requests — L0, L11)
pip install ghost-bypass
# 使用 playwright + selenium + TLS fingerprinting(推荐)
pip install "ghost-bypass[full]"
# 特定 extras
pip install "ghost-bypass[playwright]" # L3–L6
pip install "ghost-bypass[selenium]" # L7–L8
pip install "ghost-bypass[tls]" # L1–L2
```
安装 Playwright 附加组件后:
```
playwright install chromium
```
## 快速开始
```
from ghost_bypass import BypassEngine
engine = BypassEngine()
result = engine.scrape("https://any-website.com/page/")
print(result['success']) # True
print(result['method']) # "L0:L0_requests_basic"
print(result['html']) # full page HTML
print(result['links']) # all absolute links
print(result['images']) # all image URLs
print(result['title']) # page title
```
## 完整 ML 堆栈(推荐)
```
from ghost_bypass import BypassEngine, SiteLearner, MLProxyManager
engine = BypassEngine(
proxy_manager=MLProxyManager(), # domain-aware UCB proxy rotation
site_learner=SiteLearner(), # per-domain level memory
)
result = engine.scrape("https://cloudflare-protected-site.com/")
```
**首次运行** → 依次尝试 L0、L1、L2…… 直到成功。
**第二次运行** → 直接跳转到上次有效的级别(例如 L3),跳过较慢的级别。
**检测到 CF** → 立即跳转至 L8(带有 turnstile 支持的有头 UC)。
## 绕过级别 (L0 → L11)
| 级别 | 名称 | 技术 | CF 绕过 |
|-------|------|-----------|-----------|
| **L0** | `requests_basic` | `requests` + 真实标头 | ❌ |
| **L1** | `requests_tls` | `curl_cffi` Chrome TLS 指纹 | ⚠️ 部分支持 |
| **L2** | `httpx_http2` | `httpx` HTTP/2 | ❌ |
| **L3** | `playwright_stealth` | Playwright 无头模式 + stealth JS | ⚠️ 部分支持 |
| **L4** | `playwright_headful` | Playwright **可见** + stealth JS | ✅ 大多数网站 |
| **L5** | `playwright_mobile_headless` | 移动端模拟,无头 | ⚠️ |
| **L6** | `playwright_mobile_headful` | 移动端模拟,**可见** | ✅ |
| **L7** | `uc_headless` | Undetected ChromeDriver 无头模式 | ✅ |
| **L8** | `uc_headful` | Undetected ChromeDriver **可见** + Turnstile | ✅✅ 最佳 |
| **L9** | `drission` | DrissionPage Chromium 混合模式 | ✅ |
| **L10** | `requests_html` | pyppeteer JS 渲染 | ⚠️ 部分支持 |
| **L11** | `mechanize` | 经典 HTTP(旧版网站) | ❌ |
## 结果字典
```
result = engine.scrape(url)
result['success'] # bool
result['url'] # final URL after all redirects
result['status_code'] # HTTP status (or None for browser methods)
result['html'] # full page HTML
result['text'] # plain text (stripped HTML)
result['title'] # tag content
result['meta'] # {name: content} for all tags
result['links'] # deduplicated list of absolute links
result['images'] # deduplicated list of absolute
URLs
result['scripts'] # absolute