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キーを取得することができます。
1日500ページの取得までは無料らしいです。
GASを書く
APIキーを取得したら、GASのスクリプトプロパティという機能を使って、APIキーを保管しましょう。
以下の関数を実行して、保存することができます。
function set_property(){
// API_KEYを保存する
PropertiesService.getScriptProperties().setProperty("API_KEY", "YOUR_API_KEY");
// 確認用
Logger.log(PropertiesService.getScriptProperties().getProperty("API_KEY"));
}
保存したら、実際にスクレイピングしてみます。
スクレイピングの関数は、以下です。
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のページをスクレイピングしてみます。
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を使って、動的なページのスクレイピングをやってみました。スクレイピングの内容は拙いものでしたが、今後勉強してレベルアップしていきます!