GASで特定サイトにログインした後にスクレイピングを行う方法
Google Apps Scriptの勉強として特定サイトにログインし、その後にスクレイピングを行いたい。スクレイピングに関しては過去記事で対応済みの為、今回はログイン部分を勉強したいと思う。またログインするサイトは「小説家になろう」で試してみる。以下に対応方法のメモ。
ソースコード
function routine() {
//ログインURL
const url = 'https://ssl.syosetu.com/login/login/';
//ログイン後の遷移先URL
const contentUrl = 'https://syosetu.com/user/top/'
//ログイン時のレスポンスヘッダーにあるSet-Cookieデータを取得
const cookie = login(url);
//ログイン後の遷移先ページのHTMLデータを取得
const content = getContent(contentUrl, cookie)
console.log(content);
}
function login(url) {
//ログインID及びパスワード
const formData = {
"narouid": "xxxxxxx",
"pass": "xxxxxxx"
}
//UrlFetchAppのオプション
const options = {
"method": "POST",
"payload": formData,
"followRedirects": false
};
//データを取得
const response = UrlFetchApp.fetch(url, options);
//レスポンスヘッダーにあるSet-Cookieデータを取得
return response.getHeaders()["Set-Cookie"]; // cookie
}
function getContent(url, cookie) {
//Set-Cookieデータをヘッダーに追加
const headers = { 'Cookie': cookie };
//UrlFetchAppのオプション
var options = {
method: 'GET',
headers: headers,
followRedirects: false,
};
//データを取得
const response = UrlFetchApp.fetch(url, options);
return response.getContentText();
}
ほぼ参考サイトのソースコードのまま使用した。
ログインURL
ブラウザ上でなろうのログインページを開くとURLは「https://ssl.syosetu.com/login/input/」になる。しかしログインページからログインを行うと「https://ssl.syosetu.com/login/login/」に「narouid&pass」をPOST送信している為、GASのソースコード上のログインURLは「https://ssl.syosetu.com/login/login/」となる。
Cookie
「https://ssl.syosetu.com/login/login/」にログイン時、応答ヘッダーのSet-Cookieで「userl=xxxxxxxxx; path=/; domain=.syosetu.com; httponly」というデータが返ってくる。この「userl」がログイン後にチェックされているっぽい。なのでgetContent関数でコンテンツを取得する際にheader内にCookieデータを追加する必要がある。
開発ツールでURLやパラメータを確認
ログイン時にPOSTするパラメータ(今回であればnarouid&pass)やURL(https://ssl.syosetu.com/login/login/)はブラウザの開発ツールで確認できる。
Firefoxだと「F12キーで開発ツールを開く」→「ネットワークタブをクリック」→「右上の歯車マークをクリック」→「永続ログにチェックを入れる」→「ブラウザ上でログイン処理を行う」と進むことで各ページのURLやパラメータ、ヘッダー情報が確認できる。
Chromeだと「F12キーで開発ツールを開く」→「Networkタブをクリック」→「Preserve logにチェックを入れる」→「ブラウザ上でログイン処理を行う」で確認可能。
注意点
reCAPTCHAやパズル認証等が設置されているサイトだと今回のような自動ログインは無理と思っておいた方が良さそう。突破する方法もあるようだが、さらに対策されるといたちごっことなるかもしれない。
また、GASではユーザーエージェントの変更(偽装)は出来ないらしい。あまり無いとは思うが「特定のユーザーエージェントからのアクセスは遮断」みたいなことをされるとGASからはアクセスできない可能性あり。
参考サイト
関連記事
-
-
GASで「小説家になろう」サイトの更新通知をLINEに送る方法
Google Apps Scriptの勉強として「小説家になろう」サイトの特定小 ...
-
-
GASのプログラム実行時間計測方法と各種制限についてのメモ
PHP等でプログラムを組んでいると、あまり実行時間について気にすることはなかった ...
-
-
GASで祝日一覧(年月日と祝日名)データをJSON出力するAPIを作成
PHPのシステム案件で祝日を取得し、処理を行う箇所があった。Googleカレンダ ...
-
-
GASとLINEを連携させて通知メッセージを送る方法のメモ
Google Apps ScriptとLINEを連携させ、LINEに何らかの通知 ...
-
-
GASを利用してGmailに届いたメール内容をGoogleスプレッドシートに記入する方法
WordPressのContact Form7から送信した内容をGmailで受け ...