Webからたくさんの情報を集めようとした時に、Webスクレイピングはとても強力なツールです。サンプルコードとともに、PHPで簡単にスクレイピングする方法をご紹介します。
Webコンテンツを自動的に収集・解析し、必要なコンテンツを取得するプログラム、またはその行為のことを差します。クローリングと似ていますが、クローリングは前者のコンテンツを自動的に収集する部分が該当し、スクレイピング は解析して必要なコンテンツを取得することに重きがありつつ、クローリングの概念も包含しています。
phpQueryはPHP5で書かれ、jQuery JavaScript Libraryをベースにした、サーバーサイドのDOM API・ライブラリです。
今回はphpQueryを使って「銀座の寿司」ランキングを取得してみます。
Githubから以下のファイル、ディレクトリ一式をダウンロードします。
・phpQuery.php
・phpQuery のディレクトリ一式
1 2 3 4 5 |
#$objはphpQueryのインスタンスです #.target-classというCSSセレクタ内にあるテキストを取得します pq($obj)->find('.target-class')->text()) #findは繰り返して指定することもできます pq($obj)->find('.target-class')->find('h3')->text()) |
1 2 3 |
#$objはphpQueryのインスタンスです #.target-classというCSSセレクタ内にあるaタグのURLを取得します pq($obj)->find('.tarbet-class')->find('a')->attr('href') |
1 2 3 |
#$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!