2026 年 Scrapy 與 Selenium 比較:架構、取捨與實戰建議

最後更新於 August 11, 2026
Scrapy’s parallel HTTP workflow compared with Selenium browser automation
AI 摘要
一篇以架構為核心的實用比較,深入對照 Scrapy、Selenium、Playwright 與混合式爬取,涵蓋渲染、吞吐量、可靠性與維護成本等取捨。

網路上每一篇「Scrapy vs. Selenium」指南都在講差不多的事:Scrapy 比較快,Selenium 可以處理 JavaScript,自己選一個就好。方向大致沒錯,但「每分鐘能抓幾頁」這種萬用說法其實站不住腳。實際吞吐量會受到目標網站、網路狀況、並發數、瀏覽器生命週期、等待機制,以及反爬限制等因素影響。

這篇指南會比較真正能在不同專案中沿用的架構與營運取捨,也會補上很多比較文常漏掉的重點:瀏覽器自動化如何改變資源模型、為什麼選擇性渲染常常比全站用瀏覽器抓取更有效,以及什麼時候受管控的資料擷取 API 會比這兩個框架都更適合。

2026 年 Scrapy 與 Selenium 的快速結論

先講結論:只要是伺服器端直接渲染的頁面,Scrapy 在速度、規模與資源效率上都更有優勢。當你需要的是一個真正的瀏覽器去做真正的瀏覽器操作——點擊、輸入、等待彈窗動畫出現——Selenium 才是合適選擇。不過,這兩者對現代反爬機制都不是開箱即用就能輕鬆應對,而 Playwright 其實早就默默吃掉了 Selenium 原本承接的大多數場景。

這是我實際會用的決策表:

你的情境建議選擇
靜態或伺服器端渲染頁面、量很大Scrapy
重度 JS 的 SPA,含登入、點擊、多步驟流程Selenium 或 Playwright
混合型網站——大多靜態,只有少數區塊需要 JSScrapy + Playwright 混合架構
已知 URL,只需要結構化資料,且希望維護成本最低AI 擷取 API(如 Thunderbit 等)

截至 2026 年中,Scrapy 2.17.0 已可使用,Selenium 4 也持續擴展對 WebDriver BiDi 的支援,而 scrapy-playwright 則提供了一種受維護、可把特定 Scrapy 請求導向瀏覽器的做法。把上面那張決策表先記著,後面會一步步解釋為什麼它成立。

Decision tree for choosing Scrapy, Selenium, a hybrid renderer, or an API

Scrapy 與 Selenium 是什麼?為什麼開發者還在爭論它們

把 Scrapy 跟 Selenium 拿來比較,有點像拿貨車和轎車相比。兩者都能把東西從 A 點送到 B 點,但一個是為了高效率搬大量貨物而設計,另一個則是為了讓人親自駕駛、並且能隨時與路面互動而打造。這場爭論之所以一直存在,是因為兩個工具都「能抓資料」,只是它們原本就是為不同任務設計的,而不少團隊往往在還沒意識到之前就選錯了工具。

Scrapy:非同步爬取引擎

Scrapy 是一個純 Python 框架,建立在 Twisted 的事件驅動、非阻塞 I/O 模型之上。它不是瀏覽器——從來都不是——它做的事情就是送出 HTTP 請求,然後解析返回的 HTML。核心原理就是這樣。因為它不需要等待瀏覽器渲染畫面,所以可以一次發出大量請求,而且不會被阻塞。

Scrapy 開箱就內建 spiders、item pipelines、feed exporters、重試中介層與速率限制。這不是那種「你得自己從零拼起來」的框架,很多生產環境最常見的問題都已經替你處理好了。Scrapy 的 架構文件 把 Engine、Scheduler、Downloader 與 Item Pipeline 拆成獨立且可替換的元件,這也是它能長壽的原因:你可以在不重寫核心的情況下擴充功能。

但缺點也很明確:沒有瀏覽器,就沒有 JavaScript 執行。如果你的資料是在頁面載入後才透過前端 fetch 呼叫取得,Scrapy 就看不到。它只會讀初始 HTML 回應,就是這麼簡單。

