勉強したことのメモ

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とDrive APIを組み合わせて画像やPDFファイルをOCR処理する方法
GASとDrive APIを組み合わせて画像やPDFファイルをOCR処理する方法

Googleドライブに保存した画像やPDFファイルをOCR処理し、ファイル内のテ ...

GASとChatworkを連携してメッセージを送信する方法
GASとChatworkを連携してメッセージを送信する方法

Google Apps Scriptの勉強として「Chatwork」と連携させて ...

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

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

GASとLINEを連携させて通知メッセージを送る方法のメモ
GASとLINEを連携させて通知メッセージを送る方法のメモ

Google Apps ScriptとLINEを連携させ、LINEに何らかの通知 ...

GASで祝日一覧(年月日と祝日名)データをJSON出力するAPIを作成
GASで祝日一覧(年月日と祝日名)データをJSON出力するAPIを作成

PHPのシステム案件で祝日を取得し、処理を行う箇所があった。Googleカレンダ ...