爬虫工具Splash

一、背景介绍

Splash 是一个 JavaScript 渲染服务,本质上是一个带有 HTTP API 的轻量级浏览器。它支持使用 Lua 脚本语言编写代码对页面进行渲染,同时 Python 可以通过 HTTP API 调用 Splash 内部的功能,甚至可以与 Lua 代码进行交互。因此,Splash 可以非常容易地与 Python 集成,实现动态页面的抓取或自动化测试。

Splash 的优势:

  • 内置浏览器基于 Twisted 框架,支持异步处理多个网页的渲染,性能较好。
  • 可以获取渲染后的页面源代码或截图,方便进行数据提取或页面验证。
  • 提供多种接口,如 render.htmlexecute 等,使用灵活。

官方文档:https://splash.readthedocs.io/en/stable/

二、为什么使用 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 的高级特性,如请求过滤、代理设置、自定义请求头等。

posted @ 2026-09-08 18:28  BeginnerY  阅读(5)  评论(0)    收藏  举报