網路上大多數「如何繞過 Cloudflare」的教學在 2024 年底就失效了。原因不是 Cloudflare 加了新防禦,而是那些舊防禦 — JA3 指紋識別與基本標頭檢查 — 被替換成了新一代,足以打破每一條捷徑。本指南解釋 Cloudflare 在 2026 年實際上檢查什麼、為什麼 cloudscraper、undetected-chromedriver 與大多數「stealth」外掛會失敗,以及那套在正式環境中仍然有效的四層配方。
先把誠實的結論講在前頭:沒有單一妙招。可靠地繞過 Cloudflare 需要對的 IP、對的 TLS 指紋、對的 HTTP/2 框架順序,以及(對 Bot Management 層級而言)一個真正的瀏覽器。其中任何一項弄錯,你都會在請求抵達源伺服器之前就在邊緣過濾器上失敗。
Cloudflare 的機器人偵測在邊緣以一連串過濾器的流水線運作。每個請求都依序通過它們。最早拒絕的那個過濾器勝出,這意味著一個請求可能光憑 IP 信譽就失敗,根本還沒檢查任何指紋或標頭。
這是第一個、也最便宜的檢查。Cloudflare 維護一個以 ASN(自治系統號碼)為鍵的資料庫。屬於知名雲端供應商的 ASN(AWS AS16509、GCP AS15169、Azure AS8075、OVH AS16276、DigitalOcean AS14061、Hetzner AS24940、Vultr AS20473)會受到最高的審查。就算有完美的瀏覽器級指紋,源自這些 ASN 的請求都會被當成「未證實清白前皆有罪」。
住宅 ASN(Comcast AS7922、Verizon AS701、China Telecom AS4134、BT AS2856)則被推定為合法。一個來自住宅 IP、帶著拙劣 Python 指紋的請求仍可能通過,而一個來自資料中心 IP、帶著完美 Chrome 指紋的請求則會被挑戰或封鎖。
JA4 是 JA3 在 2023 年的繼任者,由 FoxIO 發布。它對特定的 TLS ClientHello 欄位做雜湊:TLS 版本、加密套件(依順序)、擴充(依順序)、ALPN 協定、簽章演算法與支援的群組。輸出是一個確定性的指紋,像是 t13d1516h2_8daaf6152771_b1ff8ab2d16f。
真正的 Chrome 124 產生一個特定的 JA4。真正的 Firefox 124 產生不一樣的一個。Python 的 requests 函式庫(它用 urllib3 與 OpenSSL)產生的 JA4 是任何真實瀏覽器都不會發出的,因為它的加密順序與擴充清單既不符合 Chrome 也不符合 Firefox。Cloudflare 在解析任何 HTTP 標頭之前就會標記這個模式。
其含意是:每一個使用系統 OpenSSL 或標準 Python TLS 的函式庫都可被偵測。這包括 requests、aiohttp、httpx(預設設定),以及任何建構於它們之上的「bypass」包裝。
HTTP/2 連線承載 settings 框架、視窗更新、優先權框架與 headers 框架。瀏覽器以特定的順序、帶著特定的值送出這些。Chrome 124 送出一個帶著這些確切值的初始 SETTINGS 框架,接著是一個 WINDOW_UPDATE,然後是 HEADERS。Python 的 httpx 在啟用 HTTP/2 時送出不一樣的 settings 載荷,並略過了 Chrome 會包含的優先權框架。
HTTP/2 的偽標頭順序也會洩漏身分。Chrome 以 :method、:authority、:scheme、:path 這個順序送出。Firefox 送的是 :method、:path、:authority、:scheme。大多數 Python 與 Go 函式庫則按字母順序序列化它們。Cloudflare 會把這個順序與所宣告 User-Agent 的預期模式比對,並標記不符的情形。
HTTP/1.1 標頭會保留插入順序。真正的 Chrome 以一個固定順序送出標頭:Host、Connection、Cache-Control、sec-ch-ua、sec-ch-ua-mobile、sec-ch-ua-platform、Upgrade-Insecure-Requests、User-Agent、Accept、Sec-Fetch-Site、Sec-Fetch-Mode、Sec-Fetch-User、Sec-Fetch-Dest、Accept-Encoding、Accept-Language。Python 的 requests 會重新排序它們,有時還會用不同的大小寫。就算你手動以正確的順序設定標頭也沒用,因為底層的函式庫會重新排序它們。
如果前面的過濾器都通過了但分數仍可疑,Cloudflare 會送出一個 JavaScript 挑戰。那段腳本會從瀏覽器環境的值(canvas 雜湊、WebGL renderer、audio context、navigator 屬性、時序量測)計算出一個 token,並透過 XHR 提交。沒有任何 HTTP 客戶端能解開它。你需要一個真正的瀏覽器,而且那個瀏覽器必須看起來像真的(沒有 navigator.webdriver = true、沒有缺漏的屬性)。
在 Bot Management 層級,Cloudflare 透過一段持續運行的腳本收集滑鼠移動、捲動速度、點擊時機與按鍵動態。一個載入頁面後就立刻抓取、從未移動滑鼠的無頭瀏覽器,會在數秒內被偵測到。真實使用者會無規律地移動、停頓、重讀。機器人則線性捲動、像素級精準地點擊。
那些撐起 2021-2024 抓取的捷徑工具全都共享同一個失敗模式:它們修補了可見的表面,卻沒修補底層的 TLS 堆疊。
| 工具 | 它修補什麼 | 為什麼在 2026 年失敗 |
|---|---|---|
cloudscraper | JS 挑戰解算器(舊版) | Cloudflare 在 2023 年改用 Turnstile;舊版挑戰已棄用 |
undetected-chromedriver | 修補 Selenium 的洩漏旗標 | JA4 仍從底層的 chromedriver TLS 洩漏;navigator.webdriver 只是 40 多個訊號之一 |
selenium-stealth | 注入偽造的 JS 屬性 | Cloudflare 從 C++ 層讀取,而非 JS;偽造會被偵測為不一致 |
FlareSolverr | 包裝 Chromium 來做一次性的挑戰解算 | cf_clearance 綁定到解算器的 IP;換成新 proxy 會立刻使 token 失效 |
標準 puppeteer-extra-plugin-stealth | 修補約 17 個偵測點 | Cloudflare 在 2024-2025 加了約 12 個新檢查,外掛沒涵蓋 |
模式很清楚:那些包裝真實瀏覽器並修補已知洩漏的工具,會在幾個月內就輸掉這場軍備競賽。那些模擬瀏覽器 TLS 堆疊的工具(curl_cffi、tls-client)之所以存活下來,是因為它們更貼近底層線路。
一套在 2026 年有效的繞過需要全部四層。略過任何一層都會把成功率降到個位數。
對任何跑著 Cloudflare Pro 或以上的站台而言,這沒得商量。IP 信譽過濾器會在 TLS 握手完成之前就拒絕資料中心 ASN。使用帶黏性工作階段的住宅 proxy,至少維持 10 分鐘,好讓 cf_clearance cookie 存活下來。
使用 curl_cffi(Python)或 tls-client(Go/Python)。兩者都連結到一個修改過的 BoringSSL,它帶著 Chrome 確切的加密順序、擴充清單與 ALPN 值。
from curl_cffi import requests
response = requests.get(
"https://target.com/api/products",
impersonate="chrome124",
proxies={"https": "http://user-session-abc123:[email protected]:10001"},
timeout=30,
)
print(response.status_code, len(response.text))
impersonate="chrome124" 參數會抽換掉 TLS 堆疊,讓 ClientHello 逐位元組地符合 Chrome 124。JA4 雜湊會與真正安裝的 Chrome 124 完全相同。把它和住宅 proxy 搭配,你就能通過前兩個過濾器。
當你使用 impersonate 時,curl_cffi 會自動以 Chrome 的順序設定標頭。如果你加上自訂標頭,把它們附加在尾端,而不要插在中間。避免設定真正的 Chrome 不會送出的標頭(例如,在一般導覽上設 X-Requested-With)。
至於 Accept-Language,要讓它與 proxy 的地理位置相符。一個美國住宅 IP 送出 Accept-Language: zh-CN,zh;q=0.9 是個微小但真實的訊號。美國 IP 用 en-US,en;q=0.9、德國 IP 用 de-DE,de;q=0.9,依此類推。這是少數你能免費修正的訊號之一。
如果目標觸發了 Managed Challenge(你在回應本體看到一個 CF 挑戰頁面),光靠 curl_cffi 無法解開它。改用搭配打過修補的 Chromium 的 Playwright。
from playwright.sync_api import sync_playwright
from rebrowser_playwright.sync_api import sync_playwright as rebrowser_sync
with rebrowser_sync() as p:
browser = p.chromium.launch(
headless=True,
proxy={
"server": "http://gate.jibaoproxy.com:10001",
"username": "user-session-abc123",
"password": "pass",
},
)
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
)
page = context.new_page()
page.goto("https://target.com/", wait_until="networkidle")
# cf_clearance is now in context.cookies()
cookies = context.cookies()
cf_clearance = next((c for c in cookies if c["name"] == "cf_clearance"), None)
browser.close()
使用 rebrowser-playwright 而非標準的 playwright。它修補了 Cloudflare 用來偵測無頭自動化的那些 CDP 執行期洩漏(Runtime.enable、把 CDP 指令暴露給頁面)。挑戰通過後,從 cookie 取出 cf_clearance,把它交回給 curl_cffi 來跑真正的抓取迴圈。瀏覽器每個工作階段只需要用一次,而不是每次請求都用。
在 Cloudflare 保護的站台上,「用最便宜的 proxy」這個直覺幾乎總是錯的。用真實數字把算式走一遍。
假設:平均 HTML 頁面 500KB、總共抓取 100,000 頁、目標使用啟用了 Bot Fight Mode 的 Cloudflare Pro。
| 設定 | 頻寬成本 | 成功率 | 每次成功的請求數 | 總成本 | 每頁成本 |
|---|---|---|---|---|---|
| 資料中心 $0.8/GB + requests | $0.0005 / req | 0.5% | 200 | $10,000 | $0.10 |
| 資料中心 $0.8/GB + curl_cffi | $0.0005 / req | 3% | 33 | $1,650 | $0.0165 |
| 住宅 $2/GB + requests | $0.0033 / req | 40% | 2.5 | $825 | $0.0083 |
| 住宅 $2/GB + curl_cffi | $0.0033 / req | 92% | 1.09 | $360 | $0.0036 |
| 住宅 $2/GB + Playwright(rebrowser) | $0.017 / req(assets + JS) | 96% | 1.04 | $1,700 | $0.017 |
兩個值得注意的發現:
這是我們推薦給大規模抓取 Cloudflare 保護目標的客戶的模式。它把 Playwright 的使用降到最低(慢又貴),並把 curl_cffi 的使用拉到最高(快又便宜)。
from curl_cffi import requests as cf_requests
from rebrowser_playwright.sync_api import sync_playwright
PROXY_USER_FMT = "user-session-{sid}"
PROXY_HOST = "http://gate.jibaoproxy.com:10001"
PROXY_PASS = "your_password"
def get_cf_clearance(target_url, session_id):
"""One-shot Playwright call to solve the challenge and extract cf_clearance."""
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={"server": PROXY_HOST,
"username": PROXY_USER_FMT.format(sid=session_id),
"password": PROXY_PASS},
)
ctx = browser.new_context(user_agent="Mozilla/5.0 ... Chrome/124.0.0.0 Safari/537.36")
page = ctx.new_page()
page.goto(target_url, wait_until="networkidle", timeout=45000)
cookies = ctx.cookies()
browser.close()
return {c["name"]: c["value"] for c in cookies}
def scrape_with_clearance(urls, session_id, cookies):
"""Reuse the same session_id (sticky IP) for all requests."""
proxy = f"http://{PROXY_USER_FMT.format(sid=session_id)}:{PROXY_PASS}@gate.jibaoproxy.com:10001"
out = []
for url in urls:
r = cf_requests.get(
url,
impersonate="chrome124",
proxies={"https": proxy},
cookies=cookies,
timeout=30,
)
if r.status_code == 200:
out.append((url, r.text))
elif r.status_code in (403, 503) and "challenge" in r.text.lower():
# cf_clearance expired; re-solve
cookies = get_cf_clearance(url, session_id)
r = cf_requests.get(url, impersonate="chrome124",
proxies={"https": proxy}, cookies=cookies)
out.append((url, r.text))
return out, cookies
# Usage
session_id = "scrape-job-2026-05-27"
cookies = get_cf_clearance("https://target.com/", session_id)
results, cookies = scrape_with_clearance(target_urls, session_id, cookies)
這個配方裡的關鍵點:
有些 Cloudflare 部署在任何合理的成本下都無法繞過。如果你看到這些訊號,就改變策略(使用 API、與站台擁有者合作,或直接買資料),而不是把預算燒在一個永遠無法穩定的繞過上。
| 目標層級 | 配方 | 預期成功率 |
|---|---|---|
| CF Free / Pro(無 Bot Fight) | 資料中心 + curl_cffi | 60-75% |
| CF Free / Pro + Bot Fight Mode | 住宅 + curl_cffi | 85-93% |
| CF Business | 住宅 + curl_cffi + 偶爾 Playwright | 80-90% |
| CF Business + Turnstile | 住宅 + rebrowser-playwright(每次請求) | 70-85% |
| CF Enterprise + Bot Management | 行動住宅 + rebrowser + 行為模擬 | 30-60% |
| CF Enterprise + Bot Management + 自訂 WAF | 別抓取;追求 API 或合作 | <10% |
JIBAO Proxy 提供動態住宅 proxy,橫跨 240+ 國家的 90M+ IP、最長 60 分鐘的黏性工作階段,以及從 $2/GB 起的國家級定位。行動 IP 請見動態行動 proxy。兩者都能直接搭配 curl_cffi、tls-client、Playwright、Puppeteer、Selenium,以及任何支援 HTTP/SOCKS5 proxy 的 HTTP 客戶端開箱即用。
延伸閱讀:黏性 vs 輪換 Proxy 工作階段深入說明工作階段設定。為 AI 代理人準備的 Proxy解釋與 Cloudflare 繞過工作流程高度重疊的 AI 代理人使用情境。
新用戶註冊即送 500M免費流量,首次儲值另有贈金。優惠限時供應。