みなさん、こんにちは!うえはら(@tifoso_str)です。
【JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第六弾です。
第四弾では「GASでPhantomJS Cloudを利用してWebページをスクレイピング」しました。
また、第二弾では「VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング」しました。
VBAとGoogle Apps Scriptでスクレイピング出来れば、実務では事足りるもしれませんが、プログラムの世界ではPythonの人気が上がってきています。
そこで今回より、PythonでJavaScriptで動作するWebサイトをスクレイピングする方法を紹介します。
Pythonでスクレイピングする方法は別連載でもお伝えしていますので、併せて確認お願いします。
PythonでJavaScriptで動作するWebサイトをスクレイピングする方法はいくつかありますが、今回はGASからの流れで「PythonでPhantomJs Cloudを利用してWebページをスクレイピング」していきます。
前回までのおさらい
前回までの分を簡単におさらいします。
まず、Phantom Js Cloudですが、これはクラウドで動作するヘッドレスブラウザです。
簡単に言うと、スクレイピングしたいURLをわたすと、JavaScriptが実行された後のHTMLドキュメントを返してくれるサービスです。
GASでPhantomJS Cloudを利用してWebページをスクレイピングするスクリプトは下記のようになります。
function scraping() { const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 var key = '**-#####-*****-#####-*****-#####'; var option = {url:URL, renderType:"HTML", outputAsJson:true}; var payload = JSON.stringify(option); payload = encodeURIComponent(payload); var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload; var response = UrlFetchApp.fetch(url); var json = JSON.parse(response.getContentText()); var source = json["content"]["data"]; var myRegexp = /<title>([\s\S]*?)<\/title>/; var title = source.match(myRegexp); Logger.log(title[1]); var myRegexp = /<span id=\"chosui_hiduke\">([\s\S]*?)<\/span>/; var day = source.match(myRegexp); Logger.log(day[1]); var myRegexp = /id=\"ritsu_today4\">([\s\S]*?)<\/td>/; var waterRate = source.match(myRegexp); Logger.log(waterRate[1]); }
今回のシリーズでは、沖縄県のダムの貯水率をスクレイピングで取得しています。
結果は下記のようになります。
これと同じ事をPythonでやってみます。
PhantomJsCloudにアクセスするURLの作成
PhantomJs CloudにアクセスするURLは下記のようになります。
[YOUR-KEY]はApiKeyを、[REQUEST-JSON]にはスクレイピングしたいURL等のオプションを指定すればよかったですね。
また、[REQUEST-JSON]はJSON形式をURIエンコードする必要がありました。
リクエストのJSON変換について
PythonでJSON形式を扱うときは標準ライブラリのJSONモジュールを使います。
JSONモジュールを使用することで、JSON形式とPythonの辞書型を簡単に変換できます。
今回はPythonの辞書型からJSON形式へ変換するので、json.dumps関数を利用します。
実際のコードは下記のようになります。
import json payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'} payload = json.dumps(payload) #JSONパース print(payload)
実行すると下記のようにJSON形式で表示されます。
URIエンコードについて
次は、JSON形式のリクエスト部分をURIエンコードします。
PythonでURL関係を操作するときは、標準ライブラリのurllib.parseモジュールを使います。
今回はURIエンコードするのにurllib.parse.quote関数を利用します。
実際のコードは下記のようになります。
import json import urllib.parse payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'} payload = json.dumps(payload) #JSONパース payload = urllib.parse.quote(payload,safe = '') #URIエンコード print(payload)
urllib.parse.quote関数のオプションでデフォルトは「safe = ‘/’」となっていて、「/」はエンコードしないという意味です。
PhantomJS Cloudでは「/」もエンコードする必要があるので、今回はオプションで「/」をはずしています。
オプション有りと無しで実行した結果が下記となります。
オプション指定した上の方は「/」が「%2F」に変換されています。
PhantomJsCloudにHTTPリクエストする
PythonでHTTPリクエストするときには、requestsモジュールを使うと簡単にできます。
requestsモジュールは標準ライブラリではないので、インストールする必要があります。
詳細は下記の記事をご参照下さい。
PythonでGetリクエストをするときは、requests.get関数を利用します。
コードは下記のようになります。
import json import urllib.parse import requests payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'} payload = json.dumps(payload) #JSONパース payload = urllib.parse.quote(payload,safe = '') #URIエンコード key = '**-#####-*****-#####-*****-#####' url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload response = requests.get(url) #GETリクエスト print(response.text)
最後の行は結果を確認しています。
requests.get関数の戻り値のResponseオブジェクトからデータを取り出すときは下記のようにします。
内容はよく分かりませんが、GASで実行したときと同じように、データは取得できました。
まとめ
今回はPythonでPhantomJs Cloudを利用してWebページをスクレイピングしました。
GASと同じように色々な関数があるので、Pythonでも同じような書き方で実行できますね。
PhantomJs Cloudからのデータは取得できたので、次回は必要部分を抜き出すためにBeautiful Soupモジュールを使います。
お楽しみに!
連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング
Webスクレイピングしていて、値が取得できないということはありませんか?
そんな時は、Webサイトの表示にJavaScriptを利用しているからです。
本連載では、色々な言語でその対応をご紹介します!
- GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
- VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
- GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
- GASでPhantomJSを利用してWebページをスクレイピング
- GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
- PythonでPhantomJs Cloudを利用してWebページをスクレイピング
- PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析
コメント
Phantom JSは開発がストップしているので、今後はGoogle Chromeのレッドレスモードを使う方がいいですよ!
とくさんコメントありがとうございます。
PhantomJsCloudのホームページを確認したのですが、私のほうでは開発終了という情報を見つけることができませんでした。
よろしければ、どちらをご覧になられたか教えていただけないでしょうか?
Google Chromeのヘッドレスモードについては、情報ありがとうございます。
以降の記事として前向きに検討させていただきます。
Cloudではなく本体です!もちろん本体の開発が止まっている生で、cloudもどうなるかわからないです。。。
https://www.infoq.com/jp/news/2017/04/Phantomjs-future-uncertain
とくさん、返信ありがとうございます。
状況や情報を注視して、必要に応じて記事の対応を検討したいと思います。