Splash 和 Jupyter

Splash为Lua提供了一个自定义的 Jupyter 内核(以前被称为 IPython )。 与Jupyter 编辑器 前端一起,它为Splash JavaScript构建了一个基于Web的开发环境, 具有语法高亮,智能代码自动补全,上下文感知帮助,内联图像支持,以及启用Web检查器来查看实时的WebKit浏览器窗口。 它可以通过Jupyter 编辑器来进行控制

安装

在docker中您可以执行下列命名来安装 Splash-Jupyter

$ docker pull scrapinghub/splash-jupyter

然后启动容器

$ docker run -p 8888:8888 -it scrapinghub/splash-jupyter

注解

请注意,如果不加 -it 标志,您将不能通过 CTRL+C来停止容器

上面的命令应该会打印出类似下面的内容

Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
    http://localhost:8888/?token=e2435ae336d22b23d5e868d03ce728bc33e73b6159e391ba

想要查看Jupyter,请在浏览器中打开上面给出的地址,它应该会显示Jupyter 编辑器的概述页面

注解

在较旧的Docker中(例如在 OS X 系统中使用 boot2docker 的版本),您可能需要将 localhost替换成 docker能够使用的IP,比如在boot2docker中使用 boot2docker ip 得到的IP地址, 或者在进入 docker-machine 时在屏幕上出现的 docker-machine ip <your machine> 字样中的IP [3]

点击 “New” 这个按钮,然后在下拉框中选择Splash,这样Splash 编译器 应该就会被打开 Splash 编辑器看起来就像是IPython 编辑器或者是以其他基于Jupyter 的编辑环境,它允许在内部运行和开发Splash的lua脚本 。例如您可以在里面输入 splash:go("you-favorite-website") , 然后运行,接着您在另一个单元格中输入 splash:png()。 也像之前那样允许他,这时您应该可以得到一个内联显示的网站截图

保持Jupyter环境

默认情况下 Jupyter编辑环境存储在Docker容器中,一旦重启镜像,环境就会被删除。为了保存当前编辑器环境,您可以挂载一个 本地的文件到 /notebooks 中,例如让我们使用当前目录来保存编辑器环境

$ docker run -v `/bin/pwd`/notebooks:/notebooks -p 8888:8888 -it splash-jupyter

实时的WebKit窗口

当Splash-Jupyter在Docker中执行的时候您可以使用Web检查器来查看实时的WebKit窗口。您需要在启动 Jupyter时向Docker传递 额外的参数来向Docker容器共享主机系统的X服务。您需要在启动的时候使用 --disable-xvfb 标志

$ docker run -e DISPLAY=unix$DISPLAY \
             -v /tmp/.X11-unix:/tmp/.X11-unix \
             -v $XAUTHORITY:$XAUTHORITY \
             -e XAUTHORITY=$XAUTHORITY \
             -p 8888:8888 \
             -it scrapinghub/splash-jupyter --disable-xvfb

从编辑器到HTTP API

当您能够在Splash 编辑器中进行程序开发之后,您可能会希望将其转化为合适的可以提交到HTTP API的脚本代码 (参见 executerun )

要达到这样的效果,您可以复制-粘贴所有对应的代码(或者直接下载,通过以此点击“File -> Download as -> .lua”)。 针对 run 这个端点,使用 return 语句来返回结果

-- Script code goes here,
-- including all helper functions.
return {...}  -- return the result

针对 execute 端点,需要添加 return 语句,并将代码放入到 main 函数中

function main(splash)
    -- Script code goes here,
    -- including all helper functions.
    return {...}  -- return the result
end

为了使代码更加通用,您可以将其中硬编码的常量通过 splash.args <./scripting-ref.html#splash-args> 来进行替换。 另外如果您需要处理多个不同的页面,您可以考虑使用不同的参数提交多个请求,而不是在脚本中运行循环。这是一种简单的优化操作.

这里也有一些陷阱

  • 当您在编译器单元中运行一段代码,紧接着运行下一个单元中的代码时,在不同单元中代码的执行是有延迟的,这个延迟类似于在每个单元之间调用了 splash:wait[4]
  • 在编辑器中是不考虑沙盒的设置的,因为在Jupyter 编辑器中是没有沙盒的,一般情况下这不是什么问题,但是请注意,有些函数在沙盒下可能并不被支持
[3]在旧版的Docker中,启动时会出现 “docker is configured to use the default machine with IP xxx.xxx.xxx.xxx” 的字样,我在使用DockerToolbox的时候一般这个IP都是 192.168.99.100
[4]这也就是说我们不能直接将所有代码简单的复制粘贴,还需要做进一步修改,在该等待的时候加上 splash:wait函数