🕸️
Puppeteer を使ったヘッドレスブラウザによるスクレイピング
以下の手順を、puppeteer で行う例。
Bot判定されにくくするために、puppeteer-extra と puppeteer-extra-plugin-stealth を用いる。
手順
- URL のリストが入った CSVファイルの読み込み
- ヘッドレスブラウザの Chromium でスクレイピング
- HTMLファイルとして保存
- 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