6
12

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 3 years have passed since last update.

GASで動的なサイトをスクレイピングする方法

Last updated at Posted at 2021-08-04

GASによるスクレイピング

ふと「GAS(Google Apps Script)でスクレイピングってできるのかな?」って思い調べてました。GASにはParserというスクレイピング用のライブラリが用意されていて、それを使うとスクレイピングが可能です。またGASには定期実行機能があるので、スクレイピングをするのに向いています。

「試しにスクレイピングしてみよう」と思ったら、1つ問題点がありました。スクレイピング用のParserライブラリですが静的なサイトのスクレイピングしかできず、JavaScriptが使われているような動的なページはスクレイピングできません。「困ったなー」と思い、調べてみると、PhantomJsCloudを使うことで動的なサイトのスクレイピングができることがわかりました。

PhantomJsCloudとは

PhantomJsCloudとは、ヘッドレスブラウザのクラウドサービスです。公式には以下のような記載がありました。

A web-browser hosted as a service, using Chrome (via Puppeteer or PhantomJs) to render your javascript heavy webpages as HTML, PDF, JPEG, PNG, or JSON.

元々PhantomJSがどういうものか知っていたので、「こんな感じのサービスかな〜」と名前を聞いて思いました。
これを使うことで、GASでも動的なサイトのスクレイピングが可能になります。

GASとPhantomJsCloudを使ったスクレイピング

PhantomJsCloudに登録

PhantomJsCloudにアクセスして、Sign upするとAPIキーを取得することができます。

スクリーンショット 2021-04-10 21.11.09.png

1日500ページの取得までは無料らしいです。

GASを書く

APIキーを取得したら、GASのスクリプトプロパティという機能を使って、APIキーを保管しましょう。
以下の関数を実行して、保存することができます。

set_property.gs
function set_property(){
  // API_KEYを保存する
  PropertiesService.getScriptProperties().setProperty("API_KEY", "YOUR_API_KEY");
  // 確認用
  Logger.log(PropertiesService.getScriptProperties().getProperty("API_KEY"));
}

保存したら、実際にスクレイピングしてみます。
スクレイピングの関数は、以下です。

scraiping.gs
function scraping(target_url) {
  // optionsを設定
  var options = {
    url: target_url,
    renderType: "HTML",
    outputAsJson: true
  };
  var pay_load = encodeURIComponent(JSON.stringify(options));
  // API_KEYの呼び出し
  const API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY");
  // リクエストを行うURLを設定
  var api_url = "https://phantomjscloud.com/api/browser/v2/"+ API_KEY +"/?request=" + pay_load;
  // 結果を取得
  var response = UrlFetchApp.fetch(api_url).getContentText();
  // JSONデータをパースして、欲しいデータを取得
  var data = JSON.parse(response)["content"]["data"];
  
  return data;
}

定義した関数を使って実際に動的なページのスクレイピングをやってみます。
今回は自分のQiitaのページをスクレイピングしてみます。

scraiping.gs
function myFunction() {
  // QiitaのTOPページをスクレイピングする
  var url = 'https://qiita.com/zumi0';

  // 結果を取得し、確認してみる
  var html = scraping(url);

  // Parserライブラリと正規表現を使って、タイトルを取得する
  // 上手くタイトルが取得できなかった…
  var titles = Parser.data(html).from('<a href="https://qiita.com/zumi0/items/').to('/a>').iterate();
  var first_title = Parser.data(titles[0]).from('>').to('<').build();

  Logger.log(first_title);
}

最後に

今回はGASとPhantomJsCloudを使って、動的なページのスクレイピングをやってみました。スクレイピングの内容は拙いものでしたが、今後勉強してレベルアップしていきます!

6
12
1

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
6
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?