🕸️

Puppeteer を使ったヘッドレスブラウザによるスクレイピング

2020/10/11に公開

以下の手順を、puppeteer で行う例。
Bot判定されにくくするために、puppeteer-extra と puppeteer-extra-plugin-stealth を用いる。

手順

  1. URL のリストが入った CSVファイルの読み込み
  2. ヘッドレスブラウザの Chromium でスクレイピング
  3. HTMLファイルとして保存
  4. 1 〜 3 を CSV のデータ分、繰り返し実行

インストール

npm i --save puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
npm i --save papaparse

コード

以下のような CSVデータを想定

url
https://www.xxx.jp
https://www.yyy.jp
https://www.zzz.jp
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const papa = require('papaparse');
const fs = require('fs');
const root = './';

puppeteer.use(StealthPlugin());
(async () => {
  console.time('Processing time');
  // 初期設定
  file = fs.readFileSync(root + 'urls.csv', 'utf8')
  table = papa.parse(file, {
    header: true,
    skipEmptyLines: true
  }).data;

  // ブラウザ起動
  const browser = await puppeteer.launch({
    defaultViewport: {
        width: 1920,
        height: 1080,
    },
    args: ['--no-sandbox'],
    headless: true
  });

  for (const row of table) {
    // ページ生成
    const page = await browser.newPage();
    await page.setExtraHTTPHeaders({
      'Accept-Language': 'ja'
    });
    try {
      // アクセス
      const response = await page.goto(row.url, { waitUntil: 'load' });
      // 1000 - 5000ms 待ち (必要な場合のみ)
      await page.waitFor(Math.floor((Math.random() * 4000)) + 1000);
      if (response.status() == 200) {
        // HTML取得・保存
        const html = await page.content();
        fs.writeFileSync(root + row.url + '.html', html);
      }
      await page.close();
    } catch (e) {
      console.log(e);
      await page.close();
      continue;
    }
  }
  // ブラウザ閉じる
  await browser.close();
  console.timeEnd('Processing time');
})();

実行

node scraping.js

Discussion