Electron×Pythonで天気予報スクレイピング

AMDlabの秋山です。
Electron講座2回目、本日は「ElectronとPythonを使ってウェブサイトからHtmlをスクレイピングをしていこう」です。

Electronに日々触れていると、せっかくならpythonを使ってなにか作れるのではと考えるようになりました。
python×Electronは日本語、英語でも情報がなかなか見つからず作成に苦労したので、皆さんに共有していきたいと思います。

前回の投稿でElectronのインストール方法から、helloworld表示、パッケージング化までひと通り説明しましたが
無事できましたでしょうか?不明な点、記載ミス等ございましたら、遠慮なくコメントください。
では早速、今回の成果物をはじめにお見せいたします。

海外のサイトで似たようなものがありますが、ウェブサイトのリンク切れやElectronのバージョンがV5以降になるとnode.jsの機能がうまく使えず
問題が出てきましたので改善を加え解説していきます。

■目次

  • 1. Electronインストール
  • 2. 必要なパッケージをインストール
  • 3. Html・CSS作成
  • 4. Javascript作成
  • 5. Python作成

1.Electronインストール

前回の記事をご覧ください
コマンドラインでフォルダ名:WeatherForestを作成します。
以下が今回のフォルダ構造になります。

2.必要なパッケージをインストール

webスクレイピングを行うためコマンドライン上で必要なモジュールを含むパッケージを下記コマンドでインストールします。
ウェブスクレイピングwiki
とはウェブサイトから欲しい情報を取得することです。
requestsを使ってウェブサイトからhtmlを取得し、beautifulsoupを使いhtmlを解析し抽出するという流れになります。

  1. requests (ウェブサイトの情報取得や画像収集を行います)
  2. beautifulsoup4 (htmlやxmlからの希望のテキストデータを抽出します)
  3. python-shell (Node.jsからPythonのコードやファイルを実行します)

3.Html・CSS作成

レイアウトを作成します。html,cssを使って自由に作成していきましょう。
以下がレイアウトのサンプルです。
1.ホーム画面

2.WeatherForcast画面

※テンプレートを使用しておりますので余分なクラスが入っております。

5.Javascript作成

注1)Node.jsにおけるrequireは、npmで読み込んだモジュールに対してJavaScript側で利用できるようにするためのメソッドになりますが、electronのバージョンがv5以上の場合requireが使用できず、requie is not definedとエラーが出て先に進めません。
nodeIntegration: true を追記しましょう。

6.Python作成

  1. requestsをインポートします。
  2. bs4(beautifulsoup4の略)からbeautifulsoupをインポートします。(bsに省略します)
  3. sysをインポートします。(sysは標準ライブラリですのでpipインストールする必要はありません。)
  4. コマンド実行時に与えられた引数の 1 番目を city という変数に渡します。
    (コマンド実行時に何も与えられていない場合sys.argv[0]となります)
  5. def 関数名()でget_weather関数を定義します。
  6. urlにはスクレイピングしたいurlを持ってきます。
    注1)placeにはユーザーが入力する地域が置換されるためurlの構造に地名が入ってる必要があります。
    注2)  ウェブサイトによっては、無許可のスクレイピングを禁止しているところがありますので、各サイトの注意事項をしっかり読んだうえで行ってください。
    ①    シンプルに今日の天気だけを抽出します


②  ウェブサイトのHTML (web上でctrl + u or F12で表示されます)

7.requestsで使われるメソッドには何種類かありますが、サーバーから情報を取得するget()メソッドを使用しresponseオブジェクト(r)を返します。
8.  responseオブジェクトには様々な属性値がありますが、今回はレスポンスのテキストtxtではなくバイナリデータcontentを取得していきます。
注3)ウェブサイトの文字コードによっては取得時に文字化けをすることがあります。その対処法としてr.content, ‘html.parser’がよく使われております。
9. ①、②の情報から取得したいテキストを探し出し、findall()メソッドを使用しマッチするすべての部分文字列をリストにして返します。
以上がウェブサイトから取得したいhtmlデータをスクレイピングする方法になります。

いかがでしたでしょうか?
今回はpython×Electonがメインでしたので、アプリケーション画面のhtml・css・javascriptに関する詳しい説明を省きましたが、
どこかでフロントエンド側の記事も書いていきたいと思います。

ARTICLES