目的
GAS(Google Apps Script)を使用した動的ページのスクレイピングを実施する。pythonでseleniumを使用した方が便利かもしれないが、様々な制約からどうしてもGASを使用したかった。
使用するサービス
ヘッドレスブラウザのSaaSであるPhantomJsCloudを使用。
無料で500 view/dayが可能らしい。
記事化の目的
PhantomJsCloudの使用方法に関する日本語webサイトが少なく、特に「動的ページの操作(クリックやタイプ等)を伴うスクレイピング」かつ「GASでPOSTを使用するもの」については、なかなか情報を見つけることができなかったため。
参考にした記事
GASで動的なサイトをスクレイピングする方法
GASで動的ページのスクレイピング
前提条件
ここでは公式のテストサイト(http://phantomjscloud.com/examples/corpus/automation.html)でログイン操作を行いスクレイピングする。
①IDをタイプ
②パスワードをタイプ
③ログインボタンをクリック
の操作を行っている。
コーディング
ポイントは、操作を記述するoverseerScript
の書き方である。
なお、 \
の記載を忘れないように注意する。私は、ここで詰みかけました。
const APIKEY = 'ここにAPIキーを記載'; // PhantomJsCloudで取得するAPIキー
const LOGIN_ID = 'user'; // テストサイトのユーザ名
const LOGIN_PASSWORD = 'pass'; // テストサイトのパスワード
const DELAY_TIME = 10; // スクレイピング中の操作に対する待機時間
// PhantomJsCloudのエンドポイントを返す関数
const endpoint = apiKey => `https://PhantomJScloud.com/api/browser/v2/${apiKey}/`;
// スクレイピングの操作に関するペイロードを返す関数
const payload = (id, pass, delayTime) => (
{
url: 'http://phantomjscloud.com/examples/corpus/automation.html',
renderType: 'html',
outputAsJson: true,
overseerScript: (` \
await page.waitForSelector("input[name=id]"); \
await page.type("input[name=id]","${id}",{delay:${delayTime}}); \
await page.type("input[name=pass]","${pass}",{delay:${delayTime}}); \
page.click("input[type=button][value=Login]"); \
await page.waitForNavigation(); \
`)
}
);
// PhantomJsCloudAPIを呼ぶUrlFetchApp.fetch()で使用するオプション(上記ペイロードを伴うpostメソッド)を返す関数
const options = payload => ({
'method' : 'post',
'payload' : JSON.stringify(payload)
});
// 動的ページのスクレイピング実行関数
const dynamicPageScraping = () => {
const response = UrlFetchApp.fetch(endpoint(APIKEY), options(payload(LOGIN_ID, LOGIN_PASSWORD, DELAY_TIME)));
const result = JSON.parse(response.getContentText())["content"]["data"];
Logger.log(result);
};
さいごに
コンテンツを取得後は、よしなに処理してください。
私は、スプレッドシートへの出力するべく、以下を参考にしました。
【はじめての】GASを使ったスクレイピング自動化