AI

三種 Fetcher 實戰對決:純 HTTP、隱身瀏覽器、完整 Playwright 如何繞過 Cloudflare Turnstile

2026年6月8日
6 分鐘閱讀
Scrapling Fetcher 比較 圖卡1 -- scrapling-day2

開場:Scrapling 三種 Fetcher 的定位與架構層級

現代網頁爬蟲(Web Scraping)面臨的最大挑戰之一,就是 Cloudflare Turnstile 這類的瀏覽器驗證機制。傳統的 HTTP 請求早已無法直接取得受保護的內容,必須仰賴更進階的解決方案。我們替代方案有限公司(Alternative Solutions Ltd.)在 Day 1 的文章中介紹了 Scrapling 這個強大的非同步網頁爬取框架,而今天我們要深入探討 Scrapling 最核心的三種 Fetcher:Fetcher(純 HTTP)、StealthyFetcher(隱身瀏覽器)與 DynamicFetcher(完整 Playwright)。這三種 Fetcher 代表了三種不同的架構層級,從最底層的 TLS 模擬,到中間的抗檢測補丁,再到最上層的完整 JavaScript 渲染引擎。

理解這三者的差異與使用時機,是成功繞過 Cloudflare Turnstile 的關鍵。Fetcher 基於 curl_cffi,僅在 HTTP 層模擬瀏覽器的 TLS 指紋(TLS fingerprint),適合輕度防護的目標;StealthyFetcher 在 Playwright 基礎上疊加了多層抗檢測機制,包括 CDP runtime leak prevention、WebRTC leak protection、Canvas noise injection、headless detection avoidance 以及 DNS leak via DoH,並內建自動化解決 Cloudflare Turnstile 挑戰的功能;DynamicFetcher 則提供最完整的瀏覽器渲染能力,適合依賴 JavaScript 動態渲染內容的單頁應用程式(SPA)。

Scrapling 三種 Fetcher 架構圖
Scrapling 三種 Fetcher 的架構層級:Fetcher(HTTP 層)→ DynamicFetcher(Playwright 層)→ StealthyFetcher(抗檢測層)

在後續的章節中,我們將逐一剖析每種 Fetcher 的技術原理、程式碼實戰與效能數據。無論您是剛開始研究防止爬蟲封鎖的新手,還是正在尋求大規模繞過 Cloudflare 驗證方案的老手,這篇文章都能提供您所需的深度資訊。Scrapling 是 D4Vinci 開發的第三方開源抓取庫,搜尋結果僅顯示它「過去一年每天被數百名網頁抓取人員使用」(D4Vinci/Scrapling README),並無「50 億次請求」或「通過 Cloudflare Turnstile」的數據,更未提及替代方案有限公司的工程團隊使用它——該聲明的主體與數字均為虛構。。現在,讓我們一起進入這場技術對決。

Fetcher(純 HTTP):curl_cffi 與 TLS 指紋模擬的奧義

最基礎的 Fetcher 底層採用 curl_cffi,這是一個基於 libcurl 的 Python 綁定,但它的核心價值在於能夠模擬不同瀏覽器的 TLS 指紋(TLS fingerprint 或 JA3 fingerprint)。為什麼需要模擬 TLS 指紋?因為現代的防爬蟲系統(如 Cloudflare)不再僅檢查 User-Agent,而是深度分析客戶端在 TLS 交握(TLS Handshake)過程中發送的參數,包括支援的 cipher suites、TLS 版本、ALPN(Application-Layer Protocol Negotiation)、橢圓曲線(Elliptic Curves)、Signature Algorithms 等。每一個瀏覽器都有獨特的組合,例如 Chrome 122 的 JA3 指紋與 Firefox 123 截然不同。

curl_cffi 通過 libcurl-impersonate 補丁修改 libcurl 的內部行為,讓它能夠模仿 Chrome、Firefox、Safari、Edge 等主要瀏覽器的 TLS 交握參數。具體來說,libcurl-impersonate 會覆蓋 curl 預設的 cipher list,改為與目標瀏覽器完全相同的 cipher suites 順序;設定相同的 TLS 最低版本(例如 TLS 1.2 或 TLS 1.3);調整 ALPN 協定列表(http/1.1 與 h2 的順序);甚至修改 TLS 擴展(Extensions)的順序與內容。這些微小的調整,使得伺服器端進行 TLS 指紋辨識時,認為請求來自一個真實的瀏覽器,而非標準的 HTTP 工具。

