0

我目前正在使用Splash HTTP API作为无头浏览器来呈现请求。我将端点render.htmljs_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 源的 HEAD 元素中:

<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 资源在页面上下文中可用。

4

3 回答 3

0

我终于设法解决了这个问题,看起来 Splash 没有在更改后重新评估 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);
};
于 2016-12-07T14:26:58.913 回答
0

也许你可以让它与 一起工作js_source,但作为一个功能js_source是非常有限的;/execute端点和自定义 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”和“js_source”参数并将“等待”硬编码为 1.0。

于 2016-12-06T20:07:46.873 回答
0

据我所见,来自/execute端点的自动加载命令通过Python 中的HTTP GET异步下载资源https://github.com/scrapinghub/splash/blob/master/splash/qtrender_lua.py#L898,然后随便以与js_source类似的方式评估 js 。https://github.com/scrapinghub/splash/blob/master/splash/browser_tab.py#L655

因此,无法从浏览器上下文中添加/下载外部资源,就像您通常使用HTML脚本资源所做的那样:(

于 2016-12-07T09:53:00.897 回答