Webページのデータを取ってくる(スクレイピング)

Webページのデータを取ってくる(スクレイピング) – メディアデザイン実習J

スクレイピングとは?

APIを使ったデータ取得の場合
・JSONなどのプログラムで扱いやすいデータが返ってくる
・サービス提供者が、APIを公開してくれている必要がある

スクレイピングする場合
・WebページからHTMLデータをそのまま取ってくる
・APIが公開されていなくても、サイトさえあれば無理矢理データを取ってこれる
・ただしユーザー認証が必要なサイトは工夫が必要

 

単純なページ取得

file_get_contents関数でファイルやURLのデータを取得

 

スクレイピングライブラリ

ライブラリとは、言語標準の関数では実現できない機能を、様々な人が様々なプロジェクト・プログラムで利用しやすいように、ひとかたまりにして配布されているプログラムコードのことです。

スクレイピングするためのライブラリ
・PHP Simple HTML DOM Parser
・Goutte
・phpQuery
いくつかありますが、古くからあって更新もされている「PHP Simple HTML DOM Parser」を選択するのがベストプラクティスだと思います。

PHP Simple HTML DOM Parser
ダウンロード
概要
解説ページ(日本語)

 

PHP Simple HTML DOM Parser の利用

スクリーンショット 2016-06-16 14.14.15

上記は商用サイトのHTMLソースコードであるが、「PHP Simple HTML DOM Parser」によって、HTMLタグをjQuery的に抽出していくことができる。

 

file_get_contents() ではなく、このライブラリ独自の関数 file_get_html() を使用する

コードの実行結果↓

スクリーンショット 2016-06-16 16.29.01

 

find()というのも、PHP標準の関数ではなく、Simple HTML DOM Parser独自のオブジェクトメソッド。

変数$htmlは、オブジェクト。
(Simple HTML DOM Parserクラスのオブジェクトインスタンス)
オブジェクトは、その内部にメソッドを持つ(定義されている)。
なので、オブジェクトのメソッドを使用する際は、
「オブジェクト->メソッド()」と表記する。

PHPは、中途半端なオブジェクト指向プログラミング言語なので、主語=オブジェクトのあるコード・ないコードが混在します。

 

実用的に絞り込む

ニュース欄のニュースを複数取得する

 

スクリーンショット 2016-06-16 16.03.42

 

アイデア

・Amazonのランキングを保存しつづけて、推移がわかるようにする
・いろいろなサイトのニュースを取得して、スポーツ新聞のようなレイアウトのCSSで表示し直す
・Steamのサイトからセール情報をチェックし続けて、新しいセールが始まったらメールを送信する
などなど…

 

注意点

スクレイピング処理は、言うまでもなく、相手方のサーバーからデータを取得します。
アクセス頻度によっては、相手方のサーバーに負荷をかける事になります。

このため、上記のような単純な作りだと、ユーザーがこのページにアクセスするたびに、自分のサーバーから相手方のサーバーにアクセスしてしまうことになります。
1分間に100人がこのサイトを使用したら、自分のサーバーから相手方のサーバーに1分あたり100アクセスしたことになって、明らかに不審なアクセス数です。
もしこのようなことで相手方のサーバーを停止させるようなことがあれば、不正アクセスの罪に問われかねません(不正な攻撃プログラムを開発・公開・利用幇助した)。

 

実際に2010年、脆弱なシステム環境で運用されていた図書館のサイト(サーバー)から、書籍データを取得するプログラムを作った人が逮捕されるという事件が起こりました。
岡崎市立中央図書館事件 – Wikipedia
※この事件は捜査関係者にIT知識が乏しかったせいで起きた不当な逮捕・勾留であると一般に考えられています。

 

このような意図せざる迷惑行為や無用の誤解を避けるためには、キャッシュの仕組みを利用します。
スクレイピング処理を公開サイトのコードに書くのではなく、1時間に1回管理者のみによって動作させる専用のコードを用意しておき、自分のサーバー上にキャッシュデータを生成しておきます。
サイトにアクセスするユーザーには、そのキャッシュデータを表示するようにします。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です