Selenium:可程式化的瀏覽器

Selenium 是透過 W3C WebDriver protocol 來控制真正的瀏覽器——像 Chrome、Firefox、Edge。這份標準規格讓 Selenium 不受語言與瀏覽器綁定,不是什麼只支援 Chrome 的權宜之計。它能渲染 JavaScript、執行 AJAX 請求,也能像真人一樣點擊、捲動、輸入。

這讓 Selenium 很適合所有需要互動的情境:多步驟登入、導引流程、無限捲動、會觸發 API 呼叫的下拉選單。但每個瀏覽器工作階段都很吃資源。Selenium 自己的 Grid 容量規劃建議 甚至建議,光是做規劃時就要先抓每個瀏覽器 session 約 1 GB RAM 的預算——這還沒算上實際渲染頁面時的 CPU 負載。

還有一個常讓人踩雷的細節:頁面載入完成不代表 UI 已經準備好。Selenium 文件本身也警告不要混用 implicit 與 explicit waits,因為這樣很快就會讓 timeout 行為變得難以預測。如果你的 Selenium 腳本常常不穩,通常就是這個原因。

Scrapy vs. Selenium:別拿假萬用數字談效能

可信的效能測試,必須公開目標頁面、快取狀態、網路條件、並發策略、瀏覽器重用方式、等待條件與完整程式碼。沒有這些背景,所謂的每分鐘幾頁根本只是行銷,不是證據。不過,架構層面的比較依然很有價值:

工作負載特性ScrapySeleniumScrapy-Playwright
伺服器端渲染 HTML直接走 HTTP 路徑走完整瀏覽器路徑使用 Scrapy 的直接路徑
JavaScript 渲染內容需要額外渲染器原生瀏覽器執行選擇性瀏覽器渲染
並發模式非同步請求排程器由你的程式或 Grid 管理瀏覽器 sessionScrapy 排程器加上瀏覽器 context
資源特性沒有瀏覽器渲染成本有瀏覽器 CPU 與記憶體成本只有標記請求才需要瀏覽器成本
最適合的衡量方式在安全錯誤率下,每分鐘產出多少筆資料在安全錯誤率下,每分鐘完成多少流程分別衡量靜態與渲染請求的吞吐量

Scrapy 預設的並發請求設定只是上限,不是保證的吞吐量。真正速度取決於延遲、單網域限制、節流、重試、回應大小、解析工作量,以及目標站可接受的請求速率。Selenium 可以重用瀏覽器 session,所以它並不是每抓一頁就一定要新開一個瀏覽器;但每個啟用中的 session 仍然要執行並渲染瀏覽器環境。

混合架構之所以吸引人,是因為它能讓一般請求走 Scrapy 的 HTTP 路徑,只把需要渲染的頁面送進瀏覽器。這通常能減少瀏覽器工作量,但不代表一定更快:你仍然要分開衡量靜態與渲染路徑,把失敗率與重試率都算進去,並同時根據目標站安全性與可用記憶體來調整並發數。

Qualitative comparison of HTTP crawling, browser automation, and hybrid scraping

影響決策的核心差異

速度不是唯一變數。真正進到生產環境後,還有幾個非常實際的因素同樣重要。

JavaScript 渲染與動態內容

單靠 Scrapy 看不到任何前端渲染內容。Selenium 因為是真瀏覽器,所以看得到全部內容。中間派方案——較早期的 Scrapy-Splash(Lua 可腳本化)與較新的 scrapy-playwright(現代且較推薦)——可以讓你在 Scrapy 的爬取迴圈中選擇性渲染 JS,而不是每個請求都交給完整瀏覽器。如果你的目標站有 80%~90% 都是靜態 HTML,只有少數頁面才需要 JS,那選擇性渲染就是很明顯的正解。因為「只部分頁面需要 JS」就把全部流量都送進瀏覽器,純粹是在浪費算力。

擴展性與並發

