【问题标题】:puppeteer api: only get domain redirectspuppeteer api:仅获取域重定向
【发布时间】:2018-05-21 11:28:19
【问题描述】:

我正在尝试使用 Puppeteer api 获取所有域重定向,在截取最终 URL 的屏幕截图之前保存到一个数组中,但我目前的代码也正在获取其他重定向。

例如,如果我 goto youtube.com,那么我的代码将正确获得重定向 'https://youtube.com/', 'https://www.youtube.com/',,但它也会获得其他重定向,例如 doubleclick.net。

我只想获取会在 URL 栏中发生的重定向。

我已经设法用request.resourceType === 'document' 缩小范围。 如何进一步缩小范围?

代码如下:

// node chrome.js http://youtube.com

const puppeteer = require('puppeteer');
var url = process.argv[2];

(async () => {

    const browser = await puppeteer.launch({headless: true, timeout: 30000, ignoreHTTPSErrors: true});
    const page = await browser.newPage();
 // await page.setRequestInterception(true); // hangs with resourcetype

    const urls = [];

    page.on('request', request => {
      // if (request.resourceType === 'document' || request.resourceType === 'script') {
      if (request.resourceType === 'document') { 
      urls.push(request.url);
      request.continue();
      }
    });

    await page.goto(url, {timeout: 20000, waitUntil: 'load'}); //default load

    await page.screenshot({path: 'test.jpg', type: 'jpeg', quality: 80, fullPage: false});
    console.log(urls);

    await browser.close();
})();

【问题讨论】:

    标签: javascript node.js headless-browser puppeteer google-chrome-headless


    【解决方案1】:

    主要反应是第一个反应。所以你可以用 Emitter 类的once 方法检查:

    page.once('response', function(response) {
        console.log(`${response.status()} ${response.url()}`); 
    });
    // page.goto(...);
    

    如果你想要所有重定向的列表,你可以这样做:

    let responses = [];
    const _parseMainResponses = function(response) {
        if(response.status() >= 300 && response.status() <= 399) {
            responses.push(response);
        }else {
            responses.push(response);
            // get a non redirect. We can now remove the listener
            page.removeListener('response', _parseMainResponses);
        }
    };
    
    
    // page.goto(...)
    
    responses.map(function(response) {
        console.log(`${response.status()} -> ${response.url()}`);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-10
      • 2021-03-03
      • 2017-03-27
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多