GASでログインが必要なサイトのスクレイピングしたいけど、どうすればいいかわからず困っていませんか?
この記事では、GASでログインが必要なWebサイトをスクレイピングする方法について解説します。
GASでログインを突破する方法を知りたい人は参考にしてください。
GASでWebサイトにログインする上で知っておくべきこと
まず最初に、GASでWebサイトにログインする上で知っておくべきことについて解説します。
「GASでログインを突破するにはどんな手を使うのか…」まずはざっくり理解しましょう。
ブラウザにデータを入力する方法は使えない
GASでログインを突破する際には「ブラウザにデータを入力しない」で、ログインを突破します。
Seleniumuなどのブラウザ操作ツールを使ってログインを突破する際には、ブラウザに直接情報を入力しますが、GASではそんなことはしません。
ではどうやってログインを突破するのか、これから解説していきます。
Webサイトのサーバーに直接リクエストを送る
GASでログインを突破するには、Webサイトのサーバーに直接データを送って認証します。
「いや~スクレイピングで多少のプログラミングはできるけど、サーバーとかWebの仕組みとかはよくわからないよ~」という人も安心してください。上記の仕組みを理解しなくても、コードが正しければプログラムは動きます。
「いやいや、仕組みがわからないと正しいコードも書けないでしょ?」という方、安心してください。コピペで動くコードを次節で紹介します。
サーバーにリクエストを送るのは難しくない【サンプルコード】
サーバーに直接リクエストを送ってログインを突破するのは難しくありません。
なぜなら、以下のコードをコピペして、自分が突破したいWebサイトに合わせて、
- ログイン情報
- リクエスト情報
を変更するだけでOKだからです。
以下、サンプルコードです。
GASでログイン&スクレイピングできるサンプルコード
function gas_login(){
var login_url = "https://xxxxxxx.com/login";
//ログイン情報(PayLoadデータ)
var payload_data = {
login_id: "ログインID",
password: "ログインパスワード",
login: "ログイン"
};
//POSTデータ(POSTオプション)
var post_option = {
method: "post",
payload: payload_data,
followRedirects: false
};
//レスポンス(POSTリクエスト)
var response = UrlFetchApp.fetch(login_url, post_option);
//レスポンスのヘッダーからcookieを取得
var cookies = response.getHeaders()["Set-Cookie"];
// ログインで認証されたcookieはヘッダーで使用
var header = { Cookie: cookies };
var get_option = {
method: "get",
headers: headers,
followRedirects: true,
};
var scraping_url = "https://xxxxxxx.com";
response = UrlFetchApp.fetch(scraping_url, get_option);
var content = response.getContentText("UTF-8");
var regText = /文字列/
var html = content.match(regText);
Logger.log(html);
}
GASのスクレイピングでログインする手順
はい、コードだけいきなり投げられても困りますよね(笑)
ここからはGASのスクレイピングでログインする具体的な手順について解説します。
GASでログイン&スクレイピングする手順
- ログイン画面を開く
- デベロッパーツールを表示(Chrome推奨)
- 普通に入力してログインしてリクエスト情報を確認
- ログインのリクエスト送信機能を実装
- ログイン状態の維持機能を実装
- ログイン先のHTMLが返されたらログイン突成功!
ログイン画面を開く
まずはログインしたいWebサイトのログインページを開きましょう。
サンプルコードだと、下記の部分ですね。
var login_url = "https://xxxxxxx.com/login";
デベロッパーツールを表示(Chrome推奨)
続いてデベロッパーツール(開発モード)を開きましょう。
Safariやfirefoxだと違う名称かもしれませんが、今回は推奨ブラウザとしてChromeを使うものとして進めていきます。
普通に入力してログインしてリクエスト情報を確認
GASでログインするには「ログイン情報」とは別に「リクエスト情報」が必要です。
「リクエスト情報? は? なにそれ?」と思った方、安心してください。
リクエスト情報はデベロッパーツールの下記の場所を見ればわかります。
ログインのリクエスト送信機能を実装
さて、いよいよ肝心の「ログイン機能(リクエスト送信機能)」の実装です。
ログインしたいWebサイトの「ログイン情報」、先ほど取得した「リクエスト情報」と合わせて、以下のように実装しましょう。
//ログイン情報(PayLoadデータ)
var payload_data = {
login_id: "ログインID",
password: "ログインパスワード",
login: "ログイン"
};
//POSTデータ(POSTオプション)
var post_option = {
method: "post",
payload: payload_data,
followRedirects: false
};
//レスポンス(POSTリクエスト)
var response = UrlFetchApp.fetch(login_url, post_option);
はい、実はリクエストの送信は最後の1行だけでOKなんですね。
UrlFetchAppクラスのfetchメソッドに、ログインURLとログイン・リクエスト情報を添えて投げましょう。
ログイン状態の維持機能を実装
よっしゃ~これでログインできた~と思った方。ごめんなさい。最後にもう一仕事あります。
このままだとログインは突破できるのですが、ログイン後に任意のページをスクレイピングすることができません。
「このユーザーはログイン認証してますよ~」っていう通行手形を持ってないからですね。Webにおいてはこの通行手形を「Cookie(クッキー)」で保持しています。
Cookieは以下のコードで取得・保持できます。
//レスポンスのヘッダーからcookieを取得
var cookies = response.getHeaders()["Set-Cookie"];
// ログインで認証されたcookieはヘッダーで使用
var header = { Cookie: cookies };
var get_option = {
method: "get",
headers: headers,
followRedirects: true,
};
ログイン先のHTMLが返されたらログイン成功!
さぁ!いよいよスクレイピングの工程です。
GASのスクレイピングは先ほども使ったUrlFetchAppクラスのfetchメソッドで取得したレスポンスから、getContentTextメソッドを使ってHTMLを取り出します。
var scraping_url = "https://xxxxxxx.com";
response = UrlFetchApp.fetch(scraping_url, get_option);
var content = response.getContentText("UTF-8");
var regText = /文字列/
var html = content.match(regText);
Logger.log(html);
後は上記コードでも上げているような正規表現でのスクレイピングや、splitメソッド、replaceメソッドなどを活用して、必要な情報を抽出してください。ここからは普通のスクレイピングと同じです。
GASでの通常のスクレイピングについて知りたい人は、下記の記事を参考にしてください。
まとめ
今回は「GASでログインが必要なWebサイトをスクレイピングする方法」について解説しました。
GASでのログイン突破は、PythonやSeleniumとは少し実装方法が違うので戸惑うかもしれませんが、慣れてしまえばなんてことはありません。
まずは1サイト、試しにログインを突破してみてはいかがでしょうか。
では、また。