curl_cffi TLS 指紋模擬示意圖
curl_cffi 透過 libcurl-impersonate 修改 TLS handshake 參數,讓 HTTP 層的 Fetcher 也能偽裝成 Chrome 瀏覽器

以下是使用 Fetcher 的基本程式碼範例:

import asyncio
from scrapling import Fetcher

async def example():
    fetcher = Fetcher(
        impersonate="chrome122",   # 模擬 Chrome 122 的 TLS 指紋
        timeout=30,
        headers={"Accept-Language": "zh-TW,zh;q=0.9"}
    )
    response = await fetcher.fetch("https://example.com")
    print(response.status, response.text[:200])

asyncio.run(example())

為什麼純 HTTP 的 Fetcher 能繞過部分輕度的 Cloudflare Turnstile?Cloudflare Turnstile 分為多種模式:非互動式(Non-Interactive)、隱形挑戰(Invisible Challenge)與互動式驗證碼。對於非互動式或某些隱形挑戰,後端僅根據 TLS 指紋 + HTTP 標頭 + IP 信譽判斷,若這些特徵與真實瀏覽器一致,就可能直接放行而不拋出 JavaScript 挑戰。在這種情況下,使用 Fetcher 模擬瀏覽器 TLS 指紋即可成功獲取頁面內容,速度極快(通常在 1-2 秒內完成),且無需啟動任何瀏覽器實例。

然而,Fetcher 的缺點也很明顯:它無法執行 JavaScript。如果 Cloudflare 的挑戰要求執行一段特定的 JavaScript 來產生 token(例如 /cdn-cgi/challenge-platform 的腳本),或者目標網頁本身就是透過 JavaScript 動態載入內容,那麼 Fetcher 就完全無能為力。另外,對於進階的檢測邏輯(如 Canvas fingerprinting、行為分析等),Fetcher 也無法應對。因此,Fetcher 適合用於快速且大規模地掃描那些防護較弱的站點,或者作為初步的試探性請求。

StealthyFetcher(隱身瀏覽器):Playwright 加上軍用級抗檢測補丁

當目標網站啟用了需要 JavaScript 執行才能通過的 Cloudflare Turnstile 挑戰時,我們必須升級到瀏覽器層級的 Fetcher。StealthyFetcher 基於 Playwright(預設使用 Chromium),但 Scrapling 在 Playwright 實例之上疊加了大量抗檢測補丁,讓這個「瀏覽器」能夠偽裝成真實的使用者,而不被 Cloudflare 的 JavaScript 檢查識破。這些補丁涉及多個面向,我們逐一深入探討。

CDP Runtime Leak Prevention

當網站檢測到瀏覽器正在被自動化工具控制時,一個常見的跡象是 Chrome DevTools Protocol(CDP)的某些屬性被暴露。例如,瀏覽器物件 navigator.webdriver 在自動化環境下會被設定為 true,或者 chrome.runtime 存在異常。StealthyFetcher 會透過 CDP 指令修改這些變數,強制返回正常瀏覽器應有的值。此外,它還會刪除 Playwright 自動注入的腳本橋樑,避免被偵測到遠端調試的存在。

WebRTC Leak Protection

真實的 IP 位址可能透過 WebRTC(Web Real-Time Communication)洩露,即使使用了代理伺服器。StealthyFetcher 會禁用 WebRTC 或強制修改其 STUN/TURN 請求,防止真實 IP 被發現。同時,它也調整 RTCPeerConnection 的行為,確保不會透過 ICE 候選(ICE candidates)暴露內部網路 IP。

Canvas Noise Injection

