Динамическая загрузка внешних ресурсов javascript в службе рендеринга Splash HTTP

В настоящее время я использую API-интерфейс Splash HTTP в качестве безгласного браузера для рендеринга запроса. Я использую endpoint render.html с var script = document . createElement ( 'script' ); скрипт . type = 'text / javascript' ; скрипт . src = "https://code.jquery.com/jquery-1.5.1.min.js" ; документ . getElementsByTagName ( 'head' ) [ 0 ]. appendChild ( скрипт ); который позволяет оценивать пользовательский Javascript-код в контексте страницы после завершения загрузки страницы и до отображения страницы.

Я нуждаюсь в дополнительном запросе внешних ресурсов, таких как загрузка jQuery после загрузки страницы.

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

Проблема в том, что, делая это, объекты становятся недоступными в контексте страницы. Кажется, что скрипт добавлен в элемент HEAD конечного отображаемого HTML-источника:

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

Я попытался установить обратный вызов, используя оба метода, описанные ниже, чтобы убедиться, что сценарий загружен перед доступом к любому из методов jQuery . Но обратный вызов не может быть вызван в обоих сценариях.

js_source

Выполнение вышеупомянутых скриптов в консоли Chrome делает то, что мне нужно, и сразу же делает ресурс jQuery доступным в контексте страницы.

javascript,jquery,html,scrapy-splash,

0

Ответов: 3


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», а hardcodes «wait» - 1.0.


0

Из того, что я вижу, команда autoload из конечной точки / execute загружает ресурсы асинхронно через HTTP GET в Python, https://github.com/scrapinghub/splash/blob/master/splash/qtrender_lua.py#L898 , затем случайно оценивает js аналогично js_source . https://github.com/scrapinghub/splash/blob/master/splash/browser_tab.py#L655

Таким образом, нет возможности добавлять / загружать внешние ресурсы из контекста браузера, как это обычно бывает с ресурсом HTML- скрипта :(


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);
};
JavaScript, JQuery, HTML, SCRAPY-всплеск,
Похожие вопросы