Splash是一个javascript渲染工具。是一款支持HTTP API的轻量级web浏览器,通过Python3的twisted和QT5实现。QT(twisted)反应器通过QT主循环充分利用webkit的并发优势,使渲染服务完全异步。SPlash的一些主要特性:
- 并行处理多个网页;
- 获取HTML结果、截屏;
- 通过关闭图片或使用Adblock Plus规则实现更快渲染;
- 在页面上下文中执行自定义JavaScript;
- 书写Lua浏览脚本;
- 在Splash-Jupyter笔记本中开发Splash Lua脚本;
- 获得HAR格式的详细渲染信息。
Splash HTTP API
Splash通过HTTP API控制。对于所有的Splash端点,以下参数通过GET参数方式或在编码成JSON并使用Content-Type: application/json
头部信息POST的方式发送。
大多数Splash多功能端点提供exexcute和run的Splash特性;允许执行任意Lua渲染脚本。
其余端点用在特定场合更为容易-例如,render.png返回一个可以被img src使用的PNG格式截图,不做其他处理,render.json在不进行页面交互场合使用很方便。
render.html
返回javascript渲染后的HTML页面。
参数:
url:字符串,必需
要渲染的url
baseurl:字符串,可选
要渲染页面的基准url。
timeout:浮点数,可选
渲染超时参数(单位为秒,默认为30)
默认情况下,最大允许超时为90s。使用--max-timeout命令行选项运行Splash可以覆盖该值。例如,以下命令用于配置最大超时时间为5分钟:
$ docker run -it -p 8050:8050 scrapinghub/splash --max-timeout 300
resource_timeout:浮点数,可选
个人网络请求延时参数。
wait:浮点数,可选
页面加载后等待更新时间(单位为秒,默认值为0);如果希望页面包含setInterval/setTimeout的javascript方法可以被执行,需要增大该参数,因为当该参数为0时,setInterval/setTimeout的回调函数不能被执行;当进行页面完全渲染时,PNG和JPEG的渲染也需要wait值非零。
wait值必需小于timeout值。
proxy:字符串,可选
代理URL的格式为:
[protocol://][user:password@]proxyhost[:port])
其中,protocol为http或socks5。如果端口未指定,则使用默认的1080端口。
js:字符串,可选
javascript文件名字
js_source:字符串,可选
在页面上下文中执行的javascript代码。
filters:字符串,可选
采用逗号分割的请求过滤器名字列表
allowed_domains:字符串,可选
允许域名逗号分隔列表。如果该列表存在,Splash将不加载任何不在该列表中域或子域下的内容。
allowed_content_types:字符串,可选
允许Content-type的逗号分割列表。如果该值存在,Splash将丢弃响应中Content-type不在列表中请求。
forbidden_content_types:字符串,可选
禁止Content-type的逗号分隔列表。功能与上一参数相反。
viewport:字符串,可选
浏览器渲染页面可视区域宽高,单位为像素,格式为“宽X高”,例如800x600。默认值为1024x768。
viewport参数对于PNG和JPEG渲染更为重要;所有渲染端点均支持该参数,因为javascript代码执行依赖可视区域大小。
考虑到向后兼容的问题,该参数也接受'full'作为参数值。
images:整型,可选
是否下载图片。值为1(下载图片)或0(不下载图片),默认值为1。
注意,即使该参数值为0,缓存图片也可能显示。
headers:JSON数组或对象,可选
第一个传出请求的HTTP头。
该选项只支持application/json
的POST请求。值可以是形如(header_name, header_value)
的JSON数组对或者头部名字为键,头部值为值的JSON对象。
与其他头部不同,"User-Agent"头为特例:用于所有传出请求。
body:字符串,可选
如果方法为POST,被发送的HTTP POST请求主体。POST方法的默认content-type头是application/x-www-form-urlencoded
。
http_method:字符串,可选
传出Splash请求的HTTP方法。默认为GET,Splash也支持POST。
save-args:JSON数组或一个逗号分隔字符串,可选
存入缓存的参数名列表。Splash将每个参数存入内部缓存并返回包含每个参数SHA1哈希列表(一个使用分号分隔的形如name=hash键值对列表)的 X-Splash-Saved-Arguments
HTTP头。
客户端可以使用load_args参数用这些hashes代替参数值传递,这一特点对于参数值很大且不经常改变的情形非常有用(js_source或lua_source通常是很好的候选方案)
load_args:JSON对象或字符串,可选
从缓存中加载的参数值。load_args必须是{"name": "<SHA1 hash>", ...}
JSON对象或者X-Splash-Saved-Arguments
头原码(一个使用分号分隔的形如name=hash键值对列表)
对于load_args中的每个参数,Splash使用一个给定的SHA1哈希值作为键,从内部缓存中获取值。如果值在缓存中,Splash将其作为参数值使用然后正常处理请求。如果不能找到参数,Splash返回HTTP 498状态码。这种情况下,客户端会重复请求,但是使用save_args并发送所有参数值。
load_args和save_args允许不发送每个请求的大参数来保存网络流量(js_source和lua_source也是常用的候选方案)
Splash使用LRU缓存存储值;入口数量有限,Splash每次重启,缓存都会清空。换句话说,存储是非持久的;客户端必需准备重发这些参数。
html5_media:整型,可选
HTML5媒体是否可用(例如<video>标签回放)。可能值为1(可用)和0(不可用),默认为0。
HTML5 媒体默认不可用,是由于可能导致不稳定。未来Splash会默认它可用,所以想设置为不可用时,需要显式指定html5_media=0。
实例:
Curl实例:
curl 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5'
结果总是使用utf-8编码,通常使用render.html返回的HTML数据使用utf-8解码,即使结果中有以下标签:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
render.png
返回javascript渲染页面的PNG格式图片。
参数:
与render.html一样参数外加以下参数:
width:整型,可选
保持宽高比不变,调整渲染图像宽度至给定(单位:像素)。
height:整型,可选
裁剪渲染图像至给定高度值。常常用于使用宽度参数连接以生成固定大小的缩略图。
render_all:整型,可选
# render with default quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/'
# render with low quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/&quality=30'
可能值为1和0.当值为1时,在渲染前,扩展可视区域至包含整个页面(可能会非常长)。默认值为0.
参数值为1时,要求wait参数非零。这是一个很不幸的约束,但是貌似是当值为1时,令渲染能够实现的唯一办法。
scale_methos:字符串,可选
可能值为raster(默认)和vector。如果该参数值为raster,通过width参数进行的重新缩放操作是像素级别。如果参数值为vector,渲染过程中的缩放操作为元素级。
实例:
Curl实例:
# render with timeout
curl 'http://localhost:8050/render.png?url=http://domain.com/page-with-javascript.html&timeout=10'
# 320x240 thumbnail
curl 'http://localhost:8050/render.png?url=http://domain.com/page-with-javascript.html&width=320&height=240'
render.jpeg
返回javascript渲染页面的JPEG格式图像
参数:
和render.png相同,外加以下参数:
quality:整型,可选
JPEG质量参数,范围为0到100,默认为75.
注意,95以上的质量值应当避免;质量值为100是JPEG的部分压缩算法将被禁用,导致文件尺寸大,图片质量提高很少。
Curl实例:
# render with default quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/'
# render with low quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/&quality=30'