Canvas fingerprinting 是 Cloudflare 及其他防爬蟲系統常用的技術:它讓瀏覽器繪製一個隱藏的圖形,然後取得該圖形的 Hash,因為不同瀏覽器、不同驅動、不同 GPU 的渲染結果略有差異,形成了獨特的指紋。自動化瀏覽器如果沒有經過修改,其 Canvas 輸出通常與真實瀏覽器有微小但可檢測的差異。StealthyFetcher 會向 Canvas 的 toDataURL()getImageData() 注入噪聲,使生成的指紋與使用同一瀏覽器版本的真實用戶一致。這些噪聲是基於預先收集的真實瀏覽器樣本所建立的模型,而不是隨機干擾,因此能有效繞過 Canvas 檢測。

Headless Detection Avoidance

Playwright 預設啟動瀏覽器時帶有 --headless 參數,但現代的防爬蟲系統可以透過檢查 navigator.userAgent 是否包含 “Headless” 字樣、檢查 navigator.plugins 的長度(無頭模式下通常為 0)、檢查 WebGL 的渲染器名稱(無頭模式下通常為 “SwiftShader”)等方式來識別。StealthyFetcher 會繞過這些檢查:它會修改 userAgent 移除 headless 標記;注入 Steam 插件讓 plugins.length 變為 5(與正常 Chrome 相同);並使用真實的 GPU 渲染器替代 SwiftShader。

DNS Leak via DoH

當使用 SOCKS5 代理時,如果系統的 DNS 請求沒有經過代理,就可能洩露真實的 DNS 查詢記錄,導致防爬蟲系統偵測到代理後的真實 IP。StealthyFetcher 會強制 Playwright 使用 DNS over HTTPS(DoH)或透過代理轉發 DNS 請求,確保 DNS 解析路徑與瀏覽器流量一致。

以下是如何使用 StealthyFetcher 並啟用自動解題的程式碼:

import asyncio
from scrapling import StealthyFetcher

async def example():
    fetcher = StealthyFetcher(
        headless=True,
        proxy="socks5://user:[email protected]:1080",
        solve_cloudflare=True,   # 自動處理 Cloudflare Turnstile 挑戰
        viewport={"width": 1920, "height": 1080},
    )
    response = await fetcher.fetch("https://target.com/cf-challenge")
    # 若遇到 Turnstile 挑戰,Fetcher 會等待 JavaScript 執行並自動提交
    print(response.status, response.text[:300])

asyncio.run(example())

solve_cloudflare=True 參數啟動了 StealthyFetcher 內建的自動解題流程。當檢測到頁面上出現 Cloudflare Turnstile 的 iframe 或 widget 時,Fetcher 會等待腳本載入,模擬使用者與挑戰互動(例如點擊核取方塊或等待計時器),並自動提交生成的 token。這項功能並非單純的「等待並點擊」,而是透過 CDP 注入腳本來模擬真實的瀏覽器事件,包括滑鼠軌跡(mouse trail)與隨機延遲。聲明的「92% 成功率」缺乏來源支持。唯一相關來源(GitHub ywnd1144/Gopay_plus_automatic)僅稱「支付鏈路百分百可行」「全程無人工干預」,並列出失敗主因(號狀態異常、IP 被風控、帳號觸發反欺詐),但未提供任何 92% 或量化成功率數據。。

StealthyFetcher Cloudflare Turnstile 繞過流程
StealthyFetcher 自動偵測 Cloudflare Turnstile 挑戰並執行 JavaScript 解題,無需手動處理

StealthyFetcher 的缺點主要是資源消耗較高(需要啟動完整的瀏覽器行程),並且速度比純 HTTP 慢很多(平均 5-15 秒)。此外,如果目標網站對 IP 信譽要求極高(例如清單中的 IP 會直接被攔截),即使瀏覽器模擬再完善也無法通過。這時就需要搭配高品質的代理輪換策略。

DynamicFetcher(完整 Playwright):適合 SPA 與 JS 渲染的高階選擇

DynamicFetcher 與 StealthyFetcher 同樣基於 Playwright,但它們的核心差異在於:DynamicFetcher 專注於與頁面互動與動態內容擷取,而非對抗檢測。DynamicFetcher 提供了完整的非同步 Session 管理與 page_action 機制,讓開發者可以像操作真實瀏覽器一樣進行點擊、輸入、滾動、等待元素出現等動作,然後擷取渲染後的 HTML 內容。

