勉強したことのメモ

webプログラマが勉強したことのメモ。

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

 

参考サイト

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

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

 - Google Apps Script, Google

  関連記事

GoogleMapAPIでクリックした座標にマーカーを設置

GoogleMapAPIでクリックした位置にマーカーを設置し、座標の経度緯度をテ ...

GoogleMapsAPIでマーカーが全て表示されるように自動ズーム

GoogleMapsAPIでマーカーを複数設置した場合にズームの値や、マーカーの ...

GASとLINEを連携させて通知を送る

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

GoogleMapAPIでマップ自体を移動し中心地の経度緯度を取得

GoogleMapでマップ自体をドラッグして移動した後、中心地の経度緯度を取得し ...

GoogleMapAPIで住所・経度緯度入力後にマーカーを移動させる

フォーム内に住所・経度・緯度のテキストボックスを設置し、住所を入力後にボタンを押 ...

androidでgeolocationを使うとtimeoutになる

Geolocation APIを用いて現在地をGoogleMapに表示させるとい ...

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

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

google map apiとPHPを組み合わせて複数マーカーとウィンドウを連携させる

やりたかった事は、 mysqlから経度緯度、マーカー名、マーカーIDを持ってきて ...

GoogleスプレッドシートとPHPの連携

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

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

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