2026 年 Scrapy vs. Selenium:架构、取舍与实用建议

最后更新于 August 10, 2026
Scrapy’s parallel HTTP workflow compared with Selenium browser automation
AI 摘要
从架构视角出发,实用对比 Scrapy、Selenium、Playwright 和混合爬取方案,并涵盖渲染、吞吐量、稳定性与维护成本等取舍。

网上每一篇“Scrapy vs. Selenium”指南说法都差不多:Scrapy 更快,Selenium 能处理 JavaScript,选你喜欢的就行。这个方向大体没错,但那种放之四海而皆准的“每分钟抓多少页”说法其实并不靠谱。吞吐量取决于目标站点、网络、并发、浏览器生命周期、等待机制,以及反爬控制。

这篇文章会比较两者在架构和实际运维中的取舍,讲清楚那些常被忽略的点:浏览器自动化如何改变资源模型,为什么“只在必要时渲染”通常比全站浏览器抓取更划算,以及什么时候托管式提取 API 比这两个框架都更适合。

2026 年 Scrapy vs. Selenium 快速结论

先说结论:如果目标是服务端渲染页面,Scrapy 在速度、规模和资源效率上更占优势。需要真正的浏览器去做真正的浏览器操作——点击、输入、等待弹窗动画出现——那就选 Selenium。可别指望它们开箱即用就能轻松应对现代反爬;而且现在很多场景里,Playwright 已经悄悄取代了过去大家会选 Selenium 的大部分用途。

这是我实际会用的决策表:

你的场景选择
静态页或服务端渲染页,且数据量大Scrapy
JS 很重的 SPA,带登录、点击、多步骤流程Selenium 或 Playwright
混合型网站——大部分静态,少量 JS 专属区域Scrapy-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 开箱自带 spider、item pipeline、feed exporter、重试中间件和限速机制。这不是一个“很多东西都得自己从头写”的框架,很多生产环境需要的能力已经内置好了。Scrapy 的架构文档把 Engine、Scheduler、Downloader 和 Item Pipeline 设计成彼此独立、可替换的组件,这也是它经得住时间考验的原因:你可以在不重写核心的情况下不断扩展。

但问题也很明显:没有浏览器,就不会执行 JavaScript。如果数据是在页面渲染后,通过客户端 fetch 调用加载的,Scrapy 根本看不到这些内容。它只能读取初始 HTML 响应,仅此而已。

Selenium:可编程的浏览器

Selenium 通过 W3C WebDriver 协议控制真实浏览器——Chrome、Firefox、Edge 都可以。这份标准规范让 Selenium 具备跨语言、跨浏览器能力,而不是某种只适用于 Chrome 的小技巧。它能渲染 JavaScript、执行 AJAX 请求,还能像真人一样点击、滚动和输入。

所以,只要任务依赖交互,Selenium 就是合适选择:多步骤登录、分步向导、无限滚动、会触发 API 请求的下拉菜单等等。但每个浏览器会话都很“重”。Selenium 自己的Grid 资源规划建议提到,仅从规划角度看,每个浏览器会话最好按大约 1 GB 内存来估算——这还没算页面渲染带来的 CPU 占用。

有个常见坑经常让人抓狂:页面加载完成并不代表界面已经可用。Selenium 官方文档也提醒,不要把隐式等待和显式等待混着用,因为超时行为会变得很难预测。如果你的 Selenium 脚本时不时抽风,通常问题就在这里。

Scrapy vs. Selenium:别拿虚假的统一数字讲性能

靠谱的 benchmark 必须公开目标页面、缓存状态、网络条件、并发设置、浏览器复用策略、等待条件和完整代码。没有这些上下文,所谓“每分钟抓多少页”就是营销,不是证据。不过,架构层面的比较依然很有价值:

