Как получить html исходный код страницы, после того как все это было вызвано скриптами? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь разобрать сайт.Сайт (я полагаю) использует скрипты и базы данных для загрузки данных (динамически?).И это моя проблема ... Я пытаюсь получить данные через C # (к сожалению, сейчас у меня нет доступа к коду) или JS.И похоже, что либо C #, либо JS, получают только шаблон сайта, но не ждут, пока все сценарии будут выполнены.Так что это мой вопрос, есть ли способ получить ВСЕ источники HTML?Может быть, вызвать сценарии как-нибудь.Или сделать запрос, подождать 10 секунд, а затем записать исходные HTML-данные в переменную?

Вот мой код JS.

function request(link)
{

    var xhr = new XMLHttpRequest();

    xhr.open('GET', link, true);

    xhr.onreadystatechange = function() . 
        {console.log(xhr.readyState);};

    xhr.send();

    let data  = xhr.responseText;

    var tempDiv = document.createElement('div');
    tempDiv.innerHTML = data.replace(/<script(.|\s)*?\/script>/g, 
        '');

    return tempDiv;
}

function loadFile(url, timeout, callback) 
{
    var args = Array.prototype.slice.call(arguments, 3);
    var xhr = new XMLHttpRequest();
    xhr.ontimeout = function () {
        console.error("The request for " + url + " timed out.");
        };
    xhr.onload = function() {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                callback.apply(xhr, args);
            } else {
                console.error(xhr.statusText);
            }
        }
    };
    xhr.open("GET", url, true);
    xhr.timeout = timeout;
    xhr.send(null);

    let data  = xhr.responseText;
    return data;
}

function showMessage (message) {
    console.log(message + this.responseText);
}

function include(scriptUrl)
{
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", scriptUrl);
    xmlhttp.onreadystatechange = function()
    {
        if ((xmlhttp.status == 200) && (xmlhttp.readyState == 4))
       {
            eval(xmlhttp.responseText);
       }
    };
    xmlhttp.send();

    let data  = JSON.parse(xmlhttp.responseText);

    var tempDiv = document.createElement('div');
    tempDiv.innerHTML = data.replace(/<script(.|\s)*?\/script>/g, 
     '');

    return tempDiv;
}

Все эти функции не работают так, как я хочу.

1 Ответ

0 голосов
/ 05 февраля 2019

Это на самом деле не практично - вы пытаетесь загрузить страницу HTML, все связанные сценарии, а затем запустить их на странице HTML, как если бы они находились в соответствующей среде браузера, но в текущем сеансе браузера.

Подобные вещи возможны с библиотекой jsdom, если вы работали на стороне сервера (NodeJS), потому что она имитирует поведение браузера: https://github.com/jsdom/jsdom. Так что вы можете сделать

JSDOM.fromURL("https://example.com/", { runScripts: "dangerously" }).then(dom => {
   console.log(dom.serialize()); //turn the page back into HTML
});

... чтобы получить все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...