12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GASで動的ページを操作してスクレイピング

Last updated at Posted at 2023-06-12

目的

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の書き方である。
なお、 \の記載を忘れないように注意する。私は、ここで詰みかけました。

dynamicPageScraping.gs
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を使ったスクレイピング自動化

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?