工作负载特征ScrapySeleniumScrapy-Playwright
服务端渲染 HTML直接 HTTP 路径完整浏览器路径使用 Scrapy 的直接路径
JavaScript 渲染内容需要额外渲染器原生浏览器执行按需浏览器渲染
并发模型异步请求调度器由代码或 Grid 管理浏览器会话Scrapy 调度器 + 浏览器上下文
资源特征没有浏览器渲染开销有浏览器 CPU 和内存开销只给被标记请求付出浏览器成本
最佳衡量方式在安全错误率下的每分钟条目数在安全错误率下的每分钟完成流程数分别衡量静态与渲染请求吞吐

Scrapy 默认的并发请求数只是上限,不是承诺的吞吐量。真正速度取决于延迟、单域名限制、限流、重试、响应体大小、解析工作量,以及目标站点可接受的请求频率。Selenium 可以复用浏览器会话,所以它并不一定是“每页都新开一个浏览器”,但每个活跃会话仍然要执行并渲染完整的浏览器环境。

混合方案之所以吸引人,是因为它让普通请求继续走 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,那按需渲染显然更合理。只是因为“有些页面需要”就把全部请求都送进浏览器,是纯粹浪费算力。

可扩展性与并发

把 Scrapy 从 1,000 页扩展到 1,000,000 页,主要是资源配置问题——提高并发请求数,必要时还可以用 Redis 分布式拆分。扩展 Selenium 则是线性增加浏览器实例,也就线性增加 RAM 和 CPU 占用,这意味着你现在要用 Selenium Grid 管理一个浏览器集群,并处理崩溃恢复问题。不是说 Selenium 不能扩展,而是它的扩展本身就是一项基础设施工程,而不是改个配置就完事。

数据管道与导出

Scrapy 的item pipeline天然支持校验、去重,并导出为 JSON、CSV 或数据库。Selenium 没有这些内置能力——你得自己从零写序列化和存储逻辑。如果你很在意数据质量和后续集成(而且你应该在意),Scrapy 这点免费优势很实在。

维护成本与长期稳定性

我观察到一个很常见的模式:Scrapy spider 往往能比较体面地活很久,因为它的中间件架构本身就强迫一定的结构化。Selenium 脚本则更容易脆弱——浏览器更新会弄坏驱动,时序问题会导致测试不稳定,每次 DOM 改动都可能要重写选择器。我见过开发者在论坛里直接说,基于 Selenium 的爬虫“感觉不太适合拿去卖给客户”,说实话,这种直觉是对的,尤其是项目要稳定跑好几个月而不怎么动的时候。

反爬现实:它们在 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,体验相当不错”的说法——但多数对比文章要么不提 Playwright,要么只是一笔带过。

Playwright 由 Microsoft 开发,通过同一套 API 控制 Chromium、Firefox 和 WebKit。它的可操作性模型会等元素真正可见、稳定且可交互之后才执行动作,从而减少很多 Selenium 脚本里常见的时序不稳定问题。它还更高效地处理 browser contexts,让你能创建彼此隔离的会话,而不必每次都启动一个全新的浏览器。

什么时候 Playwright 可以完全替代 Selenium

如果你做的是爬取,而不是要兼容既有 Selenium 测试基础设施的浏览器测试,那么到 2026 年,Playwright 往往就是更好的工具。上下文创建更快、单页资源占用更低、原生支持异步、还能内置网络拦截。如果你是从零开始一个爬取项目,而且手上没有必须保留的 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 的异步事件循环,支持三大主流浏览器引擎,还能处理复杂交互,不需要再额外绑定一种脚本语言。如果你在 2026 年启动新项目,其实已经没什么理由再选 Splash 了。

可用于生产的混合架构

很多文章只会说“你可以把 Scrapy 和 Selenium 结合起来”,然后就没了。这不叫架构,这叫建议。下面才是一个真正可上生产的方案。

