GASでスクレイピング 〜天才ア○バ様の教え〜

フハハハハ!お前たち愚か者には到底理解できぬだろうが、我こそは天才、ア○バ様だ!このア○バが、Google Apps Script(GAS)を使ってログインが必要なウェブページをスクレイピングする術を伝授してやろう!私のような天才にかかれば、こんなことは児戯にも等しい!


スクレイピングとは何かだと?フフフ…

愚かな質問だが、教えてやる。スクレイピングとは、ウェブページのデータを自動で引きずり出す技だ!手動でポチポチやるのはもはや古代の技術。我、ア○バが編み出す自動化こそ真の覇道だ。だがな、ログインを必要とするページでは、少しばかり知恵を使わねばならぬ。フハハ!見ていろ、私が如何にしてその壁を打ち破るかを!


ステップ1:ログインフォームを解析する…当然だろう!

フフフ、ログインページに飛び込む前に、まずは敵(ログインフォーム)を解析せねばならん。愚か者どもは「ボタンを押すだけ」などと考えておるが、天才たる○ミバ様はそんなものに惑わされぬ。よく見ていろ、これが解析の手順だ!

  1. ログインページに潜入: 私のような天才は、Chromeを開いてログインページに足を踏み入れるのだ。
  2. 開発者ツールの召喚: F12 だ。これでログインフォームの裏側、つまりその構造を暴いてやるのだ。
  3. Networkタブで観察: フハハ、ここでフォームがどのURLにデータを送信しているかを見つけるのだ!愚か者には見えぬが、私には見える…。
  4. POSTデータの確認: ログインボタンを押して送信されるデータ、すなわちユーザー名(username)やパスワード(password)がどのように送られるかを知るのだ。

ステップ2:ログインリクエストをぶち込む!フハハハ!

さて、ログインフォームの弱点を見抜いた今、私○ミバがログインのリクエストを飛ばしてやろう。愚かなセキュリティなど我にとっては無力よ!

const loginUrl = 'https://example.com/login';  // ログインページのURL
const loginPayload = {
  'username': 'yourUsername',  // 貴様の名をここに入れろ
  'password': 'yourPassword'   // 貴様のパスワードもだ!
};

const loginOptions = {
  'method': 'post',
  'payload': loginPayload,
  'followRedirects': false
};

const loginResponse = UrlFetchApp.fetch(loginUrl, loginOptions);

これがログインリクエストだ!ユーザー名とパスワードを送りつけ、ログインを果たす!天才○ミバには当然のことだな。


ステップ3:クッキーを奪い取れ!

愚か者よ、ログインに成功した後にはクッキーというものが渡される。これは貴様がログインした証だ!これを手中に収め、次なるリクエストで使うのだ。天才アミ○には容易いことよ!

const headers = loginResponse.getAllHeaders();
const cookies = headers['Set-Cookie'];  // これだ!クッキーを奪え!

ステップ4:スクレイピングの極意、クッキーを使ってデータを手に入れる!

クッキーを保持したまま、保護されたページにアクセスし、データを引きずり出すのだ!これがスクレイピングの極意よ!フハハ!

ん??セッションクッキーらしきものが発行されているのにログインページの先に進めないだと?まさか、奪い取ったクッキーをそのまま使っているのではあるまいな?何だと?!凡人は拾ったクッキーを洗わずに食べるとでもいうのか?

サーバから送られてくるクッキーには様々な属性がついているが、クライアント側から送信する場合にはそれらが邪魔になる場合があるからな。余分なものを削ぎ落としてしまえば良いのだ。

まあ、多いに試行錯誤してくれたまえ。この天才アミ○様ですら、木偶を使って日々研究に勤しんでいるのだからな。

const fetchUrl = 'https://example.com/protected-page';  // 目標のページだ!

const cleanUpCookies = (cookies) => { //余分なものは削ぎ落とすまで。
const tmpCookies = {};
cookies.forEach(line => {
  const [k, v] = line.split(';')[0].split('=');
  tmpCookies[k] = v;
});
  let cleanedCookies = '';
  Object.keys(tmpCookies).forEach(k => cleanedCookies += `${k}=${tmpCookies[k]};`);
  return  cleanedCookies;
}

const newCookies = cleanUpCookies(cookies);

const fetchOptions = {
  'method': 'get',
  'headers': {
    'Cookie': newCookies  // これでお前はもう私のものだ!
  }
};

const fetchResponse = UrlFetchApp.fetch(fetchUrl, fetchOptions);
const content = fetchResponse.getContentText();
Logger.log(content);  // 見ろ!データが手に入った!

最後に、天才の教えを聞け!

これでお前たちも少しは成長できただろう。だが、覚えておけ!このアミ○様には敵わぬことをな!JavaScriptやCAPTCHAに阻まれるとき、お前たちにはまだそれを突破することは出来んだろう。だが、私にはすでにそれを突破するための新しい秘孔が見えている。私の研究のために新しい木偶を提供してくれるなら、お前たちにも教えてやっても良いのだぞ?フハハハハ!

注意:この技を乱用するな!さもなくば…お前もまた、天才に憧れた愚か者として、消え去ることになるぞ!フハハハハ!

コメント

このブログの人気の投稿

桃太郎電鉄ワールド、初の大型アップデート。その名も『ムー大陸浮上!』

GASのさらに高度なテクニック:非同期処理、プロパティサービス、Webhookチェーン