Crawl4AI 完整教學 2026:8 萬星開源 LLM 友善爬蟲框架,安裝、Markdown 轉換、結構化提取到 Docker 部署一次學會

Crawl4AI 是目前 GitHub 最受歡迎的開源爬蟲框架(80K+ 星、Apache-2.0),專為 LLM/RAG 設計:一鍵把網頁轉成乾淨 Markdown、用 CSS Schema 或 LLM 提取結構化 JSON、支援深層爬取與 Docker API 部署。本教學從安裝、CLI、Python 實作到 Docker 自架完整講解,附 Playwright/BeautifulSoup/Firecrawl 比較表與電商價格爬取實戰。

  • Dennis
  • 8 分鐘閱讀
Crawl4AI 完整教學 2026:8 萬星開源 LLM 友善爬蟲框架,安裝、Markdown 轉換、結構化提取到 Docker 部署一次學會

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 渲染深層爬取成本適合場景
Crawl4AIPython 套件/自架✅ 內建 Markdown/JSON免費(自架)RAG/Agent 資料管線、中小型爬蟲
requests + BeautifulSoupPython 套件❌ 自己寫免費靜態頁面快速原型
Playwright瀏覽器自動化中高❌ 自己寫免費需要精細控制瀏覽器行為
ScrapyPython 框架❌ 自己寫需外掛免費大型、長期維運的爬蟲專案
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;
  • 持久化 profileuse_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 的注意事項

  1. 遵守 robots.txt 與網站服務條款:技術上能爬 ≠ 法律上可以爬。爬蟲前先看目標網站的 robots.txt 與 ToS,控制請求頻率(Crawl4AI 支援 cache 與延遲設定),別把人家網站爬掛。
  2. 個人資料與著作權:爬到的內容若要商用,注意個資法與著作權問題,尤其是電商價格、評論這類資料。
  3. 版本更新頻繁:Crawl4AI 迭代非常快(2026 年已到 v0.9.2),API 偶有調整,追蹤 Release Notes 再升級。
  4. LLM 提取成本:路線 B 會消耗 token,量大時建議先用 CSS Schema(路線 A),只對版面不固定的頁面用 LLM。

延伸閱讀

參考來源

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友