環境
- 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(); });