Crawl4AI 完整教學 2026:8 萬星開源 LLM 友善爬蟲框架,安裝、Markdown 轉換、結構化提取到 Docker 部署一次學會
結論:Crawl4AI 是 GitHub 上最受歡迎的開源爬蟲框架(80K+ 星、Apache-2.0),把「爬網頁」變成「餵給 LLM 的乾淨資料」——一行程式碼輸出 Markdown,CSS Schema 或 LLM 提取結構化 JSON,並支援深層爬取、快取、反偵測與 Docker API 部署。
如果你 2026 年還在用 requests + BeautifulSoup 一個一個寫 CSS selector,再自己處理 JavaScript 渲染頁面、把 HTML 轉成 LLM 能吃的文字——恭喜你,你正在重複造輪子。Crawl4AI 就是為了解決這個痛點而生的開源專案:它是 GitHub 上星數最高的爬蟲專案(截至 2026 年 8 月超過 80,000 顆星、8,300+ forks),由 UncleCode(Behnam Zamanian)開發,採用 Apache-2.0 授權,可以免費商用。
本教學帶你從安裝、快速開始、核心功能,一路到 Docker 部署與實戰範例,全部用官方一手資料整理。
為什麼 LLM 專案需要 Crawl4AI?
做 RAG、AI Agent 或資料管線的人,爬蟲的痛點其實很一致:
| 痛點 | 傳統做法(requests + BS4) | Crawl4AI 的做法 |
|---|---|---|
| JavaScript 渲染的頁面抓不到 | 再上 Playwright/Selenium 自己管理瀏覽器 | 內建 Playwright 瀏覽器池,非同步並行 |
| HTML 轉 Markdown 很髒 | 自己寫 html2text + 清理 | 內建 clean/fit Markdown 生成器(含 BM25 過濾) |
| 要結構化 JSON | 手動寫 selector + 除錯 | CSS Schema 直接出 JSON,或 LLM 提取 |
| 爬整站 | 自己寫 BFS/DFS 迴圈 | 內建深層爬取策略 + 崩潰續爬 |
| 被反爬擋 | 自己想辦法 | Stealth 模式、undetected Chrome、proxy 鏈 |
| 部署成服務 | 自己寫 FastAPI | 官方 Docker 映像(含 JWT 認證、監控面板、MCP) |
一句話:Crawl4AI 把「爬蟲基礎設施」打包好,你只需要專注在「要爬什麼、要提取什麼」。
安裝:3 分鐘上線
# 1. 安裝套件
pip install -U crawl4ai
# 2. 執行安裝後設定(自動安裝 Playwright 瀏覽器)
crawl4ai-setup
# 3. 驗證安裝
crawl4ai-doctor
如果 Playwright 安裝出問題,手動補:
python -m playwright install --with-deps chromium
⚠️ 注意:同步版(
crawl4ai[sync],基於 Selenium)已被官方標記為 deprecated,未來會移除。新專案請直接用非同步版(預設)。
也可以用 Docker 一鍵跑 API 服務(建議正式環境用):
docker pull unclecode/crawl4ai:latest
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest
啟動後瀏覽器打開 http://localhost:11235/dashboard 看即時監控,/playground 是互動測試介面。
快速開始:兩種方式
方式一:CLI(最快驗證)
# 基本爬取,輸出 Markdown
crwl https://www.nbcnews.com/business -o markdown
# 深層爬取:BFS 策略、最多 10 頁
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10
# 用 LLM 提取特定資訊
crwl https://www.example.com/products -q "Extract all product prices"
方式二:Python API
import asyncio
from crawl4ai import AsyncWebCrawler
async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://www.nbcnews.com/business")
print(result.markdown) # 乾淨的 Markdown
if __name__ == "__main__":
asyncio.run(main())
執行後,瀏覽器會自動開無頭 Chromium 抓取頁面,回傳的 result.markdown 就是乾淨、結構化的 Markdown——標題、表格、程式碼區塊全部保留,導覽列、廣告、側欄雜訊都被清掉。對比傳統做法,這一段程式碼等於「Playwright 啟動 + 等渲染 + html2text + 雜訊清理」全部包辦。
核心功能 1:LLM 友善的 Markdown 生成
Crawl4AI 的 Markdown 生成是它的招牌功能,提供兩種模式:
- Clean Markdown:基礎清理,保留完整結構。
- Fit Markdown:用啟發式演算法(
PruningContentFilter,可調 threshold)或 BM25 演算法(依你的查詢)過濾掉不相關內容,只留核心資訊——特別適合 RAG 檢索,直接省 token。
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
async def main():
browser_config = BrowserConfig(headless=True)
run_config = CrawlerRunConfig(
cache_mode=CacheMode.ENABLED,
markdown_generator=DefaultMarkdownGenerator(
content_filter=PruningContentFilter(threshold=0.48, threshold_type="fixed")
),
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(url="https://docs.micronaut.io/4.9.9/guide/", config=run_config)
print(f"raw_markdown 長度: {len(result.markdown.raw_markdown)}")
print(f"fit_markdown 長度: {len(result.markdown.fit_markdown)}")
asyncio.run(main())
fit_markdown 通常比 raw_markdown 短 50% 以上——對 token 預算敏感的人來說,這是免費的節流。
核心功能 2:結構化提取(兩種路線)
路線 A:CSS Schema(不用 LLM,免費、快、可預測)
適合版面固定的頁面(電商、新聞列表)。定義 schema,直接輸出 JSON:
import asyncio, json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
from crawl4ai import JsonCssExtractionStrategy
schema = {
"name": "Product List",
"baseSelector": "div.product-card",
"fields": [
{"name": "title", "selector": "h3.product-title", "type": "text"},
{"name": "price", "selector": "span.price", "type": "text"},
{"name": "image", "selector": "img", "type": "attribute", "attribute": "src"},
],
}
async def main():
strategy = JsonCssExtractionStrategy(schema, verbose=True)
config = CrawlerRunConfig(extraction_strategy=strategy)
async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
result = await crawler.arun(url="https://example-shop.com/products", config=config)
products = json.loads(result.extracted_content)
print(f"提取到 {len(products)} 筆商品")
asyncio.run(main())
路線 B:LLM 提取(適合版面不固定、需要理解的內容)
支援任何 LiteLLM 支援的 provider——OpenAI、Anthropic、Gemini,甚至本地 ollama/qwen2。搭配 Pydantic schema 直接產出結構化資料:
import asyncio, os
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, LLMConfig
from crawl4ai import LLMExtractionStrategy
from pydantic import BaseModel, Field
class ModelFee(BaseModel):
model_name: str = Field(..., description="模型名稱")
input_fee: str = Field(..., description="每 1M token 輸入費用")
output_fee: str = Field(..., description="每 1M token 輸出費用")
async def main():
strategy = LLMExtractionStrategy(
llm_config=LLMConfig(provider="openai/gpt-4o", api_token=os.getenv("OPENAI_API_KEY")),
schema=ModelFee.schema(),
extraction_type="schema",
instruction="從內容中提取所有模型名稱與 token 費用,一個都不要漏。",
)
config = CrawlerRunConfig(extraction_strategy=strategy)
async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
result = await crawler.arun(url="https://openai.com/api/pricing/", config=config)
print(result.extracted_content)
asyncio.run(main())
另外還有 LLMTableExtraction 專門處理超大表格(自動 chunking + 合併),以及直接把網頁表格轉成 pandas DataFrame 的能力。
Crawl4AI vs 其他爬蟲方案
| 工具 | 型態 | 學習曲線 | LLM 輸出 | JS 渲染 | 深層爬取 | 成本 | 適合場景 |
|---|---|---|---|---|---|---|---|
| Crawl4AI | Python 套件/自架 | 低 | ✅ 內建 Markdown/JSON | ✅ | ✅ | 免費(自架) | RAG/Agent 資料管線、中小型爬蟲 |
| requests + BeautifulSoup | Python 套件 | 低 | ❌ 自己寫 | ❌ | ❌ | 免費 | 靜態頁面快速原型 |
| Playwright | 瀏覽器自動化 | 中高 | ❌ 自己寫 | ✅ | ❌ | 免費 | 需要精細控制瀏覽器行為 |
| Scrapy | Python 框架 | 高 | ❌ 自己寫 | 需外掛 | ✅ | 免費 | 大型、長期維運的爬蟲專案 |
| Firecrawl | 雲端 SaaS | 低 | ✅ | ✅ | ✅ | 付費(有免費額度) | 不想自己維運、量小 |
| Jina Reader / r.jina.ai | 雲端 API | 低 | ✅(Markdown) | ✅ | ❌ | 付費 | 快速把單一 URL 轉 Markdown |
選型建議:預算敏感或要客製化 → Crawl4AI;只想快速爬幾十個頁面不想要任何基礎設施 → Firecrawl 免費額度或 Jina Reader;要長期大規模爬蟲且團隊熟 Python → 可以考慮 Scrapy,但 LLM 資料管線通常 Crawl4AI 就夠了。
進階功能一次看懂
深層爬取(Deep Crawl)
BFS、DFS、BestFirst 三種策略,支援 prefetch=True 模式(只抓 URL 不生成 Markdown,速度快 5-10 倍,適合兩階段爬取:先發現、再精選),還有 crash recovery——resume_state 讓長爬蟲掛掉後能從 checkpoint 續爬,狀態可存 Redis/DB。
from crawl4ai.deep_crawling import BFSDeepCrawlStrategy
strategy = BFSDeepCrawlStrategy(
max_depth=3,
resume_state=saved_state, # 從 checkpoint 續爬
on_state_change=save_to_redis, # 每爬完一頁回呼
)
反偵測與瀏覽器控制
- Stealth 模式:
browser_type="undetected"可繞過 Cloudflare、Akamai 等常見 bot 偵測; - Proxy 鏈:三層偵測(已知供應商 → 通用阻擋特徵 → 結構完整性),自動重試 + proxy escalation;
- 持久化 profile:
use_persistent_context=True保存登入狀態、cookies; - Shadow DOM 攤平:
flatten_shadow_dom=True提取 shadow DOM 內的內容; - 虛擬滾動:
VirtualScrollConfig處理 infinite scroll 頁面。
Docker API 與 MCP 整合
自架 Docker 後,Crawl4AI 提供完整的 REST API:POST /crawl 提交爬蟲任務、GET /task/{id} 查詢結果,支援 HTML 提取、截圖、PDF 生成與 JavaScript 執行。最新版本還內建 MCP 整合,可以直接把 Crawl4AI 接進 Claude Code 等 AI 工具當工具用。
import requests
r = requests.post("http://localhost:11235/crawl", json={"urls": ["https://example.com"]})
task_id = r.json()["task_id"]
result = requests.get(f"http://localhost:11235/task/{task_id}")
⚠️ 資安提醒:2025-2026 年間 Crawl4AI 的 Docker API 曾被挖出多個嚴重漏洞(RCE、SSRF、硬編碼 JWT secret 等)。v0.8.7 起已修復,v0.9.0 起改為 secure-by-default:認證預設開啟、沒有 token 時只綁定 loopback。自架 Docker 版務必升級到最新版,並用 JWT token 保護,不要把 API 直接暴露到公網。
實戰:電商商品價格爬取
把前面學的組合起來,一個完整的價格監控爬蟲(也適合拿來接價格監控這類應用場景):
import asyncio, json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai import JsonCssExtractionStrategy
schema = {
"name": "Price Monitor",
"baseSelector": ".item",
"fields": [
{"name": "name", "selector": ".title", "type": "text"},
{"name": "price", "selector": ".price", "type": "text"},
{"name": "url", "selector": "a", "type": "attribute", "attribute": "href"},
],
}
async def check_prices(urls):
config = CrawlerRunConfig(
extraction_strategy=JsonCssExtractionStrategy(schema),
cache_mode=CacheMode.ENABLED, # 同一天重複爬直接命中快取
wait_for="css:.item", # 等動態內容載入
)
async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
results = await crawler.arun_many(urls, config=config)
for r in results:
items = json.loads(r.extracted_content)
print(f"{r.url}: {len(items)} 筆商品")
asyncio.run(check_prices([
"https://example-shop.com/3c/notebook",
"https://example-shop.com/3c/ssd",
]))
實務上你可以把結果寫進 SQLite(搭配 SQLite 教學),每天排程跑一次,價格一降就通知。
使用 Crawl4AI 的注意事項
- 遵守 robots.txt 與網站服務條款:技術上能爬 ≠ 法律上可以爬。爬蟲前先看目標網站的 robots.txt 與 ToS,控制請求頻率(Crawl4AI 支援 cache 與延遲設定),別把人家網站爬掛。
- 個人資料與著作權:爬到的內容若要商用,注意個資法與著作權問題,尤其是電商價格、評論這類資料。
- 版本更新頻繁:Crawl4AI 迭代非常快(2026 年已到 v0.9.2),API 偶有調整,追蹤 Release Notes 再升級。
- LLM 提取成本:路線 B 會消耗 token,量大時建議先用 CSS Schema(路線 A),只對版面不固定的頁面用 LLM。
延伸閱讀
- MarkItDown:Microsoft 的通用文件轉 Markdown 轉換器
- Marker:使用深度學習的開源 PDF 轉 Markdown 工具
- Mistral OCR 4.1 完整教學:每千頁 4 美元的雲端 OCR,與 MinerU、Marker、Docling 開源工具怎麼選?
- 網站防爬蟲實戰指南:從 robots.txt 到 Cloudflare Bot 管理,2026 最新防護策略
- MCP 完整教學 2026:什麼是 Model Context Protocol?從架構、三大原語到 Python 實作第一個 MCP Server 的權威指南
- FastAPI 完整教學 2026:從安裝、路由、Pydantic v2 到依賴注入與部署,Python 最強 API 框架實戰指南
