KUHAKU
no
MEMOCHO

PHPで簡単にスクレイピングして取得したデータをCSVに保存する方法

PHPで簡単にスクレイピングして取得したデータをCSVに保存する方法のサムネイル

今回はワードプレスから少し外れて一時期没頭していたWEBスクレイピングについて書いていきたいと思います。

PHPを始めたての頃はこれが楽しくてしょうがなく、意味もなく企業情報データを収集したり、全国の飲食店や美容室のデータを集めまくっていました。笑

スクレイピングを応用したクローラー等を作成すると非常に効率よく欲しいデータを収集できるのでとても便利です。

WEBスクレイピングとは

まず、PHPを始めたての方や非IT業界の方には聞きなれないスクレイピングという言葉ですが、IT用語辞典では以下のように説明されています。

Webスクレイピングとは、WebサイトからWebページのHTMLデータを収集して、特定のデータを抽出、整形し直すことである。

Webスクレイピングを行うことで、Webページを対象として、あたかもWeb APIを利用しているかのようにデータを効率的に取得・収集することが可能になる。用途の例としては、部分的にコンテンツを取り出して携帯電話向けのコンテンツを生成したり、小見出しの一覧を生成したり、といった使い方あある。Webスクレイピングは様々な手段で実現可能であるが、PHPやPerlといったスクリプト言語を使用して行われることが多い。

なお、「スクレイピング」(scraping)とは元々「削る」や「こすり落とす」といった意味の英語である。

つまり、私たちが普段見ているwebページから欲しいデータを取得し、使用しやすいように再生成する技術のことをWEBスクレイピングといいます。

例えば現在800を超える全ポケモンの名前やタイプのデータが欲しいとき、Wikipediaなどで調べればすぐ出てきますが、それらをデータとして扱いたい場合、一つ一つを書き写すのには膨大な時間がかかってしまいますが、スクレイピングを行えば本の数秒でWikipedia上の情報を自分の好きなデータ型にして保存することができます。

これを応用すればサイトにあるリンクをたどってGoogleのようにWEBサイトをBot的にクローリングして情報を収集することも可能です。

ただし、サイトによっては掲載している情報に著作権などが掛かっている場合がありますので注意しましょう。

phpQueryのダウンロード

今回はより簡単にスクレイピングを行うためにphpQueryというphpライブラリを使用したいと思います。

phpQueryはphpでHTMLをDOM的に操作できるようになるライブラリで、使用方法はjQueryと似たような使用方法になります。

Google Code Archive

上記リンクからphpQuery-(バージョン名)-onefile.zipをクリックするとダウンロードが始まるので、ダウンロード終了後zipファイルを解凍します。

解凍したフォルダの中からphpQuery-onefile.phpというファイルを探して任意のディレクトリに配置します。

スクレイピングプログラムを記述する

ライブラリの準備ができたら実際にスクレイピングを行うためのプログラムを記述していきます。

今回はヤフーファイナンスのFXのレート一覧ページから通貨ペアの名前とBid値、Ask値を取得してCSVデータとして保存するプログラムを元に説明していこうと思います。

上記コードが実際に通貨ペアなどを取得してCSVに保存するプログラムになります。

テータ取得からCSVに保存する処理に関しては14行目以降に関数化して記述しています。

では関数getData()の中身を実際に解説していきます。

まず17行目ではダウンロードして配置したphpQuery-onefile.phpを使用できるように読み込みをしています。
実際に使用される際はphpQuery-onefile.phpを配置したファイルパスを記入してください。

そのあと、20~24行目でurlからhtmlを取得し、dom解析用のオブジェクトを生成する処理を記載しています。

27、28行目では実際に保存するファイル名とディレクトリを指定しています。
今回はプログラムのphpファイルと同一階層にdataという名前のフォルダを作成し、その中にfxlate.csvという名前で保存するように記述しています。

33行目からはCSSのクラス「inner」が付与されているulを基準にぶん回しています。

どの項目を基準にするはデータ取得をしたいページのソースコードを見るか、グーグルクロームの検証機能を使用すると判別しやすいと思います。

ここでは、jQueryで使用するのと同じような指定ができるので、例えばaタグを基に処理を反復したければ下記に様な記述になります。

39行目では、クラス「inner」以下のHTMLデータを$ttに格納しています。
これをすることにより、まるでjQueryのようなdom操作が可能になります。

42~44行目で実際にデータを取得して変数に格納しています。

ここではテキストデータを取得しているためtext()を使用していますが、aタグのリンク先などを取得する際はattr(‘href’)を使用すればhref属性の中身を取得できます。

使用方法はjQueryとほぼ同じと考えてもらって大丈夫です。

47~54行目では取得したデータを連想配列にしていく処理を記述しています。

最後の63~65行目で先程作成した$filenameにfputcsvを使用して作成した連想配列をCSVデータとして保存しています。

fputcsvは配列のデータをCSVデータで正常に使用できるようにフォーマットしてく指定ファイルに保存してくれる関数になります。

例えば、取得したデータにカンマが入ってしまっている場合、そのままCSVに出力すると思ったように保存できないことがありますが、fputcsvを使用するとCSVで正常に使用できるようにフォーマットしてくれるので値によって不具合が起きることは有りません。

詳しくは関数リファレンスをご参照ください。

PHP: fputcsv - Manual
php.net

上記プログラムが完成したらfxrate_scrap.php等の名前で保存をしましょう。

プログラムを実行する

プログラムの保存ができたらコマンドラインからプログラムを実行していきます。

コマンドプロンプトやターミナル等のコマンドラインで以下のように入力してEnterを押しましょう。

すると実行結果が以下のように表示され、プログラムの実行が完了します。

これでdataフォルダ内にfixate.csvというファイルが作成されました。

中身を見てみるとしっかり取得したデータが入っています。

今回はCSVで説明をしましたがもちろん取得したデータをデータベースに保存することもJSON形式で保存することも可能です。

WEBスクレイピングを上手に使用すると様々なデータ取得が簡単にでき、かつデータを活用したプログラムも組みやすくなりますので技術的に覚えておくのはおすすめです。

ただし、プログラムを実行する際に、あまりに高速でスクレイピングを行ってしまうと相手サーバーに負荷を与えるだけでなく、アクセス拒否をされてしまう可能性があるので、URLを再帰的にスクレイピングする際はsleep()等を使用して3秒ごとに処理を実行するように制御したほうがいいです。

以上、PHPでの簡単なWEBスクレイピングの方法とスクレイピングしたデータをCSV保存する方法のご紹介でした。

PHPのスクレイピングは初心者の方でも簡単にできるプログラムらしいプログラムなのでやってみたいなと思った方は是非チャレンジしてみてください。

FB Comment