把 Scrapy 從 1,000 頁擴到 1,000,000 頁,大多只是資源配置問題——增加並發請求,必要時透過 Redis 分散到多個 worker。擴 Selenium 則意味著你要線性增加瀏覽器實例,也就等於線性增加 RAM 與 CPU,最後你管理的其實是一個瀏覽器農場,還得用 Selenium Grid 來處理當機復原。不是 Selenium 不能擴展,而是它的擴展本身就是一個基礎設施專案,不是改個設定就好。

資料流程與匯出

Scrapy 的 item pipeline 天生就能做驗證、去重,並匯出成 JSON、CSV 或資料庫。Selenium 則完全沒有這些,你得從頭自己寫序列化與儲存邏輯。如果你在意資料品質與後續系統整合——這本來就該在意——那 Scrapy 已經幫你先做好一大段工作了。

維護性與長期穩定度

我觀察到的一個模式是:Scrapy spider 通常比較能撐得久,因為基於 middleware 的架構本來就會強迫一些結構。Selenium 腳本則更容易脆弱——瀏覽器更新可能讓 driver 壞掉,時序問題會導致執行不穩,每次 DOM 改動都得重調 selector。我還真的看過論壇上的開發者直接說,Selenium-based scraper「感覺不是拿來做要賣給客戶的東西的最佳選擇」。老實說,如果這個專案要撐好幾個月都不大改,這個直覺通常是對的。

反爬現實檢查:2026 年各工具面對防護機制的表現

這部分是其他比較文最常輕描淡寫、但也是最能決定你的爬蟲到底能不能跑起來的一段。Scrapy 和 Selenium 都不是為現代反爬基礎設施而生的,假裝這不是問題,只會讓你在生產環境裡被突襲。

防護層ScrapySeleniumScrapy-PlaywrightThunderbit API
JS 渲染❌ 需要中介層✅ 內建
TLS 指紋⚠️ 可被偵測⚠️ 可被偵測⚠️ 較好,但未完全解決✅ 已處理
CAPTCHA 解題❌ 手動處理❌ 手動處理❌ 手動處理✅ 內建
速率限制輪替⚠️ 自行處理代理⚠️ 自行處理代理⚠️ 自行處理代理✅ 受管理

Scrapy 會直接在瀏覽器指紋檢查中失手,因為它根本不是瀏覽器——它只是個 HTTP 客戶端。很多反爬服務商會直接把不像真瀏覽器的流量標記出來。Selenium 因為確實是一個真瀏覽器,所以能通過基本的 JS 檢查,但它還是會暴露像 navigator.webdriver 這類訊號;這是個標準化旗標,在自動化情境下會是 true。像 undetected-chromedriver 這類補丁會試圖掩蓋這些特徵,但它們本質上就是在和持續更新偵測規則的反爬供應商玩打地鼠。

隱身攻防戰:為什麼自建方案很脆弱

關於反偵測補丁,最不舒服但也最真實的一點是:它們更像維護跑步機,不是一次性的解法。undetected-chromedriverplaywright-stealth 會一直有效,直到 Cloudflare Turnstile 或 DataDome 發布更新,把你原本用的技巧偵測出來。然後你又得重新修補。我看過一些團隊花在維持隱身層的工程時間,比真正寫爬蟲本體還多。

速率限制也值得單獨提一下。當伺服器回傳 429 Too Many Requests 時,Retry-After 標頭只是建議,不是命令——很多網站根本不會送這個標頭,有些則會透過其他訊號來限流。Scrapy 的 AutoThrottle 可以根據觀察到的延遲自動調整等待時間,但它是反應式的,不是預防式的。

這也是為什麼受管控的資料擷取 API 很值得考慮——反爬處理變成別人的工程問題,而不是你自己的。這點後面還會再提。

Playwright 因素:為什麼「Scrapy vs. Selenium」已經不是完整圖景

如果還只把它看成兩個工具的對決,其實就忽略了過去幾年爬蟲圈真正發生的變化。開發者論壇上有很多人會說類似「我從 Selenium 換成 Playwright,結果很滿意」——但大多數比較文章卻只輕描淡寫提一下,甚至根本不提。