流程是这样的:Scrapy 调度器先把请求交给 URL 路由器,判断页面是静态还是动态。静态请求直接走 Scrapy 标准下载器。动态请求会被打标签并路由到 Playwright 中间件,由它管理一组浏览器上下文。两条路径最后都汇入同一个 item pipeline,用于校验、去重和导出——不管数据来自原始 HTML 还是渲染后的 DOM,最终都输出为同一份 JSON、CSV 或数据库结果。

如果你真要把它部署到生产环境,还有几个建议:用 Docker 容器化,让 Playwright 浏览器二进制在各环境中保持一致;按可用内存限制并发 Playwright 上下文数量(在普通 4 GB 机器上,我不会超过 8~10 个上下文);定时任务通过 cron 或 CI/CD 流水线触发,而不是让进程无限挂着跑。

这套方案给你最大控制力。但也意味着你要自己负责浏览器二进制更新、上下文生命周期 bug(页面没关会卡住爬取)、代理轮换,以及任何需要额外挂上的反爬补丁。这是实打实的工程投入,在决定上马之前,最好把这件事说得足够坦白。

对于想要结构化输出、但又不想自己扛这套基础设施的团队,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 流程或 LLM。托管服务支持 JavaScript 渲染和反爬处理,所以你不用自己维护这些基础设施。当前的 Distill vs. Extract 指南 写的是每个 Distill 页面 1 个 credit、每个 Extract 页面 20 个 credit;预算前请先看实时文档,因为产品条款可能会变化。

MCP Server:面向 Claude 或 Cursor 这类 AI agent,Thunderbit 的 MCP server 把内容提炼、结构化提取、字段建议和批量任务都封装成工具,让 agent 在任务过程中随时抓取最新网页数据,而不用跳出自己的环境。

CLI:文档中的 Thunderbit CLI 支持类似 thunderbit extract <url> --schema schema.json 这样的命令,非常适合终端工作流和定时任务。你也可以把提炼后的 Markdown 管道式传给别的工具,做快速一次性调研。

如果你想完全不写代码, 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 渲染否(需中间件)是,内置
异步/并发原生支持,性能高单实例能力有限通过 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 个 credit,所以你可以在真正写 spider 代码之前先验证 API 路线是否合适。

常见问题

Scrapy 比 Selenium 更快吗? 我的测试里,答案通常是肯定的——在静态页面上往往能快一个数量级,因为 Scrapy 的异步架构完全绕过了浏览器开销。当 Scrapy 配上 Playwright 中间件去处理 JS 密集页面时,这个差距会缩小,但在混合工作负载下,Scrapy 总体吞吐量依然常常更高,因为非 JS 页面走的是高速路径。

Scrapy 能处理 JavaScript 渲染页面吗? 它本身不能——Scrapy 只能看到初始 HTML 响应。加上 scrapy-playwright 或更老的 Scrapy-Splash 作为中间件后,就可以让特定请求通过真实浏览器渲染,同时让其他请求继续走 Scrapy 原生、更快的路径。

什么时候该用 Selenium 而不是 Scrapy? 当你需要完整的浏览器交互——多步骤登录、一路点击向导、填写表单——而且页面数量不算特别大时,Selenium 更合适。如果团队已经有基于 Selenium 的测试基础设施,想复用来做爬取,它也是合理选择。

2026 年做爬取,Playwright 比 Selenium 更好吗? 如果只谈爬取,通常是的——Playwright 往往性能更好,自带自动等待,而且每个浏览器上下文的资源占用更轻。不过如果团队已经有成熟的跨浏览器测试套件,而 Playwright 不是为替换它而设计的,那 Selenium 仍然有优势。

什么是 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 vs SeleniumPython 网页爬取浏览器自动化
目录
Thunderbit · AI 网页数据代理

一键 内提取任意页面数据

深受 250,000+ 用户信赖
提供免费方案
从网页到表格
描述你的需求——Thunderbit 的 AI 代理会帮你抓取并导出到 Excel、Google Sheets、Airtable 或 Notion。可免费开始。
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week