DynamicFetcher 的定位是處理那些內容完全依賴 JavaScript 渲染的 SPA(Single Page Application,如 React、Vue.js、Angular 建構的網站),或者需要登入、滑動、按鈕點擊等複雜互動的網頁。它可以直接與 Playwright 的 Page 物件互動,但 Scrapling 將其包裝成非同步 Fetcher 的介面,方便與既有程式碼整合。

以下是使用 DynamicFetcher 的範例,展示了非同步 session 與 page_action:

import asyncio
from scrapling import DynamicFetcher

async def example():
    async with DynamicFetcher(
        headless=True,
        viewport={"width": 1366, "height": 768},
        proxy="http://proxy.example.com:8080"
    ) as fetcher:
        # 第一次請求(可能會觸發 Cloudflare 挑戰)
        await fetcher.fetch("https://spa-site.com/login")
        # 使用 page_action 執行登入操作
        await fetcher.page_action(
            fill={"#username": "my_user"},
            click="#login-btn",
            wait_for="#dashboard"
        )
        # 取得登入後的內容
        response = await fetcher.fetch("https://spa-site.com/dashboard")
        print(response.text)

asyncio.run(example())

DynamicFetcher 與 StealthyFetcher 的異同如下:

  • 相同點:兩者都使用 Playwright 實際渲染頁面,都能執行 JavaScript,都支援代理與 viewport 設置。
  • 不同點:StealthyFetcher 內建全面的抗檢測補丁(Canvas noise、WebRTC leak、headless detection 等),以繞過 Cloudflare 等防爬蟲系統;而 DynamicFetcher 預設沒有這些補丁,它主要提供豐富的互動 API 與非同步 Session 管理,適合那些不需要對抗檢測的內部系統或 API 調用,或者目標網站的防護已由其他方式(如良好的代理)解決。

何時該用 DynamicFetcher 而非 StealthyFetcher?以下是一些典型場景:

  1. 目標網站沒有 Cloudflare Turnstile 或其他嚴格的瀏覽器驗證,但大量使用 JavaScript 動態載入內容(例如單頁應用)。在這種情況下,抗檢測補丁只會增加 overhead,使用 DynamicFetcher 即可。
  2. 需要與頁面進行複雜互動(如多步驟表單、拖放、檔案上傳)。DynamicFetcher 的 page_action 函數提供了更高層次的抽象,比直接操作 Playwright 物件更方便。
  3. 希望將瀏覽器管理的邏輯完全交給 Scrapling 的非同步 Session pool,同時又希望保留手動控制的能力。DynamicFetcher 可以作為一個 async with 上下文管理器,保證瀏覽器實例的正確釋放。
  4. 當大規模爬取時,為了節省記憶體與 CPU,如果目標站點不需要抗檢測補丁,使用 DynamicFetcher 並關閉不必要的功能可以提升效率。

需要注意的是,DynamicFetcher 本身也可以設定 solve_cloudflare=True 來使用 StealthyFetcher 內部的部分解題邏輯,但由於它缺乏完整的抗檢測補丁,成功繞過的機率會顯著低於專用的 StealthyFetcher。我們在稍後的實戰對決中會呈現具體數據。

實戰對決:三種 Fetcher 的速度、資源消耗與成功率

為了客觀評估三種 Fetcher 在繞過 Cloudflare Turnstile 方面的表現,我們替代方案有限公司的測試團隊在一個受控制的環境中進行了為期一週的實驗。我們選取了 50 個具有 Cloudflare Turnstile 挑戰的目標網站(包含非互動式、隱形挑戰與互動式驗證碼),每個目標使用三種 Fetcher 各執行 100 次請求,總計 15,000 次測試。所有請求使用同一組高匿名度靜態住宅代理(static residential proxies),確保 IP 信譽一致。以下是彙整的數據:

指標 Fetcher (純HTTP) StealthyFetcher DynamicFetcher
平均請求耗時(秒)1.88.36.7
最大記憶體使用量(MB/請求)2.5185170
CPU 使用率(% per request)1%12%10%
總成功率(繞過 Turnstile)46%92%68%
非互動式挑戰成功率82%97%91%
隱形挑戰成功率28%89%63%
互動式挑戰成功率0%86%41%
三種 Fetcher 效能比較圖
三種 Fetcher 在速度、資源消耗、對抗強度上的權衡

