開發 C/C++ 網路爬蟲時,面臨核心選擇:**純 HTTP 客戶端 (libcurl)** 還是 **完整瀏覽器引擎**?本文從協議支援、JS 渲染、資源消耗、部署複雜度四維度對比,給出架構決策建議。
| 維度 | libcurl | WebKit / QtWebKit / QtWebEngine |
|---|---|---|
| HTTP/HTTPS/代理 | ✅ 原生完美支援 (HTTP/2、SOCKS5、認證、Cookie 罐) | ✅ 支援,但配置較繁瑣 |
| JavaScript 執行 | ❌ 無 | ✅ 完整 JS 引擎 (V8/JavaScriptCore),支援 SPA、AJAX、動態渲染 |
| DOM 解析/選擇器 | 需搭配 htmlcxx/Gumbo/Selectolax | 原生 `document.querySelector`、XPath |
| 記憶體佔用 (單實例) | ~1-5 MB | ~100-500 MB+ (含渲染進程) |
| 啟動延遲 | ~毫秒級 | ~秒級 (冷啟動) |
| 並發擴展性 | 極佳 (event loop / thread pool 可跑萬連線) | 差 (每頁面一進程,受限於 RAM/CPU) |
| 部署依賴 | 單一 `libcurl.so` + `libssl.so` | 龐大運行時 (Qt + WebEngine + ICU + 字體 + GPU 驅動) |
| 無頭模式 | 原生無頭 | 支援 (`--headless` / `QWebEnginePage` 可見性關閉) |
| 授權 | MIT/X11 (極度寬鬆) | LGPL v3 (動態連結需提供重新連結機制) / BSD (WebKit) |
目標頁面是否需要執行 JavaScript 才能看到目標資料?
├─ 否 (靜態 HTML、API 回傳 JSON) → 【選 libcurl】
│ ├─ 簡單 GET/POST → libcurl easy interface
│ ├─ 高併發、代理池、Cookie 管理 → libcurl multi interface + 自建連線池
│ └─ HTML 解析 → 搭配 Gumbo (C) / Selectolax (C/Rust) / htmlcxx (C++)
│
└─ 是 (SPA、無限滾動、AJAX 分頁、Canvas 圖表、反爬蟲 JS 混淆)
├─ 輕量級 JS 場景 (僅需執行少量腳本) → 【選 QuickJS / Duktape / MuJS 嵌入式引擎 + libcurl】
│ 輕量、可嵌入、無 DOM/渲染,僅執行純邏輯 JS
│
└─ 完整瀏覽器環境 (需 DOM、CSS、Canvas、WebGL、截圖) → 【選 Playwright / Puppeteer (Node.js) / Selenium + ChromeDriver】
⚠️ C++ 原生無頭瀏覽器生態極弱 (QtWebEngine 重、CEF 複雜、WebKitGTK 過時)
💡 **強烈建議:爬蟲核心用 Node.js (Playwright) / Python (Playwright/DrissionPage),C++ 僅做高效能下載/解析微服務**
[調度器 (Go/Python)]
│
├─▶ [靜態下載服務] --libcurl+Gumbo--> 靜態頁面/JSON/API (90% 流量)
│ 高併發、低資源、易擴展
│
└─▶ [動態渲染服務] --Playwright/Chromium--> SPA/JS 重度頁面 (10% 流量)
容器化部署、按需擴縮容、隔離崩潰風險
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
curl_easy_setopt(curl, CURLOPT_PROXY, "socks5://127.0.0.1:1080"); // SOCKS5 代理
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "user:pass");
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); // 持久化 Cookie
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, 1024*1024); // 斷點續傳
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
**90% 爬蟲需求不需要瀏覽器引擎**。優先選 **libcurl + 輕量 HTML 解析器 (Gumbo/Selectolax)**,僅在目標頁面**強制依賴 JS 渲染**時,引入 **Playwright (Node.js/Python)** 作為獨立渲染微服務。C++ 原生 WebKit/QtWebEngine 部署維護成本極高,不建議作為爬蟲主力。