browser-fetch — 共享可选浏览器渲染后端(fetchlib L3)
把"真浏览器渲染 + 可选代理"能力(和 tools/trustpilot 里那套 Selenium 一个路子)提成一个可复用的共享后端,直接当 fetchlib 的 L3 挂上——多个 skill 不再各写一套浏览器。引擎可插拔,默认 Selenium。
诚实定位(据 2026-06 实测,数据中心 IP、无代理)
| 目标 |
curl_cffi |
Jina |
本工具(Selenium) |
nodriver |
| Trustpilot |
❌403 |
✅ |
✅ 真内容 1008k |
⚠️ 薄 6k |
| Cloudflare 质询 / Muckrack / G2 |
❌403 |
❌ |
❌ 卡质询页 |
❌ 卡质询页 |
- 定位 = "JS 渲染 + 中等防护(Trustpilot 级)":它能拿下 curl_cffi 渲染不了的站。
- 不是反爬银弹:从数据中心 IP,连真浏览器(Selenium/nodriver)也过不了 Cloudflare Managed Challenge / DataDome 堡垒。那些要住宅 IP(+ 或 Camoufox/Scrapling 的 Turnstile solver)或付费 unblocker——不是换个更炫的浏览器库能解决的。
- ⇒ 默认用已验证的 Selenium;
nodriver / camoufox / scrapling 作 opt-in 引擎,先在住宅 IP 上本地比测再信。
用法
当 fetchlib 的 L3 后端(推荐):
import fetchlib, browser_fetch
fetchlib.register_backend("browser", browser_fetch.as_fetchlib_backend(engine="selenium", proxy=None))
f = fetchlib.Fetcher(tiers=("curl_cffi", "jina", "browser")) # curl_cffi/Jina 拿不下才升级到浏览器
独立用:
from browser_fetch import browser_fetch
status, html, headers = browser_fetch("https://example.com/spa", engine="selenium",
proxy="http://host:port", headless=True, wait=6)
# 检测到质询页会归一化成 status=403,让 fetchlib 正确判 blocked
插入别的引擎(等有住宅 IP 再测):
import browser_fetch
browser_fetch.register_engine("nodriver", my_nodriver_fn) # fn(url, proxy=, headless=, ...) -> (status, body, headers)
自测(无浏览器/网络,验证 block 检测 + 引擎注册 + fetchlib 适配):python3 browser_fetch.py。
引擎现状
| 引擎 |
状态 |
说明 |
selenium |
✅ 内置 |
已验证拿下 Trustpilot;authed/住宅代理需配 selenium-wire(如 trustpilot 那样) |
nodriver / camoufox / scrapling |
🔌 register_engine 可插 |
更隐蔽,但要住宅 IP 才有意义;实测数据中心 IP 下同样过不了堡垒,先本地比测 |
被哪些 skill 使用(adoption,均 opt-in)
| Skill |
怎么接 |
| 任意需要 JS 渲染的抓取 |
挂成 fetchlib 的 browser L3,curl_cffi/Jina 失败才升级 |
media-press-discovery |
Muckrack 是 Cloudflare 堡垒 → 即使本工具也需住宅 IP;有住宅代理时 proxy= 再接 |
tools/trustpilot |
保持现有 Selenium 不动;本工具是给"想复用浏览器能力的其它 skill",不替换它 |
不碰 trustpilot:平行新模块,接受一点重复;以后想 DRY 再让 trustpilot 反过来用它,那是另说。
依赖
- 可选:
selenium(pip install selenium,4.6+ 自带 Selenium Manager 下驱动)+ 本机 Chrome。不装则只有引擎注册/适配逻辑可跑(懒加载)。
- 与
fetchlib 搭配用(它负责 waterfall / 限速 / 熔断 / 合规)。
诚实边界 & 合规红线(美国运营)
- 只做合规研究抓取:渲染 JS + 可选代理;不解 CAPTCHA、不破解访问壁垒、不用僵尸网络代理、不碰 PII——这些是调用方的法律判断(CFAA / hiQ v. LinkedIn / Meta v. Bright Data / CCPA-CPRA)。若你插入一个自动解 Turnstile的引擎,那已越入"破壁",风险自负。
- 不服务 ToS 违规自动化。代理只用 KYC/知情同意审计过的供应商。
- 重:每次起浏览器,只当 fetchlib waterfall 里 curl_cffi/Jina 失败后的 L3 升级用,别当默认。
Created by Alex / 黄子阳 — https://ckcm.us
Open Source: https://github.com/noique/cross-border-ecommerce-skills
Licensed under CC BY-NC 4.0
1---2name: browser-fetch3description: A shared, pluggable real-browser rendering backend (default engine Selenium, headless, optional proxy) that mounts as fetchlib's L3 tier, so multiple skills stop each writing their own Selenium — returns (status, html, headers), normalizes anti-bot challenge pages to status=403 so the waterfall correctly marks them blocked, and exposes register_engine() for opt-in nodriver / camoufox / scrapling. Use when the user needs JS-rendered HTML for a scrape, hits a page that comes back empty or thin without a browser, wants one reusable browser layer across scraping skills, or wants to route a fetch through a proxy. Triggers on "browser-fetch", "要真浏览器渲染", "这站要跑 JS 才有内容", "用 Selenium 抓一下", "挂个浏览器后端", "curl 抓不到内容", "带代理抓", "render JS to scrape", "headless browser fetch", "this site needs a browser". Pairs with /fetchlib (register it as the browser L3 tier, only after curl_cffi / Jina fail) and /api-pacer; deliberately does NOT replace the existing Selenium inside /trustpilot. Honest limit (2026-06, datacenter IP): it t4---56# browser-fetch — 共享可选浏览器渲染后端(fetchlib L3)78把"**真浏览器渲染 + 可选代理**"能力(和 `tools/trustpilot` 里那套 Selenium 一个路子)提成一个**可复用的共享后端**,直接当 `fetchlib` 的 **L3** 挂上——多个 skill 不再各写一套浏览器。**引擎可插拔,默认 Selenium。**910## 诚实定位(据 2026-06 实测,数据中心 IP、无代理)1112| 目标 | curl_cffi | Jina | **本工具(Selenium)** | nodriver |13|---|---|---|---|---|14| Trustpilot | ❌403 | ✅ | ✅ **真内容 1008k** | ⚠️ 薄 6k |15| Cloudflare 质询 / Muckrack / G2 | ❌403 | ❌ | ❌ 卡质询页 | ❌ 卡质询页 |1617- **定位 = "JS 渲染 + 中等防护(Trustpilot 级)"**:它能拿下 curl_cffi 渲染不了的站。18- **不是反爬银弹**:从数据中心 IP,连真浏览器(Selenium/nodriver)也过不了 Cloudflare Managed Challenge / DataDome 堡垒。**那些要住宅 IP(+ 或 Camoufox/Scrapling 的 Turnstile solver)或付费 unblocker**——不是换个更炫的浏览器库能解决的。19- ⇒ **默认用已验证的 Selenium**;`nodriver` / `camoufox` / `scrapling` 作 opt-in 引擎,**先在住宅 IP 上本地比测再信**。2021## 用法2223**当 fetchlib 的 L3 后端(推荐):**24```python25import fetchlib, browser_fetch26fetchlib.register_backend("browser", browser_fetch.as_fetchlib_backend(engine="selenium", proxy=None))27f = fetchlib.Fetcher(tiers=("curl_cffi", "jina", "browser")) # curl_cffi/Jina 拿不下才升级到浏览器28```2930**独立用:**31```python32from browser_fetch import browser_fetch33status, html, headers = browser_fetch("https://example.com/spa", engine="selenium",34 proxy="http://host:port", headless=True, wait=6)35# 检测到质询页会归一化成 status=403,让 fetchlib 正确判 blocked36```3738**插入别的引擎(等有住宅 IP 再测):**39```python40import browser_fetch41browser_fetch.register_engine("nodriver", my_nodriver_fn) # fn(url, proxy=, headless=, ...) -> (status, body, headers)42```4344自测(无浏览器/网络,验证 block 检测 + 引擎注册 + fetchlib 适配):`python3 browser_fetch.py`。4546## 引擎现状4748| 引擎 | 状态 | 说明 |49|---|---|---|50| `selenium` | ✅ 内置 | 已验证拿下 Trustpilot;authed/住宅代理需配 `selenium-wire`(如 trustpilot 那样) |51| `nodriver` / `camoufox` / `scrapling` | 🔌 `register_engine` 可插 | 更隐蔽,但**要住宅 IP 才有意义**;实测数据中心 IP 下同样过不了堡垒,先本地比测 |5253## 被哪些 skill 使用(adoption,均 opt-in)5455| Skill | 怎么接 |56|---|---|57| 任意需要 **JS 渲染**的抓取 | 挂成 fetchlib 的 `browser` L3,curl_cffi/Jina 失败才升级 |58| `media-press-discovery` | Muckrack 是 Cloudflare 堡垒 → **即使本工具也需住宅 IP**;有住宅代理时 `proxy=` 再接 |59| `tools/trustpilot` | **保持现有 Selenium 不动**;本工具是给"想复用浏览器能力的其它 skill",不替换它 |6061> **不碰 trustpilot**:平行新模块,接受一点重复;以后想 DRY 再让 trustpilot 反过来用它,那是另说。6263## 依赖6465- **可选**:`selenium`(`pip install selenium`,4.6+ 自带 Selenium Manager 下驱动)+ 本机 Chrome。不装则只有引擎注册/适配逻辑可跑(懒加载)。66- 与 `fetchlib` 搭配用(它负责 waterfall / 限速 / 熔断 / 合规)。6768## 诚实边界 & 合规红线(美国运营)6970- **只做合规研究抓取**:渲染 JS + 可选代理;**不解 CAPTCHA、不破解访问壁垒、不用僵尸网络代理、不碰 PII**——这些是调用方的法律判断(CFAA / hiQ v. LinkedIn / Meta v. Bright Data / CCPA-CPRA)。若你插入一个**自动解 Turnstile**的引擎,那已越入"破壁",风险自负。71- **不服务** ToS 违规自动化。代理只用 **KYC/知情同意审计过**的供应商。72- **重**:每次起浏览器,只当 fetchlib waterfall 里 curl_cffi/Jina 失败后的 L3 升级用,别当默认。7374---75> Created by Alex / 黄子阳 — https://ckcm.us76> Open Source: https://github.com/noique/cross-border-ecommerce-skills77> Licensed under CC BY-NC 4.0