由 Microsoft 打造的 Playwright,透過單一 API 就能控制 Chromium、Firefox 和 WebKit。它的 actionability model 會先等元素真的可見、穩定、而且可互動,才執行動作——這大幅降低了許多 Selenium 腳本常見的時序不穩問題。它也能更有效率地處理 browser contexts,讓你開出彼此隔離的 session,而不用每次都重新啟動完整瀏覽器。

什麼時候 Playwright 會完全取代 Selenium

如果是純爬蟲用途——不是要延續既有 Selenium 測試基礎設施——那在 2026 年,Playwright 通常就是更好的工具。它建立 context 更快、每頁資源占用更低、原生支援 async,而且內建網路攔截。若你是從零開始一個爬蟲專案,且沒有既有 Selenium 測試套件要保留,其實沒什麼理由先選 Selenium。

例外情況是:如果你的團隊已經有 Selenium 測試基礎設施,或者你需要某些 Playwright 沒有那麼好支援的特殊瀏覽器設定,Selenium 仍然有存在價值。

scrapy-playwright 的運作方式

scrapy-playwright 是 Scrapy 的下載處理器,只會把標記了 meta={"playwright": True} 的請求導向真瀏覽器——其他請求都留在 Scrapy 快速的非同步 HTTP 路徑上。下面是一個簡化版 spider,會抓取一個分頁型目錄,而商品卡片是透過前端 JS 渲染出來的:

import scrapy

class CatalogSpider(scrapy.Spider):
    name = "catalog"

    def start_requests(self):
        yield scrapy.Request(
            "https://example.com/products?page=1",
            meta={"playwright": True, "playwright_include_page": True},
        )

    async def parse(self, response):
        page = response.meta["playwright_page"]
        products = response.css("div.product-card")
        for product in products:
            yield {
                "title": product.css("h3::text").get(),
                "price": product.css(".price::text").get(),
            }

        next_page = response.css("a.next::attr(href)").get()
        if next_page:
            yield scrapy.Request(
                response.urljoin(next_page),
                meta={"playwright": True, "playwright_include_page": True},
            )
        await page.close()

只有真正需要渲染的頁面才會進瀏覽器。這就是混合架構的核心——不是每個請求都要付瀏覽器成本,而是只有那些真的需要的請求才付。

Scrapy-Splash vs. Scrapy-Playwright:該用哪個中介層

Scrapy-Splash 需要另外架設一個 Splash Docker 服務,還得寫 Lua 腳本來做互動——能用,但相對更重,也比較老舊。scrapy-playwright 則是直接整合進 Scrapy 的非同步 event loop,支援三大瀏覽器引擎,複雜互動也不需要再額外綁一種腳本語言。如果你 2026 年要開新專案,老實說已經沒有什麼理由再選 Splash 了。

可上線的混合架構

很多文章都只說「你可以把 Scrapy 和 Selenium 結合起來」,然後就沒了。那不是架構,那只是建議。下面才是一個真正能上生產環境的設計。

流程是這樣:Scrapy scheduler 先把請求送進 URL router,判斷頁面是靜態還是動態。靜態請求直接走 Scrapy 的標準 downloader。動態請求則會被標記並路由到 Playwright middleware,由它管理一組 browser context。最後兩條路徑都會回到同一個 item pipeline 做驗證、去重與匯出——不管資料是來自原始 HTML 還是渲染後的 DOM,最後都會變成同一份 JSON、CSV 或資料庫輸出。

如果你真的要上 production,還有幾個部署建議:用 Docker 容器化,確保 Playwright 的瀏覽器 binary 在不同環境中一致;根據可用 RAM 限制 Playwright context 的並發數(我不建議在一般 4 GB 機器上超過 8~10 個 context);排程工作最好透過 cron 或 CI/CD pipeline 執行,不要讓一個 process 永遠掛著跑。

這種做法的好處是控制力最大,但你也要自己負責瀏覽器 binary 更新、context 生命週期 bug(沒關閉的頁面會讓爬取卡住)、proxy 輪替,以及所有需要補上的反爬方案。這是很真實的工程投入,在承諾之前最好先誠實評估。

對於想要結構化輸出、但不想自己養這些基礎設施的團隊,Thunderbit 的 CLI 採取的是另一種解法:

thunderbit batch extract --schema schema.json --file urls.txt

同樣輸出結構化 JSON。不需要 spider 程式碼、不需要瀏覽器池、不需要維護反爬連線。你用部分客製化能力換取更快上線——這不是絕對升級,而是一種合理取捨,完全取決於你的專案到底需要多少控制權。

直接跳過框架:什麼時候 AI 擷取 API 會比兩者都更好

有時候,開發者會突然發現自己其實根本不需要爬取框架。他們只是要從 500 個已知 URL 拿到結構化資料,而如果為了這件事去做 spider、瀏覽器池和反爬層,感覺太大材小用——因為通常真的就是這樣。

Thunderbit 就是要補這個缺口的。先講清楚:它不是複雜、遞迴、含自訂邏輯爬取任務中 Scrapy 的替代品。它是為了不同、且更窄的問題而設計的不同工具。

Open APIPOST /extract 會接收 JSON Schema,回傳與其對應的結構化資料——不是原始 HTML,也不是一堆還要你自己解析的 Markdown。POST /distill 則做相反的事,回傳乾淨的 Markdown,可直接餵給 RAG pipeline 或 LLM。這個受管服務也支援 JavaScript 渲染與反爬處理,所以你不用自己維護那套基礎設施。現行的 Distill vs. Extract 指南 顯示 Distill 每頁 1 點、Extract 每頁 20 點;不過實際規格可能會變,正式規劃前還是先看最新文件。

MCP Server:對 Claude 或 Cursor 這類 AI agent 而言,Thunderbit 的 MCP server 把 distillation、結構化擷取、欄位建議與批次作業都變成可呼叫工具,讓 agent 可以在任務進行中直接抓取最新網頁資料,不必跳出原本環境。

CLI:官方文件中的 Thunderbit CLI 支援像 thunderbit extract <url> --schema schema.json 這類指令,很適合終端機流程與排程作業。你也可以把 distill 出來的 Markdown pipe 到其他工具,快速完成一次性研究任務。

如果你連程式碼都不想碰,Thunderbit Chrome Extension 提供的是點選式介面,對團隊裡有非工程背景、但仍需要資料的人來說尤其值得一看。如果你想看更完整的脈絡,我另外也寫了關於 AI 網頁爬取免程式網頁爬取 的文章。

先誠實判斷自己屬於哪一類:如果你要做的是跨多站、含遞迴連結追蹤與自訂邏輯的複雜爬取,Scrapy 仍然是最適合的選擇。互動流程很多的任務,選 Selenium 或 Playwright。可是「我只需要這些已知 URL 的結構化資料」其實比前兩者的設計範圍都更窄,這種情境下,API 確實可以省掉 spider 程式碼、反爬接線,以及你自己維護整套基礎設施的後續成本。

Scrapy vs. Selenium vs. Playwright vs. AI API:並列比較

功能ScrapySeleniumScrapy-PlaywrightThunderbit API
語言支援僅 PythonPython、Java、C#、JS、RubyPythonREST(任何語言)
JS 渲染否(需要中介層)是,內建
非同步/並發原生支援,效能高每個 instance 有限制透過 Scrapy 原生支援伺服器端受管控
反爬處理自行處理自行處理部分處理內建
資料流程/匯出內建自行處理內建直接輸出結構化 JSON
安裝複雜度中等起步簡單,大規模時較高中等到偏高極低
維護成本低到中等中等幾乎沒有
最適合大量靜態爬取高互動流程靜態/動態混合網站已知 URL、結構化輸出

如果你在看這四種之外的其他爬蟲選項,也值得順手比較一下 Instant Data Scraper 替代方案最佳 AI 網頁爬蟲 的表現——現在工具很多,但不是每個都解決同一個問題。

2026 年網頁爬取的法律與倫理提醒

