爬虫工具Splash
一、背景介绍
Splash 是一个 JavaScript 渲染服务,本质上是一个带有 HTTP API 的轻量级浏览器。它支持使用 Lua 脚本语言编写代码对页面进行渲染,同时 Python 可以通过 HTTP API 调用 Splash 内部的功能,甚至可以与 Lua 代码进行交互。因此,Splash 可以非常容易地与 Python 集成,实现动态页面的抓取或自动化测试。
Splash 的优势:
- 内置浏览器基于 Twisted 框架,支持异步处理多个网页的渲染,性能较好。
- 可以获取渲染后的页面源代码或截图,方便进行数据提取或页面验证。
- 提供多种接口,如
render.html、execute等,使用灵活。
二、为什么使用 Splash
很多现代网站通过 JavaScript 动态渲染页面内容,直接使用传统的 HTTP 请求无法获取到完整的页面数据。Splash 可以模拟浏览器行为,执行页面中的 JavaScript,等待页面渲染完成后再返回结果,因此非常适合抓取动态渲染的页面或进行 Web 自动化测试。
三、Splash 基础使用
Splash 通过 Lua 脚本控制浏览器行为。一个基本的 Lua 脚本结构如下:
function main(splash, args)
-- 在这里编写操作逻辑
return splash:html()
end
其中 main() 函数的第一个参数 splash 是最核心的对象,它类似于 Selenium 中的 WebDriver 对象,提供了丰富的属性和方法来控制浏览器。
3.1 Splash 对象属性
① plugins_enabled
控制浏览器插件(如 Flash 插件)是否开启。默认值为 false,表示不开启。
splash.plugins_enabled = true -- 开启插件
splash.plugins_enabled = false -- 关闭插件
② scroll_position
控制页面上下或左右滚动,常用于触发懒加载等内容。
splash.scroll_position = {x=100, y=200} -- 滚动到指定坐标
3.2 Splash 对象方法
① go 方法
用于请求某个链接,可以模拟 GET 和 POST 请求,同时支持传入请求头、表单等数据。
reason = splash:go{url, baseurl=nil, headers=nil, http_method="GET", body=nil, formdata=nil}
参数说明:
| 参数 | 含义 |
|---|---|
| url | 请求的 URL |
| baseurl | 可选参数,默认为空,表示资源加载的相对路径 |
| headers | 可选参数,默认为空,表示请求头 |
| http_method | 可选参数,默认为 GET,也支持 POST |
| body | 可选参数,默认为空,发送 POST 请求时的表单数据,Content-Type 为 application/json |
| formdata | 可选参数,默认为空,POST 请求时的表单数据,Content-Type 为 application/x-www-form-urlencoded |
示例:发送一个 POST 请求
splash:go{"http://www.sxt.cn", http_method="POST", body="name=12345678"}
② evaljs() 与 runjs()
evaljs():执行 JavaScript 代码并返回最后一条语句的返回结果。runjs():执行 JavaScript 代码,更偏向于执行某些动作或声明某些方法,不返回结果。
这两个方法可以用于执行自定义 JavaScript,或调用页面中已有的 JavaScript 函数。
function main(splash, args)
splash:go("https://www.baidu.com")
splash:runjs("foo = function() { return 'sxt' }")
local result = splash:evaljs("foo()")
return result
end
③ html()
获取当前页面的 HTML 源代码。
function main(splash, args)
splash:go("https://www.bjsxt.com")
return splash:html()
end
④ get_cookies()
获取当前页面的 Cookies,可用于登录状态保持或数据采集。
function main(splash, args)
splash:go("https://www.bjsxt.com")
return splash:get_cookies()
end
⑤ mouse_click()
模拟鼠标点击操作,常用于触发按钮点击或页面交互。
function main(splash)
splash:go("https://www.baidu.com/")
input = splash:select("#kw")
input:send_text('Splash')
submit = splash:select('#su')
submit:mouse_click()
splash:wait(3) -- 等待 3 秒,确保页面加载完成
return splash:png()
end
四、Splash 与 Python 结合
Splash 通过 HTTP API 提供服务,Python 可以使用 requests 等库方便地调用。
4.1 使用 render.html 接口
render.html 接口用于获取 JavaScript 渲染后的页面 HTML 代码。接口地址为 Splash 服务地址加 /render.html,例如 http://<splash-host>:8050/render.html。
import requests
url = 'http://192.168.99.100:8050/render.html?url=https://www.bjsxt.com&wait=3'
response = requests.get(url)
print(response.text)
参数说明:
url:需要渲染的页面地址。wait:等待页面渲染的时间(秒),可根据页面复杂度调整。
4.2 使用 execute 接口执行 Lua 脚本
通过 execute 接口可以直接执行自定义的 Lua 脚本,实现更复杂的控制逻辑。
import requests
from urllib.parse import quote
lua = '''
function main(splash)
return 'hello'
end
'''
url = 'http://192.168.99.100:8050/execute?lua_source=' + quote(lua)
response = requests.get(url)
print(response.text)
说明:
lua_source参数需要经过 URL 编码(使用urllib.parse.quote)。- 返回结果可以是字符串、JSON、图片(截图)等,取决于 Lua 脚本的返回内容。
五、安装与启动(简要)
Splash 官方推荐使用 Docker 运行,简单方便:
docker run -p 8050:8050 scrapinghub/splash
启动后,Splash 服务监听 8050 端口,即可通过 HTTP API 访问。
六、总结与注意事项
- Splash 是一个强大的动态页面渲染工具,适合与 Python 爬虫或自动化测试结合使用。
- 通过 Lua 脚本可以精细控制浏览器行为,如点击、滚动、执行 JS、获取 Cookies 等。
- 使用
render.html适合简单页面抓取,使用execute可以执行复杂逻辑。 - 注意 Splash 服务需要单独部署,并确保网络可达。
- 对于大量页面渲染任务,可以部署多个 Splash 实例并通过负载均衡提高性能。
希望本文能帮助你快速上手 Splash,实现动态页面的自动化测试与数据抓取。后续可以进一步探索 Splash 的高级特性,如请求过滤、代理设置、自定义请求头等。

浙公网安备 33010602011771号