GASで動的なWebページのスクレイピングをしました。
動的なサイトのスクレイピングでは、単にhtmlを取得しても必要な情報を取得できません。
動的なサイトはjsを実行後に必要な情報を含んだhtmlを構成するからです。
そんなときにjs実行後のhtmlを返してくれるサービスが必要になります。
そこで今回は無料のPhantomJsCloudを使ってみました。無料版の場合、一日に約500ページほど処理してもらえます。
まずはこちらのサイトでサインアップします。
サインアップするとこのようにApiKeyが生成されます。これをメモしてこのサービスでの操作は終わりです。
次にGASのスクリプトを書きます。
まず変数optionの中でPhantomJsCloudに渡すパラメータを設定します。
それを変数payloadに入れる際にJSON形式にします。
それ以降は普通のGASでのスクレイピングでの手順と同じです。UrlFetchApp.fetch()でアクセスし、そのレスポンスを欲しい形に整形してゴニョゴニョします。
今回は追加でParser.jsというHTMLをパースしてくれるライブラリも使いました。
ライブラリのキーは以下の通りです。
M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV
このライブラリで使えるこの一文は欲しい要素を取得するのに重宝できます。
Parser.data(source).from(‘欲しい要素の直前”‘).to(‘欲しい要素の直後’).build();
以下にコードをまとめて置いておきます。
[highlight_javascript]const URL = “情報取得先のURL”;try{
var option =
{url:URL,
renderType:’HTML’,
outputAsJson:true};
var payload = JSON.stringify(option);
payload = encodeURIComponent(payload);
var url = ‘https://PhantomJsCloud.com/api/browser/v2/\[ここにApiKeyを入れる\]/?request=’ + payload;
//urlの先の情報
var response = UrlFetchApp.fetch(url); //httpレスポンス
var json = JSON.parse(response.getContentText(“UTF-8”));
var source = json[“content”][“data”];
var link = Parser.data(source).from(‘欲しい要素の直前”‘).to(‘欲しい要素の直後’).build();
Logger.log(link);[/highlight_javascript]
今回は以上です。
やはり自分で何かをつくるのは楽しいですね。がんばります。
参考サイト
https://phantomjscloud.com/pricing.html
https://tonari-it.com/scraping-javascript-gas-phantomjscloud/