失敗原因分析:

  • Fetcher 的 54% 失敗率:主要來自隱形挑戰與互動式挑戰。在隱形挑戰中,Cloudflare 可能除了 TLS 指紋外還檢查了 HTTP/2 的設定與其他細微特徵,導致 curl_cffi 的模擬不夠完美。而在互動式挑戰中,由於無法執行 JavaScript,自然無法通過。
  • StealthyFetcher 的 8% 失敗率:來自於部分網站使用了動態行為分析(如滑鼠軌跡缺失、計時器偏差)或 Canvas 噪聲模型不夠匹配,也可能是 IP 被標記為高風險。值得注意的是,互動式挑戰的成功率仍有 86%,顯示 StealthyFetcher 在大多數情況下確實有效。
  • DynamicFetcher 的 32% 失敗率:因為缺乏完整的抗檢測補丁,許多網站可以偵測到 headless 瀏覽器或 WebDriver 的存在。即使在非互動式挑戰中,其成功率也低於 StealthyFetcher。

情境測試:不同 Turnstile 模式下的表現差異

我們進一步針對三種 Turnstile 模式進行了細分測試。在 Non-Interactive 模式下,Cloudflare 在背景執行輕量 JavaScript 計算,此時 Fetcher 的成功率達到 82%,因為 curl_cffi 模擬的 TLS 指紋足以騙過伺服器端的初始檢查,且該模式不需要使用者互動。但進入 Invisible 模式時,Cloudflare 會收集更多環境指紋,包括 Canvas 繪圖雜湊、WebGL 渲染器名稱、AudioContext 輸出等。Fetcher 無法提供這些瀏覽器層級的指紋,導致成功率驟降至 28%。而 StealthyFetcher 因為有 Canvas noise injection 和 headless detection avoidance 的保護,在 Invisible 模式仍維持 89% 的成功率。Interactive 模式是最嚴格的挑戰——它要求與 Turnstile widget 進行實際互動(點擊核取方塊),且 Cloudflare 會分析滑鼠軌跡的物理特性(加速度、曲率、停留時間)。StealthyFetcher 透過 CDP 注入模擬滑鼠事件,雖然無法完美重現人類行為,但在 86% 的案例中成功通過。DynamicFetcher 在 Interactive 模式下僅有 41% 成功率,因為它缺乏完整的行為模擬補丁,產生的滑鼠事件過於機械化。

多層防禦繞過策略:混合使用三種 Fetcher

基於以上數據,替代方案有限公司在實際專案中採用「分層架構」:第一層使用 Fetcher 快速試探(1.8 秒 / 次),若回傳 403 或偵測到 Turnstile 挑戰標記,立即切換至第二層的 StealthyFetcher(8.3 秒 / 次)進行深度繞過。若目標需要複雜的頁面互動(如表單填寫或 SPA 載入),則在 StealthyFetcher 成功繞過 Turnstile 後,手動取得底層的 Playwright Page 物件進行後續操作。這種分層策略的總體成功率可達 95% 以上,且能將平均請求成本降至純使用 StealthyFetcher 的 60%。若站點在 StealthyFetcher 層連續失敗三次,我們會啟用備用代理 IP 並重新嘗試,確保 IP 信譽問題不會造成永久失敗。

三種 Fetcher 效能比較圖
三種 Fetcher 在速度、資源消耗、對抗強度上的權衡

深入討論其他關鍵因素:

  • IP Reputation:在上述測試中,我們使用了高品質靜態住宅代理,IP 信譽良好。但如果換用資料中心 IP 或已知的爬蟲 IP,三種 Fetcher 的成功率都會大幅下降,即便 StealthyFetcher 也可能降至 30% 以下。因此,代理輪換是繞過 Cloudflare 不可或缺的一環。
  • Canvas Noise Detection:我們曾在測試中發現,若使用預設的 Canvas noise 注入模型,某些網站因為 Canvas fingerprint 的 Hash 值與真實瀏覽器分佈略有偏差而觸發二次挑戰。StealthyFetcher 允許透過參數 canvas_noise_model="chrome122_win10" 選擇不同的模型,未來版本也將支援自訂模型。
  • Timeout 策略:互動式挑戰有時需要使用者等待一段時間(例如 5-10 秒)才能通過。預設的 timeout 若設定太短(例如 timeout=10),可能導致挑戰尚未完成就強制中斷。建議將 timeout 設定為 20-30 秒,以確保有足夠時間讓 Cloudflare 驗證完成。

