勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

GASで特定サイトにログインした後にスクレイピングを行う方法

  Google Apps Script Google

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からはアクセスできない可能性あり。

 

参考サイト

https://qiita.com/shikumiya_hata/items/aa7d80a1d17ca48ce079

https://webird-programming.tech/archives/902

 - Google Apps Script Google

  関連記事

GASで特定サイトをスクレイピングし、画像をGoogleドライブに保存
GASで特定サイトをスクレイピングし、画像をGoogleドライブに保存

Google Apps Scriptで特定のサイトにスクレイピングし、画像が掲載 ...

GASとAdSense Management APIを使って前日分の売り上げをメール通知する方法
GASとAdSense Management APIを使って前日分の売り上げをメール通知する方法

Googleアドセンスの売り上げをチェックする際、いつもはアドセンスの管理画面に ...

GASとGoogleカレンダを連携し暦通りではない店休日を取得する方法
GASとGoogleカレンダを連携し暦通りではない店休日を取得する方法

小売店等のサイトで営業日カレンダーみたいなものを表示させる際に今まではPHPで管 ...

GASで「小説家になろう」サイトの更新通知をLINEに送る方法
GASで「小説家になろう」サイトの更新通知をLINEに送る方法

Google Apps Scriptの勉強として「小説家になろう」サイトの特定小 ...

GASのプログラム実行時間計測方法と各種制限についてのメモ
GASのプログラム実行時間計測方法と各種制限についてのメモ

PHP等でプログラムを組んでいると、あまり実行時間について気にすることはなかった ...