masalibの日記

システム開発、運用と猫の写真ブログです

puppeteerでイメージダウンロード

node.jsのスクレイピングといえばcheerio-httpcliでした
このモジュールは便利で画像の一括ダウンロードとかもできた

f:id:masalib:20180426213826j:plain

puppeteerはあまりダウンロードについては記載がなかった
いろいろ調べたらできた

ダウンロードすべきタグ(セレクター)がわかっている場合と
わからなくて兎にも角にも一括ダウンロードするやり方があるみたい

ダウンロードすべきタグ(セレクター)がわかっている時

const puppeteer = require('puppeteer');
const fs = require('fs');

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    ignoreHTTPSErrors : true ,
  });
  const page = await browser.newPage();
  page.setViewport({ width: 1280, height: 926 });

  targetSelector = '#box2-inner > div.hatena-module.hatena-module-profile > div.hatena-module-body > a > img';

  await page.goto('http://masalib.hatenablog.com/');
  await page.waitForSelector(targetSelector);

  // Select the #svg img element and save the screenshot.
  const svgImage = await page.$(targetSelector);
  await svgImage.screenshot({
    path: 'Download/downimage.jpg',
    omitBac	kground: true,
  });
  await browser.close();
})();

わからないので一括ダウンロードする時

const fs = require('fs');
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({ width: 1280, height: 926 });

  let counter = 0;
  page.on('response', async (response) => {
    const matches = /.*\.(jpg|png|svg|gif)$/.exec(response.url());
    if (matches && (matches.length === 2)) {
      const extension = matches[1];
      const buffer = await response.buffer();
      fs.writeFileSync(`Download/image-${counter}.${extension}`, buffer, 'base64');
      counter += 1;
    }
  });

  await page.goto('http://masalib.hatenablog.com/');
  await page.waitFor(10000);

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

responseからURLを特定してダウンロードすることができるようになった
次はSPA(シングルページアプリケーション)での画像をとれるようにしたい
これができればインスタグラムの可愛い猫画像が大量にゲットできる