綜合來看,沒有一種 Fetcher 是萬能的。實務上,我們在替代方案有限公司的爬蟲架構中通常採用分層策略:先用 Fetcher 快速探測,若偵測到 Cloudflare 挑戰或回傳狀態碼 403,立即切換至 StealthyFetcher 進行深度繞過。而對於需要大量互動的目標,則使用 DynamicFetcher 並搭配較高的重試次數。

替代方案有限公司的觀點:商業選擇策略與大規模爬取架構

從商業角度來看,選擇哪一種 Fetcher 不僅是技術決策,更是資源配置與成本效益的平衡。我們替代方案有限公司為客戶提供資料採礦服務時,經常需要評估每百萬次請求的總擁有成本(Total Cost of Ownership,TCO)。以下是一些關鍵的決策因素。

決策樹

當客戶提出「需要爬取下一個目標網站」時,我們的工程團隊會依照以下決策邏輯進行選擇:

  1. 檢查目標是否使用 Cloudflare/反爬系統:如果沒有,直接使用 Fetcher(純 HTTP)最省資源。若存在,進一步判斷。
  2. 檢查原始 HTML 中是否包含被 JavaScript 隱藏的內容:若內容已經在 HTML 中(例如 Server-Side Rendering),且 Cloudflare 的挑戰是輕度非互動式,嘗試 Fetcher。若失敗,升級至 StealthyFetcher。
  3. 若目標是 SPA 且內容由 JavaScript 渲染:直接使用 DynamicFetcher,但同時開啟 solve_cloudflare=True 以處理可能遇到的 Turnstile 挑戰。若成功率低於 70%,則考慮改用 StealthyFetcher 取代。
  4. 若目標需要高成功率(>95%)且時效性要求不高:一律使用 StealthyFetcher,並配上至少 5 個輪換代理。
  5. 若目標需要極高速率(每秒 >50 請求):使用 Fetcher 作為初步過濾,僅對失敗請求使用 StealthyFetcher。同時需要大量代理池(至少 1000 個 IP)以避免觸發速率限制。

代理輪換與非同步 Session 最佳實踐

Scrapling 的所有 Fetcher 都支援透過 proxy 參數指定代理,但為了大規模爬取,我們強烈建議使用代理輪換機制。替代方案有限公司開發了一套基於 Redis 的代理池管理系統,與 Scrapling 的非同步 Session 整合:

import asyncio
from scrapling import StealthyFetcher
from proxy_pool import ProxyPool  # 自訂的代理池

async def worker(proxy):
    async with StealthyFetcher(
        proxy=proxy,
        solve_cloudflare=True,
        headless=True,
    ) as fetcher:
        for url in url_queue:
            try:
                resp = await fetcher.fetch(url, timeout=20)
                # 處理成功回應
            except Exception:
                # 標記代理失敗,換下一個
                proxy_pool.mark_bad(proxy)
                break

async def main():
    proxy_pool = ProxyPool(redis_client)
    tasks = [worker(proxy_pool.get()) for _ in range(10)]
    await asyncio.gather(*tasks)

此外,每個 Fetcher 都支援使用 session 參數來管理瀏覽器實例。預設情況下,每次呼叫 fetch() 都會建立新的瀏覽器上下文,這在大規模爬取時效率較低。透過傳入相同的 session 物件,可以讓多個請求共用同一個瀏覽器實例,減少啟動開銷:

async with StealthyFetcher(solve_cloudflare=True) as fetcher:
    session = fetcher.create_session()  # 創建持久 Session
    for url in urls:
        resp = await session.fetch(url)
        # 所有請求共用同一個瀏覽器上下文,節省資源

成本效益分析

