ユーザープロフィール

ゲストさん

beautifulsoup4でWebスクレイピング | Raspberry Piを使ってPythonを学ぼう 第3回

beautifulsoup4でWebスクレイピング | Raspberry Piを使ってPythonを学ぼう 第3回

今回は前回に続いてPythonの扱い方をもう少し詳しく見ていき、実際にWebスクレイピングをしてみます。

Pythonには標準で多くのライブラリが使えるようになっています。これらはとても便利ですが、実際の要求はもっと多様です。Python Package Indexにはとてもたくさんのパッケージが登録されていて、当然無料で使えます。これらの多くは個人や企業が他の開発者も使えるように整備しているもので、サイズもメンテナンス状況も様々です。サードパーティパッケージをインストールするには pipコマンドを使います。

でパッケージ名を指定することでインストールできます。

仮想環境

pipコマンドでインストールしてきたパッケージはOSによって管理されている環境にインストールされます。そのためroot権限で実行することが必要でした。しかし、このままでは困った状況に陥ってしまいます。インストールしているパッケージの別のバージョンを使いたくなった場合です。例えば同一ホスト上に複数のプログラムを実行させたい時、それらのプログラムが要求するサードパーティパッケージのバージョンが異なっていたらどうでしょうか?両方のプログラムが要求するサードパーティパッケージを準備することができません。Pythonではvenvという仮想環境を作ることでそれを解決します。この仮想環境を使うと、仮想環境内にサードパーティパッケージをインストールできます。仮想環境は複数作成でき、切り替えて使うことが可能なため、先ほどの例のような状況に対応できます。

早速、作成してみましょう。

envというディレクトリが作成されます。仮想環境を有効化することをactivate、無効化することをdeactivateと言います。先ほど作成した仮想環境をactivateしてみましょう。

activateできるとプロンプトマークが変わります。この状態でpipを使ってインストールすると仮想環境内にパッケージがインストールされます。

仮想環境をdeactivateします。

deactivateできるとプロンプトマークが元にもどります。

これ以降は仮想環境内で作業するためactivateしておきます。

requestsのインストール

PythonにはHTTPリクエストを送信するための標準ライブラリ(urllibやhttp.client)がありますが、それらよりも簡単にリクエストを扱うためのサードパーティライブラリがあり、よく使われています。requestsです。requestsをinstallします。

pageを取得してみる

requestsはパッケージなのでimportして使います。requests.get()関数はGETのHTTPリクエストを送信します。取得したデータはres.contentでアクセスできます。

res.contentにはHTMLが保持されています。

注意点

スクリプトなどを使うと簡単にWebページを取得できます。たくさんのページを取得したくなりますが、やりすぎないでください。例えば取得するコードをループで回してしまうとすごい速度でページを取得してしまうことになるので、Webサーバや帯域に負荷をかけてしまいますWebサーバに負荷をかけることは攻撃と捉えられてしまいます。time.sleep()などを使って、負荷をかけないように必ず配慮してください。また実装中に実行するときに何度もリクエストを投げるのもあまり好ましくないので、取得したHTMLをファイルに書き出すなどして毎回ページを取得することは避けてください。requests-cacheというパッケージはrequestsで取得したレスポンスをキャッシュできるので、それらを活用すると良いでしょう。

必要なデータを抜き出す

先ほどはrequestsを用いてWebページを取得しました。次は取得したWebページの情報を抜き取ります。今回はbeautifulsoup4を使用します。 beautifulsoup4はHTMLを解析してタグの情報を操作するためのライブラリです。pipコマンドでインストールします。

次のようにするとHTMLを解析できます。

select()やselect_one()はCSSセレクタを指定することができます。ブラウザの開発者ツールのコンソールなどでちょうど良いCSSセレクタを探すと良いでしょう。

トイロハからトップページの見出しのタイトルを取得するには次にようなコードになります。

データを保持する

更新しているかどうかを確認するために現在の状況を残すように修正します。今回はタイトルの情報のハッシュ値をファイルに書き出すことにします。

h2_tag.encode_contents()でテキスト要素のバイト列を取得しています。hashlibはハッシュ計算用の標準ライブラリで、今回はmd5を使いました。hash_obj.hexdigest()でハッシュ値を計算して、それをエンコードしたのちにファイルに書き込んでいます。

更新が入ったらとりあえず標準出力に表示

現在の状態は保存できたので前回の状態との差分を確認して更新されていれば "UPDATED" と標準出力に表示してみるようにします。

あらかじめ、結果ファイルから読み込んで、old_hash_valuesにハッシュ値のリストを保持しておきます。

で現在処理中のタグのテキストのハッシュ値が前回のハッシュ値のリストに含まれているかを確認しています。含まれていない場合、更新されたと考えられますのでprint()関数で標準出力に "UPDATED" の文字列を表示しています。

まとめ

次の内容を学びました。

  • サードパーティパッケージのインストール方法
  • Pythonの仮想環境の使い方
  • Webからのデータ取得方法
  • ハッシュ値の計算方法

次回はこの結果を使ってRasberryPi上でLEDの制御を行います。

著者プロフィール:嶋田健志
フリーランスのWebエンジニア。
主に Python を用いて Webサイトやソフトウェア の開発を行っている。
共著書に 「Pythonエンジニア養成読本 (技術評論社) 」がある。

関連記事

RasberryPiにOSをインストール | Raspberry Piを使ってPythonを学ぼう 第1回
Python入門とライブラリの使い方 | Raspberry Piを使ってPythonを学ぼう 第2回
2016年の人気プログラム言語10種を徹底比較!気になる年収や求人、学習難易度まで
プログラマー年収ランキング2016!言語別、第1位はPythonの651万円
PythonのWebフレームワーク「Django」徹底解説!

PR_infeed

PR_Relative

オウンドメディア運営会社の皆様へ

s

ページトップ