背景
タイトルの通り。
以前、ダルいブラウザ操作を自動化しようと思ってスクレイピングに手を出すも、ログイン認証が必要なWebアプリケーションはURLにアクセスしてもログイン画面に飛ばされてしまうため「スクレイピングしょーもな」となっていた。
(本目的でない且つ一度しか出ないログイン画面の操作を自動化するのは面倒くさい。つーか単純操作を手抜きする精神で始めたような人間がスクレイピングの細かい部分まで学習するわけねーだろ)
最近、ログインだけ手動で行って、ログイン済みのcookieを保存しておき、それを読み込めばログイン操作無しでスクレイピングできることを知ったので備忘として残しておく。
やりかた
ログインしてcookieを保存する処理とメインのスクレイピングの2つを作る。
Node.jsが好きなのでPuppeteerというライブラリを使ってスクレイピングを行う。
手法自体は他のライブラリにも使いまわせると思う。
1.cookieの保存
setTimeoutで待機している間に手動でログイン操作するという、ただそれだけのこと。
cookie.js
const fs = require('node:fs');
const puppeteer = require('puppeteer');
// メニュー画面のURLを指定してもログインしていないとログイン画面にリダイレクトされる的なサイト
const url = 'https://example.com/menu';
(async () => {
// GUI表示したいのでヘッドレスモードをオフにする
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 目的のサイトに移動してもログイン画面にリダイレクトされる想定
await page.goto(url);
// 任意の時間を指定して手動でログインを済ませる(後々ここを自動化しても良い)
await new Promise(resolve => setTimeout(resolve, 60000));
// cokkieを取得してファイルとして保存する
const cookies = await page.cookies();
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
// ブラウザを閉じる
await browser.close();
})();
2.保存したcookieを読み込んでスクレイピングする
cookieを読み込んでやりたいスクレイピングをやるだけ
scraping.js
const fs = require('node:fs');
const puppeteer = require('puppeteer');
// メニュー画面のURLを指定してもログインしていないとログイン画面にリダイレクトされる的なサイト
const url = 'https://example.com/menu';
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 1.で保存したcookieを読み込む(期限切れ注意)
const cookies = JSON.parse(fs.readFileSync('cookies.json'));
await page.setCookie(...cookies);
// 目的のサイトのログイン後の画面が表示されるはず
await page.goto(url);
// 任意の自動操作(例: 特定のクラス名のボタンクリック)
await page.click('.search-btn');
await browser.close();
})();
まとめ
細かいことはいいからさっさとWebスクレイピングしたい人向け。
手動ログイン操作部分を自動化したり、2つの処理をまとめたり、工夫の余地はあると思います