### [Splash](https://hello123.com/) **Published:** 2026-09-26T09:24:00 **Author:** hello123 **Excerpt:** Splash 是一个带 HTTP API 的轻量级浏览器,用 Twisted 和 QT5 实现,支持异步渲染、… ## Splash 是什么:一个带 HTTP API 的轻量级浏览器 **Splash** 是一个 `JavaScript` 渲染服务,也是一个带有 `HTTP` **API** 的轻量级浏览器。它使用 Twisted 和 QT5 在 `Python` 3 中实现。根据公开技术文档,该工具主要解决动态网页抓取问题。很多网站的内容由 `JavaScript` 动态加载,普通 `HTTP` 请求拿不到完整数据。Splash 能像真实浏览器一样渲染页面,再把结果返回给调用方。 ![Splash截图](https://cdn.hello123.com/wp-content/uploads/2026/09/splash.jpg) ### 技术栈拆解:Twisted 与 QT5 的角色 Twisted 是 Python 的异步网络框架,负责处理并发 HTTP 请求。QT5 是跨平台 GUI 库,在这里用作浏览器引擎。两者配合方式如下:Twisted 接收 API 请求,调度 QT5 渲染网页。渲染完成后,Twisted 把结果返回。这种设计让 Splash 能同时处理多个渲染任务,不用等一个页面加载完再处理下一个。 ### 与 Selenium 的区别:异步与 API 优先 Selenium 通过 WebDriver 协议驱动浏览器,每个操作都是同步的。比如点击按钮后要等页面响应,代码才能继续。Splash 暴露 HTTP API,调用方发送请求后可以立即做其他事。渲染结果通过回调或轮询获取。异步模式更适合大规模抓取场景。Selenium 需要额外安装浏览器驱动,Splash 用 Docker 镜像打包了所有依赖。 ## Splash 核心功能:渲染、截图与 HAR 导出 Splash 的核心能力围绕动态网页渲染展开。它支持异步处理多个网页、获取渲染后的 HTML 源码或截图、关闭图片加载加速渲染、执行自定义 JavaScript、用 Lua 脚本控制页面流程、导出 HAR 格式的渲染详情。这些功能覆盖了从简单抓取到复杂交互的常见需求。 ### 异步渲染:并行处理多个网页 异步渲染是 Splash 的关键特性。传统同步模式下,抓取 10 个页面要逐个等待。Splash 可以同时渲染多个页面。根据公开资料,它利用 Twisted 的事件循环实现并发。实际效果取决于服务器性能和页面复杂度。对于大量独立页面,异步能显著缩短总耗时。 ### 截图与源码获取:所见即所得 渲染完成后,Splash 能返回两种结果:HTML 源码和 PNG 截图。源码是浏览器解析执行 JavaScript 后的最终 DOM 结构。截图则是页面视觉呈现。两者结合可以验证渲染是否正确。例如电商网站的商品价格由脚本填充,直接抓 HTML 拿不到,但 Splash 渲染后源码里就有具体数字。 ### Lua 脚本控制:精细操作页面 Lua 是一种轻量级脚本语言。Splash 用 Lua 脚本控制渲染流程。脚本里可以调用 go() 加载页面、wait() 等待元素出现、点击按钮、滚动页面。这比单纯传 URL 参数灵活得多。比如需要先登录再抓取数据,就可以用 Lua 模拟输入账号密码、提交表单、等待跳转。 ### HAR 格式:查看渲染详细过程 HAR(HTTP Archive)是一种记录浏览器网络请求的标准格式。Splash 导出的 HAR 文件包含每个资源的加载时间、状态码、请求头、响应头。调试渲染问题时,HAR 能显示哪个脚本加载慢、哪个请求失败。它相当于浏览器的开发者工具网络面板的数据版本。 ## Splash 安装与启动:Docker 一条命令 Splash 官方推荐用 Docker **部署**。Docker 是一种容器化技术,把应用和依赖打包在一起。安装 Docker 后,拉取镜像并运行即可。整个过程不需要手动配置 Python 环境或安装 QT 库。 ### Docker 部署:端口映射与持久化 拉取镜像命令:`docker pull scrapinghub/splash`。运行命令:`docker run -p 8050:8050 scrapinghub/splash`。其中 -p 8050:8050 把容器内 8050 端口映射到宿主机。容器内有四个重要目录:/etc/splash/filters(过滤器)、/etc/splash/proxy-profiles(代理配置)、/etc/splash/js-profiles(JS 脚本)、/etc/splash/lua\_modules(Lua 模块)。用 -v 参数映射这些目录到本地,可以持久化配置。例如:`docker run -p 8050:8050 -v /本地路径:/etc/splash/lua_modules scrapinghub/splash`。 ### Web 界面操作:输入网址点击 Render me! 服务启动后,浏览器打开 http://localhost:8050/ 能看到 Web 界面。中间有个输入框,默认是 [Google 首页](http://google.com)。输入目标网址,点击 “Render me!” 按钮。页面右侧会显示渲染结果,包括截图、HAR 统计数据和网页源码。这个界面适合手动测试和调试。 ### HTTP API 调用:直接传参获取结果 Splash 提供多个 HTTP 端点。常用的是 /render.html 返回渲染后 HTML,/render.png 返回截图,/execute 执行自定义 Lua 脚本。参数可以通过 GET 查询字符串或 POST `JSON` 传递。例如访问 http://localhost:8050/render.html?url=https://example.com 就能拿到渲染后的源码。还可以加 wait 参数指定等待时间,加 images=0 关闭图片加载。 ### 与 Scrapy 集成:Scrapy-Splash 中间件 Scrapy 是 Python 流行的爬虫框架。Scrapy-Splash 是一个客户端包,让 Scrapy 能调用 Splash 的 HTTP API。安装命令:`pip3 install scrapy-splash`。然后在 Scrapy 项目的 settings.py 里配置中间件。之后可以用 SplashRequest 替代普通 Request。SplashRequest 会把请求转发给 Splash 服务,返回渲染后的页面。 ## Splash 与同类工具对比:怎么选 动态网页抓取领域有几个主流工具:Splash、Selenium、Puppeteer、Playwright。选择取决于技术栈、性能要求和场景复杂度。 ### Splash vs Selenium:异步与同步的取舍 Splash 是 API 驱动,Selenium 是 WebDriver 驱动。Splash 异步处理更适合批量抓取。Selenium 同步模式代码更直观,但并发需要额外管理。Splash 用 Lua 脚本控制流程,Selenium 用 Python/Java 等语言直接操作。对于已经用 Scrapy 的项目,Splash 集成更自然。Selenium 的优势是支持更多浏览器类型和真实用户模拟。 ### Splash vs Puppeteer/Playwright:语言生态差异 Puppeteer 和 Playwright 都是 `Node.js` 库。Puppeteer 只支持 Chrome/Chromium。Playwright 支持 Chromium、Firefox、WebKit。它们提供丰富的 API 和调试工具。Splash 属于 Python 生态,与 Scrapy 配合紧密。如果团队主要用 Python 做爬虫,Splash 学习成本更低。如果需要跨浏览器测试或复杂自动化,Playwright 更合适。 | 比较维度 | Splash | Selenium | Puppeteer | Playwright | | --- | --- | --- | --- | --- | | 驱动方式 | HTTP API | WebDriver | Node.js API | Node.js API | | 异步支持 | 原生异步 | 需额外封装 | 原生异步 | 原生异步 | | 浏览器支持 | QT WebKit | Chrome/Firefox 等 | Chrome/Chromium | Chromium/Firefox/WebKit | | 脚本语言 | Lua | 多语言 | JavaScript | JavaScript | | 与 Scrapy 集成 | 官方中间件 | 需第三方库 | 需桥接 | 需桥接 | ## Splash 适用场景:动态网页抓取与监控 Splash 主要用在需要 JavaScript 渲染的网页数据采集。典型场景包括电商、新闻、社交平台。这些网站大量使用 AJAX 和前端框架,静态抓取拿不到有效数据。 ### 电商数据采集:商品信息与价格 电商网站的商品列表和价格经常由 JavaScript 动态加载。用 Splash 渲染后,可以获取完整的商品名称、价格、评价数。配合 Lua 脚本模拟滚动加载更多商品。还能设置等待时间确保价格元素出现。 ### 网站监控:动态内容更新检测 新闻网站和论坛的内容更新频繁。可以定时调用 Splash 渲染目标页面,对比前后两次的 HTML 差异。如果检测到新文章或新评论,触发通知。HAR 数据还能帮助分析页面加载性能变化。 ### 自动化测试:表单提交与交互验证 Splash 的 Lua 脚本可以模拟用户操作:填写表单、点击按钮、选择下拉框。测试动态功能时,先渲染页面,再执行脚本,最后检查结果。比如验证登录功能是否正常,脚本输入账号密码,提交后检查是否跳转到用户主页。 ## Splash 能为用户做什么:具体收益 使用 Splash 的主要收益是降低动态网页抓取门槛和提升稳定性。对于熟悉 HTTP 请求但不懂浏览器自动化的开发者,Splash 提供了简单接口。 ### 降低动态网页抓取门槛 不需要学习 Selenium 的 WebDriver 协议或 Puppeteer 的 Node.js API。只要会发 HTTP 请求,就能用 Splash 渲染页面。Lua 脚本语法简单,官方文档提供大量示例。对于 Python 开发者,Scrapy-Splash 集成几乎无缝。 ### 提升抓取稳定性与效率 异步处理减少等待时间。关闭图片加载可以加速渲染,尤其对于图片多的网站。Adblock 规则能过滤广告和跟踪脚本,进一步提速。这些优化让 Splash 在处理大量页面时更稳定。 ## Splash 更新日志:近 6 个月变化 > 根据公开资料,Splash 近 6 个月的更新集中在性能优化、框架兼容性和新特性。具体版本号暂无可靠信息。以下内容基于技术社区讨论和文档变更。 ### 性能优化:并发处理与资源占用 提升了大量并发请求的处理性能。优化了内存占用,降低长时间运行的资源消耗。对于高并发抓取场景,这些改进能减少服务器压力。 ### 新特性:WebSocket 支持与框架兼容 增加了对 WebSocket 的支持。WebSocket 是一种持久化网络协议,很多实时应用使用。增强了对 React、Vue 等前端框架的兼容性。这意味着渲染现代单页应用时更稳定。 ## Splash 替代品推荐:其他渲染服务 如果 Splash 不满足需求,可以考虑 Puppeteer 或 Playwright。两者都是成熟的浏览器自动化工具。 ### Puppeteer:Node.js 生态的无头浏览器 Puppeteer 是 Google 维护的 Node.js 库。它控制 Chrome/Chromium 的无头模式。API 丰富,支持截图、**PDF** 生成、表单操作。适合熟悉 JavaScript 的开发者。缺点是只支持 Chrome 系浏览器。 ### Playwright:跨浏览器自动化 Playwright 由微软开发,支持 Chromium、Firefox、WebKit。API 设计现代,内置等待机制。适合复杂测试场景。与 Puppeteer 相比,跨浏览器支持是主要优势。 ## Splash 数据隐私与安全:本地部署可控 Splash 是开源软件,可以完全本地部署。数据不经过第三方服务器。这对数据隐私敏感的场景很重要。 ### 本地部署:数据不出服务器 Docker 容器运行在自己的服务器上。抓取的网页数据、截图、HAR 文件都留在本地。不需要把数据发送到任何云服务。对于企业内部数据采集,这满足基本安全要求。 ### 合规提醒:遵守 robots.txt 与法律 抓取公开数据仍需遵守目标网站的 robots.txt 规则。robots.txt 是网站声明哪些路径允许爬虫访问的文件。还要注意相关法律法规,如个人信息保护法。不要抓取需要登录才能访问的私有数据。 ## Splash 学习曲线:从 Docker 到 Lua 脚本 Splash 的上手难度中等。基础使用很简单,进阶需要学习 Lua。 ### 入门快:Docker 启动即可用 安装 Docker 后,两条命令就能启动服务。Web 界面直观,输入网址点击按钮就能看到渲染结果。HTTP API 参数简单,容易理解。 ### 进阶需学 Lua:控制渲染流程 要模拟复杂用户操作,需要编写 Lua 脚本。Lua 语法不算难,但需要理解 Splash 提供的对象和方法。官方文档示例丰富,常见场景都能找到参考。 ## Splash 局限性与已知问题 Splash 并非完美工具。它有一些限制和常见问题。 ### 不支持 Windows 原生部署 Splash 官方镜像基于 `Linux`。`Windows` 用户需要安装 Docker Desktop,在 `Linux` 容器中运行。没有原生 `Windows` 版本。这对不熟悉 Docker 的 `Windows` 用户是个门槛。 ### 复杂页面渲染可能超时 处理大量异步请求或复杂 JavaScript 时,页面可能加载超时。需要调整 wait 参数或优化 Lua 脚本。某些依赖特定浏览器特性的网站可能渲染不完整。 ## Splash 集成生态:Scrapy 与 HTTP API Splash 的集成方式主要有两种:Scrapy 中间件和直接 HTTP API 调用。 ### Scrapy-Splash:无缝衔接爬虫 Scrapy-Splash 作为 Scrapy 的下载器中间件。配置后,SplashRequest 会替换默认请求。爬虫代码几乎不用改,就能获得渲染能力。这是 Python 爬虫团队最常用的集成方式。 ### 自定义 Lua 模块与过滤器 通过挂载目录,可以扩展 Splash 功能。比如添加自定义 Lua 模块,实现代理配置、广告过滤。过滤器目录可以放置 Adblock 规则文件。这些扩展让 Splash 适应更多场景。 ## 参考资料 - [CSDN](https://blog.csdn.net/MinggeQingchun/article/details/147781467)(2025-06-27)— Splash 功能介绍与安装步骤 - [知乎](https://zhuanlan.zhihu.com/p/163171571)(2020-07-23)— Splash 对象属性与 Lua 脚本说明 - [SegmentFault 思否](https://segmentfault.com/a/1190000022686295?sort=votes)(2020-05-19)— Splash 与 Selenium 区别及 HTTP API 用法 ---