動かざることバグの如し

近づきたいよ 君の理想に

Puppeteerでリダイレクト元URLとリダイレクト先URLを取得する方法

環境

  • puppeteer 1.12
  • nodejs 10

やりたいこと

Puppeteerでリダイレクトを記録したい

コード

すでにいろいろ記事は上がっているが、以下。ポイントはredirectChain()使うところだろうか。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  const response = await page.goto('https://httpbin.org/redirect/3');
  for(const req of response.request().redirectChain()) {
    console.log(`${req.url()} => ${req.response().headers().location}`);
  }
  await browser.close();
})();

reqはRequestクラス。req.url()でリダイレクト元、req.response().headers().locationでリダイレクト先を取得できる。リダイレクト先はもっといい取得方法がありそうだけど、わかっていない、、、

実行すると以下のようになる。

$node red.js 
https://httpbin.org/redirect/3 => /relative-redirect/2
https://httpbin.org/relative-redirect/2 => /relative-redirect/1
https://httpbin.org/relative-redirect/1 => /get

当然絶対URLで書いても大丈夫 。https://httpbin.org/absolute-redirect/3 とかだと

$node red.js 
https://httpbin.org/absolute-redirect/3 => http://httpbin.org/absolute-redirect/2
http://httpbin.org/absolute-redirect/2 => http://httpbin.org/absolute-redirect/1
http://httpbin.org/absolute-redirect/1 => http://httpbin.org/get

なお、RequestInterceptionの監視による記録もできるが、単に一連のリダイレクトを記録したいならredirectChain()使ったほうが良さげ。

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.isNavigationRequest() && request.redirectChain().length) {
    console.log(request.url());
  }
  request.continue();      
});