Webからたくさんの情報を集めようとした時に、Webスクレイピングはとても強力なツールです。サンプルコードとともに、PHPで簡単にスクレイピングする方法をご紹介します。
Webスクレイピングとは
Webコンテンツを自動的に収集・解析し、必要なコンテンツを取得するプログラム、またはその行為のことを差します。クローリングと似ていますが、クローリングは前者のコンテンツを自動的に収集する部分が該当し、スクレイピング は解析して必要なコンテンツを取得することに重きがありつつ、クローリングの概念も包含しています。
phpQueryとは
phpQueryはPHP5で書かれ、jQuery JavaScript Libraryをベースにした、サーバーサイドのDOM API・ライブラリです。 今回はphpQueryを使って「銀座の寿司」ランキングを取得してみます。
ライブラリをダウンロードする
Github から以下のファイル、ディレクトリ一式をダウンロードします。 ・phpQuery.php ・phpQuery のディレクトリ一式
基本的な使い方
テキストを取得したい
#$objはphpQueryのインスタンスです
#.target-classというCSSセレクタ内にあるテキストを取得します
pq ( $ obj ) -> find ( '.target-class' ) -> text ( ) )
#findは繰り返して指定することもできます
pq ( $ obj ) -> find ( '.target-class' ) -> find ( 'h3' ) -> text ( ) )
URLを取得したい
#$objはphpQueryのインスタンスです
#.target-classというCSSセレクタ内にあるaタグのURLを取得します
pq ( $ obj ) -> find ( '.tarbet-class' ) -> find ( 'a' ) -> attr ( 'href' )
画像パスを取得したい
#$objはphpQueryのインスタンスです
#.target-classというCSSセレクタ内にあるimgのパス(src)を取得します
pq ( $ obj ) -> find ( '.target-class' ) -> find ( 'img' ) -> attr ( 'src' )
サンプルコード
食べログさんの銀座寿司ランキングのページへアクセスし、上位20位の情報を取得・画面表示するプログラムです。 私はpg関数の扱いが最初わからずはまってしまいましたが、pgを使わないと情報を取得できませんので、魔法の言葉だと思って使いましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
< ? php
require_once ( 'phpQuery.php' ) ;
class Scraping {
function __construct ( ) {
$ this -> target_url = "https://tabelog.com/sushi/tokyo/A1301/A130101/rank/" ;
}
function getData ( ) {
$ html = file_get_contents ( $ this -> target_url ) ;
return $ this -> getContents ( $ html ) ;
}
function getContents ( $ html ) {
// DOMオブジェクトを取得
$ dom = phpQuery :: newDocument ( $ html , "text/html" ) ;
//食べログで「銀座 寿司」のTOP20位の情報を取得
for ( $ i = 1 ; $ i <= 20 ; $ i ++ ) {
//取得するCSSセレクタが順位によってカウントアップするのでforループで対応
$ format = 'li.rank' . "%d" ;
$ content_path = sprintf ( $ format , $ i ) ;
//取得したいCSSセレクタを$domのキーにセット
$ row = $ dom [ $ content_path ] ;
//見出しh3を取得
$ values [ $ i ] [ "headline" ] = trim ( pq ( $ row ) -> find ( 'h3.mname' ) -> text ( ) ) ;
//店舗名だけを取得
$ values [ $ i ] [ "shopname" ] = trim ( pq ( $ row ) -> find ( 'h3.mname' ) -> find ( 'strong' ) -> text ( ) ) ;
//スコアを取得
$ values [ $ i ] [ "score" ] = trim ( pq ( $ row ) -> find ( 'p.score-overall.clearfix em' ) -> text ( ) ) ;
}
return $ values ;
}
}
$ obj = new Scraping ( ) ;
//上位20位を画面出力
print_r ( $ obj -> getData ( ) ) ;
注意点
スクレイピングを行う時には、取得したいサイトの利用規約を確認しましょう。明示的にスクレイピングを禁止しているサイトがあるので、そういったサイトでは別途提供されているAPIを使うなどルールを守って便利な技術を使いましょう。 利用規約に明記されていない場合でも、サーバーに負荷をかけないよう短時間でアクセスしないようにしましょう。 こちらのサイト に詳しくまとめられているので参考にしてください。
スクレイピングを利用規約で禁止しているサイト例
・Amazon ・Facebook ・Instagram ・Twitter ・Yahooファイナンス
まとめ
プログラミング自体はサンプルコードを使って簡単にできると思います。一方で、取得したいコンテンツのCSSセレクタを見つけたり、設定する方が手間かもしれませんが、一度設定すれば効率的に情報を集めることができます。ルールを守ってスクレイピングを行いましょう。それでは、Have a gentle internet life!