勉強したことのメモ

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を使って任天堂ホームページ更新情報のRSSを取得する方法

GASを使ってRSSを取得してみたい。今回はニンテンドーホームページ更新情報とい ...

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

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

GoogleスプレッドシートとPHPを連携させデータを取得・追記する方法

GoogleスプレッドシートとPHPプログラムを連携させたいという案件をたまに見 ...

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

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

GASでGoogleカレンダーと連携してイベントの取得・追加・削除

Google Apps Scriptの勉強としてGoogleカレンダーと連携させ ...