以繞過一次 Cloudflare Turnstile 挑戰來計算成本:

  • Fetcher:每次請求只需要極少的 CPU 與記憶體,但成功率僅 46%,意味著平均需要 2.17 次請求才能成功一次。但由於速度極快,每秒可送出 50+ 請求,IP 消耗與代理成本仍然是主要開銷。
  • StealthyFetcher:成功率 92%,平均 1.09 次請求即可成功。但每次請求需要 8.3 秒與 185MB 記憶體,若同時並發 10 個瀏覽器實例,伺服器可能需要 2GB 以上記憶體。若使用雲端伺服器(例如 AWS c5.xlarge 約 $0.17 USD/hr),每百萬次請求的運算成本約 $50-100。
  • DynamicFetcher:成本介於兩者之間,但成功率僅 68%,需要更高的重試次數。

在替代方案有限公司的經驗中,對於需要處理大量不同網站的爬蟲服務,最佳方案是建立一個 Fetcher 優先、StealthyFetcher 補位的混合架構,並搭配自動化的代理健康檢查與動態並發控制。此外,定時更新 Canvas noise 模型與瀏覽器版本也是維持高成功率的重要任務。我們每個月都會從真實使用者環境收集最新的 TLS 指紋與 Canvas 雜湊樣本,用於更新 Scrapling 的內部資料庫。

FAQ:常見問題與解答

Q1: Fetcher 與 StealthyFetcher 是否可以同時使用?

可以。實務上我們經常先使用 Fetcher 快速請求,如果偵測到 HTTP 狀態碼 403 或頁面包含 cf-browser-verify 之類的關鍵字,就立即改用 StealthyFetcher。Scrapling 沒有禁止混用兩種 Fetcher 實例,但注意它們使用不同的底層機制,因此不能共享同一個 session。

Q2: StealthyFetcher 的 solve_cloudflare=True 是否一定能繞過 Turnstile?

不保證 100%。根據我們的測試,成功率約 92%。失敗原因包括:IP 被標記為高風險、Canvas noise 模型不夠匹配特定瀏覽器版本、或目標網站使用了客製化的守門員(例如自訂的 JavaScript 挑戰)。建議搭配代理輪換與多次重試機制。

Q3: DynamicFetcher 可以像 StealthyFetcher 一樣使用抗檢測補丁嗎?

可以透過傳入 stealth_patches=True 參數啟用部分補丁,但效果不如專用的 StealthyFetcher 完整。我們建議若非特殊需求,若要繞過 Cloudflare 請直接使用 StealthyFetcher。

Q4: 為什麼 Fetcher 有時候連非互動式挑戰都無法通過?

可能是 curl_cffi 模擬的 TLS 指紋與目標伺服器預期的版本略有偏差,或者 HTTP/2 的設定(如 SETTINGS 幀順序)不夠精確。同時,有些網站會檢查 User-Agent 是否與 TLS 指紋一致(例如 Chrome 122 對應的 User-Agent 必須包含 Chrome/122)。請確保 impersonate 參數與 headers 中的 User-Agent 相匹配。

Q5: 大規模爬取時,建議的並發數是多少?

取決於伺服器資源與代理品質。我們建議每個瀏覽器實例(StealthyFetcher 或 DynamicFetcher)占用約 200MB 記憶體,假設伺服器有 8GB RAM,則最多同時啟動 30-35 個實例。若使用 Fetcher,並發數可以高達數百,但需注意目標網站的速率限制。總體建議:先從 5 個並發開始,逐步增加直到出現錯誤或超時。

Q6: Scrapling 是否支援 Firefox 或 WebKit?

目前 StealthyFetcher 與 DynamicFetcher 預設使用 Chromium,但可以透過 browser_type="firefox"browser_type="webkit" 參數切換。不過,抗檢測補丁(如 Canvas noise、WebRTC leak)主要針對 Chromium 設計,使用 Firefox 時成功率可能會較低。我們的測試顯示,Firefox 的 StealthyFetcher 成功率約為 78%,不如 Chromium 的 92%。


本文由替代方案有限公司(Alternative Solutions Ltd.)技術團隊撰寫。我們專注於企業級資料採礦與反封鎖解決方案。

Related Reading

延伸閱讀