這段我簡短帶過,因為不是本文主軸,但它很重要。Scrapy 的 ROBOTSTXT_OBEY 設定會讓你的 spider 遵守 robots.txt 規則——這是好習慣,不過也要知道,Robots Exclusion Protocol 本身就明確表示,這些規則不是法律授權。Selenium 和 Playwright 則沒有內建 robots.txt 合規機制——完全要靠你自己處理。無論你用什麼工具,抓取與重用資料前,都應先確認網站服務條款與你所在地適用法律;「資料是公開可見的」不代表在所有地區都當然合法。

為你的 2026 爬取專案選對工具

真正的關鍵其實是四個問題:內容類型是什麼、規模多大、需要多少互動、以及你願意承擔多少後續維護。大規模靜態頁面,選 Scrapy。大量 JS 且真的需要互動,選 Selenium 或 Playwright。兩者混合,就做混合架構。若是已知 URL、只要結構化輸出且希望維護最低,像 Thunderbit 這類 API 很可能比它的成本更省時。

「Scrapy vs. Selenium」從來都不是完整問題——它只是過去唯一常見的框架。Playwright 改變了中間地帶,而 AI 擷取 API 則替那些意識到自己其實是在建基礎設施、不是在解決商業問題的人,開出了一條全新的路。正式選邊站之前,先試試免費方案通常很值得——suggest-fields 是免費的,而 distill 只消耗 1 點,所以你可以先確認 API 路線適不適合,再開始寫一行 spider 程式碼。

常見問題

Scrapy 比 Selenium 更快嗎? 以我的測試來看,是的——在靜態頁面上通常快上一個數量級,因為 Scrapy 的非同步架構完全省掉瀏覽器開銷。當 Scrapy 對重度 JS 頁面改用 Playwright middleware 時,這個差距會縮小,但在混合工作負載下,Scrapy 整體吞吐量通常還是更高,因為非 JS 頁面仍可走快速路徑。

Scrapy 可以處理 JavaScript 渲染頁面嗎? 不能只靠它自己——Scrapy 只會看到初始 HTML 回應。加入 scrapy-playwright,或較舊的 Scrapy-Splash 當作中介層,就能針對特定請求用真瀏覽器渲染,同時讓其餘爬取流程留在 Scrapy 原生、較快的路徑上。

什麼時候該用 Selenium 而不是 Scrapy? 當你需要完整瀏覽器互動——多步驟登入、點選導引流程、填寫表單——而且頁面數量是中等而不是超大量時。若你已經有 Selenium 的測試基礎設施,也很適合拿來重用做爬取。

2026 年 Playwright 比 Selenium 更適合爬蟲嗎? 就爬蟲用途來說,通常是的——Playwright 的效能通常更好、自動等待更完整、每個 browser context 的資源占用更輕。Selenium 仍然對那些已經在跑成熟跨瀏覽器測試套件的團隊更有優勢,因為 Playwright 並不是為了完全取代那套東西而設計的。

什麼是 AI 擷取 API?什麼時候它會取代 Scrapy 或 Selenium? AI 擷取 API,例如 Thunderbit 的 Open API,會在伺服器端處理 JS 渲染、反爬防護與資料擷取,然後回傳你定義 schema 對應的結構化 JSON。當你手上是已知 URL,而且需要的是結構化輸出、又不想自己建或維護爬取基礎設施時,它就是對的選擇——但它不是複雜、遞迴、含自訂邏輯爬取任務中 Scrapy 的替代品。

了解更多

Ke
Ke
Thunderbit 技術長|資深資料科學家與機器學習專家 Ke Shen 在機器學習與資料科學領域擁有近十年經驗,畢業於哥倫比亞大學,曾任 Walmart Labs 資深資料科學家。他精通 Python、R、Java 與統計學,且具備深受同儕認可的深厚專業,分享如何將複雜的 AI 演算法從理論落實到可投入生產的架構的實戰見解。
Topics
Scrapy 與 Selenium 比較Python 網頁爬蟲瀏覽器自動化
目錄
Thunderbit · AI 網頁資料代理

1 次點擊 內擷取任何頁面的資料

獲 250,000+ 用戶信賴
提供免費方案
從網頁到試算表
描述你需要什麼——Thunderbit 的 AI Agent 會幫你抓取並匯出到 Excel、Google Sheets、Airtable 或 Notion。可免費開始。
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week