Заголовки ответа HTTP после временного перенаправления с использованием Node.js и Puppeteer - PullRequest
0 голосов
/ 04 ноября 2019

Как получить заголовки ответа с помощью Puppeteer, уже дан ответ ниже:

Возможно получить заголовки ответа HTTP с помощью Nodejs и Puppeteer

Однако у меня естьспецифическая ситуация, когда начальный URL перенаправляется на другой URL через несколько секунд.

Вот соответствующий код, который я запускаю:

const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: false});

const page = await browser.newPage();

// get the response object of the initial URL
var page_response_obj = await page.goto(url_str, {timeout: PAGE_TIMEOUT_GOTO_MS, waitUntil: 'domcontentloaded'});

// get page title of initial page
var page_title_1_str = await page.title();

// wait for a few seconds to cover the timed redirect
await page.waitFor(6130);

// get page title of final page
var page_title_2_str = await page.title();

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

Можно ли получить заголовки ответа окончательного URL?

РЕДАКТИРОВАТЬ

Я использую это для веб-сайтов с защитой CloudFlare, где вам нужно подождать около 5 секунд, прежде чем вы будете перенаправлены на реальный веб-сайт.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

При ближайшем рассмотрении выясняется, что существуют некоторые перенаправления, которые могут быть вызваны на входном интерфейсе [с помощью сценария], и, следовательно, не могут быть зафиксированы в стандартной цепочке перенаправлений. Таким образом, у меня не было успеха с предложением Эди.

Итак, вот что мне нужно было изменить, чтобы заставить вещи работать:

  1. Используйте обработчик события ответа
  2. Подождите некоторое время (от 30 до 45 секунд), чтобы убедиться, что вы захватили соответствующий ответ после перенаправления. Вы можете настроить продолжительность времени, если вам нужно.

В моем случае я пытался определить, включен ли gzip, поэтому мне нужен действительный объект ответа в конечном URL. Вот пересмотренный код:

// define url and host
var url_str = 'https://www.example.com';
var url_host_str = 'example.com';

// define GZIP test function
var _checkGZIP = function(resp_headers_obj)
{
    var resp_header_content_encoding_str = resp_headers_obj['content-encoding'];
    var is_gzip_bool = !!(/gzip/i.test(resp_header_content_encoding_str));

    return is_gzip_bool;
};

const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: true});

const page = await browser.newPage();

// set result variable outside event handler scope
var is_gzip_bool = false;

/**
 * Set response event handler
 * This will capture all responses from the initial URL and from final URL
 */
page.on('response', function(response_obj)
{    
    // get URL and headers
    var resp_url_str = response.url();
    var resp_headers_obj = response.headers();

    if(!is_gzip_bool)
    {
        // check for only specific URLs
        if(/^ *https?\:\/\/([^\?\/]+)(\/|)([^\n\r\?\.]+|) *$/i.test(resp_url_str) && resp_url_str.includes(url_host_str))
        {
            // do gzip test
            is_gzip_bool = _checkGZIP(resp_headers_obj);
        }
    }
}

// go to page
await page.goto(url_str, {timeout: PAGE_TIMEOUT_GOTO_MS, waitUntil: 'domcontentloaded'});

// wait for a long while to capture all relevant responses [from both initial and final URL]
await page.waitFor(30000);

// document your result if required

// close browser
await browser.close();
0 голосов
/ 05 ноября 2019

Вы можете использовать связанное свойство перенаправления объекта Request.

const puppeteer = require ('puppeteer')
const url = 'http://doodle.google.com/'

;(async () => {
    const browser = await puppeteer.launch({
        args: ['--no-sandbox', '--disable-setuid-sandbox'],
        headless: true
    })

    const page = (await browser.pages())[0]

    // get the response object of the initial URL
    const response = await page.goto(url, {timeout: 0, waitUntil: 'domcontentloaded'})

    // get the first response header
    console.log ( response.headers() )

    // get page title of initial page
    const title1 = await page.title()

    const chain = response.request().redirectChain()

    // If the page redirected, all of chained response headers will be shown here
    for ( let num in chain ) {
        console.log( chain[num].response().headers() )
        // console.log(chain[0].url()) // => print the URL
    }

    // get page title of final page
    const title2 = await page.title()
})()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...