PythonでPhantomJs Cloudを利用してWebページをスクレイピング

Python-and-PhantomJsCloud

みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第六弾です。

第四弾では「GASでPhantomJS Cloudを利用してWebページをスクレイピング」しました。

GASでPhantomJS Cloudを利用してWebページをスクレイピング
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はGoogle Apps ScriptとPhantomJS Cloudでスクレイピングします!

また、第二弾では「VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング」しました。 

VBAとGoogle Apps Scriptでスクレイピング出来れば、実務では事足りるもしれませんが、プログラムの世界ではPythonの人気が上がってきています。

非エンジニアのWindows派がPythonを始めるメリットをこれでもかと説明します
Pythonを学ぶことは、非エンジニアのプログラミング初心者、一般のビジネスマン、Windowsユーザーにとって有益です。今回はPythonとは何か?そしてそれを学ぶメリットについてお伝えしていきます。

そこで今回より、PythonでJavaScriptで動作するWebサイトをスクレイピングする方法を紹介します。

Pythonでスクレイピングする方法は別連載でもお伝えしていますので、併せて確認お願いします。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

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]);

}

今回のシリーズでは、沖縄県のダムの貯水率をスクレイピングで取得しています。

結果は下記のようになります。

phantomJS_最終ログ確認

これと同じ事をPythonでやってみます。

PhantomJsCloudにアクセスするURLの作成

PhantomJs CloudにアクセスするURLは下記のようになります。

http(s)://PhantomJsCloud.com/api/browser/v2/[YOUR-KEY]/?request=[REQUEST-JSON]

[YOUR-KEY]はApiKeyを、[REQUEST-JSON]にはスクレイピングしたいURL等のオプションを指定すればよかったですね。

また、[REQUEST-JSON]はJSON形式をURIエンコードする必要がありました。

リクエストのJSON変換について

PythonでJSON形式を扱うときは標準ライブラリのJSONモジュールを使います。

JSONモジュールを使用することで、JSON形式とPythonの辞書型を簡単に変換できます。

今回はPythonの辞書型からJSON形式へ変換するので、json.dumps関数を利用します。

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形式で表示されます。

Python_JOSN変換結果

URIエンコードについて

次は、JSON形式のリクエスト部分をURIエンコードします。

PythonでURL関係を操作するときは、標準ライブラリのurllib.parseモジュールを使います。

今回はURIエンコードするのにurllib.parse.quote関数を利用します。

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では「/」もエンコードする必要があるので、今回はオプションで「/」をはずしています。

オプション有りと無しで実行した結果が下記となります。

Python_URI変換結果

オプション指定した上の方は「/」が「%2F」に変換されています。

PhantomJsCloudにHTTPリクエストする

PythonでHTTPリクエストするときには、requestsモジュールを使うと簡単にできます。

requestsモジュールは標準ライブラリではないので、インストールする必要があります。

詳細は下記の記事をご参照下さい。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

PythonでGetリクエストをするときは、requests.get関数を利用します。

requests.get(URL)

コードは下記のようになります。

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オブジェクトからデータを取り出すときは下記のようにします。

Responseオブジェクト.text

Python_実行結果

内容はよく分かりませんが、GASで実行したときと同じように、データは取得できました。

まとめ

今回はPythonでPhantomJs Cloudを利用してWebページをスクレイピングしました。

GASと同じように色々な関数があるので、Pythonでも同じような書き方で実行できますね。

PhantomJs Cloudからのデータは取得できたので、次回は必要部分を抜き出すためにBeautiful Soupモジュールを使います。

PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 PythonとPhantomJsCloudでJavaScriptで動作するWebページをスクレイピングしたデータをBeautifulSoupを使って解析します。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
  6. PythonでPhantomJs Cloudを利用してWebページをスクレイピング
  7. PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析

コメント

  1. とく より:

    Phantom JSは開発がストップしているので、今後はGoogle Chromeのレッドレスモードを使う方がいいですよ!

    • うえはら より:

      とくさんコメントありがとうございます。
      PhantomJsCloudのホームページを確認したのですが、私のほうでは開発終了という情報を見つけることができませんでした。
      よろしければ、どちらをご覧になられたか教えていただけないでしょうか?

      Google Chromeのヘッドレスモードについては、情報ありがとうございます。
      以降の記事として前向きに検討させていただきます。

  2. とく2 より:

    Cloudではなく本体です!もちろん本体の開発が止まっている生で、cloudもどうなるかわからないです。。。

    https://www.infoq.com/jp/news/2017/04/Phantomjs-future-uncertain

    • うえはら より:

      とくさん、返信ありがとうございます。
      状況や情報を注視して、必要に応じて記事の対応を検討したいと思います。

タイトルとURLをコピーしました