Puppeteerで複数のURLはPromise.allで処理したほうが倍以上高速

Puppeteerで複数のURL取得

Puppeteerで複数のURLを取得する際にfor ofを使用してループしてpage.gotoを使用すると1つずつ実行するため処理の完了が遅い。

複数のURLからdocument.titleなどのDOMの情報などを取得したい場合などはPromise.allを利用して同時(並列)にpage.gotoを実行したほうが処理時間が短くなる。※

※ headless: falseにしてpage.gotoでブラウザを表示して確認したい場合は逆にfor ofのほうが都合が良い。

for of 使用

const startTime = Date.now()
const puppeteer = require('puppeteer')
const DCL = {waitUntil: 'domcontentloaded'}
const urls = [
  'https://yahoo.co.jp/',
  'https://line.me/ja/',
  'https://mixi.jp/',
  'https://dena.com/jp/',
  'http://gree.jp/',
];

(async() => {
  const browser = await puppeteer.launch()
  const titleList = []
  for (const url of urls) {
    const page = await browser.newPage()
    await page.goto(url, DCL)
    const result = await page.evaluate(() => {
      return document.title
    })
    titleList.push(result)
    await page.close()
  }
  console.log(titleList)
  await browser.close()
  console.log(Math.round((Date.now() - startTime) / 1000) + '秒')
  // => 6秒
})()

Promise.all 使用

const startTime = Date.now()
const puppeteer = require('puppeteer')
const DCL = {waitUntil: 'domcontentloaded'}
const urls = [
  'https://yahoo.co.jp/',
  'https://line.me/ja/',
  'https://mixi.jp/',
  'https://dena.com/jp/',
  'http://gree.jp/',
];

(async() => {
  const browser = await puppeteer.launch()
  const promiseList = []
  const titleList = []
  urls.forEach(url => {
    promiseList.push((async() => {
      const page = await browser.newPage()
      const res = await page.goto(url, DCL)
      if (res.status() !== 200) return `${res.status()} ERROR`
      const result = await page.evaluate(() => {
        return document.title
      })
      await page.close()
      return result
    })().catch(e => console.error(e)))
  })
  await Promise.all(promiseList).then(vList => {
    vList.forEach(title => titleList.push(title))
  })
  console.log(titleList)
  await browser.close()
  console.log(Math.round((Date.now() - startTime) / 1000) + '秒')
  // => 3秒
})()

上記の処理時間はPCのスペックや回線速度によって変わるので注意。(Promise.allのほうが早く処理できることは変わらない)