在Splash HTTP渲染服务中动态加载外部JavaScript资源



我当前正在使用Splash HTTP API作为无头浏览器来渲染请求。我正在使用端点 render.html 带有 js_source ,该> 允许在页面上下文中评估自定义JavaScript代码,页面完成加载后,以及页面启动之前。

我需要向外部资源提出其他请求,例如加载页面后加载 jQuery

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://code.jquery.com/jquery-1.5.1.min.js";
document.getElementsByTagName('head')[0].appendChild(script);

问题是,通过这样做,对象在页面上下文中不可用。该脚本似乎确实添加在最终渲染的HTML源的头部元素中:

<script type="text/javascript" src="https://code.jquery.com/jquery-1.5.1.min.js"></script>

我尝试使用下面描述的两种方法设置回调,以确保在访问任何 jQuery 的方法之前加载脚本。但是在两种情况下都无法调用回调。

script.onreadystatechange = callback;
script.onload = callback;

Chrome 的控制台中运行上述脚本,请执行我需要的工作,并立即使jQuery资源在页面上下文中可用。

可能您可以使其与js_source一起使用,但是作为功能js_source非常有限;/执行端点和自定义LUA脚本更具用途,并且通常更易于使用:

function main(splash)
    splash:autoload("https://code.jquery.com/jquery-1.5.1.min.js")
    assert(splash:go(splash.args.url))
    assert(splash:wait(1.0))
    splash:runjs(splash.args.js_source)
    return splash:html()
end

^^此脚本模拟了Render.html端点,但预付了jQuery;它支持" URL"one_answers" JS_SOURCE"参数和硬码'等待'至1.0。

从我所看到的, autoLoad 命令来自/execute endpoint,通过 http get 在Python,https://github.com/scrapinghub/splash/splash/splash/blob/master/splash/splash/qtrender_lua.py#l898,然后以类似的方式随意评估JS,与 JS_SOURCE 相似。https://github.com/scrapinghub/splash/blob/master/splash/splash/browser_tab.py#l655

因此,没有办法从浏览器上下文中添加/下载外部资源,就像您通常使用 html 脚本资源一样:(

我终于设法解决了问题,看起来飞溅不会在更改时重新评估dom,对我有用的事情是制作同步 xmlhttprequest 到资源并评估响应:

src = "https://code.jquery.com/jquery-1.5.1.min.js";
var request = new XMLHttpRequest();
request.open('GET', src, false);
request.send(null);
if (request.status === 200) {
    eval(request.responseText);
};

最新更新