はじめに
PHPではすっかり定番となった感がありますが、「Simple HTML DOM Parser」で スクレイピングを行ってみます。 「Simple HTML DOM Parser」は、HTMLを解析してDOM形式で取得できて、jQueryみたいな感覚で、気軽にデータを抽出出来ます。
今回は、URLのリストのファイルから、スクレイピングして、その結果をCSVファイルに出力するという一連の処理を行ってみます。 なお、くれぐれも悪用禁止です。
※DOM形式(Document Object Model)について知らない人は、以下でイメージをささっと掴みましょう。 http://piyo-js.com/05/dom.html
使い方
大まかな処理のイメージは以下の様な感じです。
スクレイピングしたいURLが記載されているファイル(read_url.txt)を用意します。
//read_url.txt http://www.yahoo.co.jp/ http://www.livedoor.com/ //ダブルスラッシュでコメントも付けれます http://www.hatena.ne.jp/
こちらが一行ずつスクレイピングされます。
コードは以下です。
//index.php <?php include "simple_html_dom.php"; echo "処理開始\n"; //結果配列(2次元配列) $data =array(); //読み込みファイルの行カウンター $count = 0; //ファイルの読み込み $fp = fopen('read_url.txt', 'r'); //SJISにエンコード $header = array(mb_convert_encoding('企業名', "SJIS-win", "UTF-8"), mb_convert_encoding('公式サイト', "SJIS-win", "UTF-8")); array_push($data, $header); if ($fp) { //ファイルをロック if (flock($fp, LOCK_SH)) { //EOFまで繰り返す while (!feof($fp)) { //カウンターをインクリメント $count++; echo $count. "行目を処理\n"; $line_url = fgets($fp); //先頭行が//の場合、コメントのため読み飛ばし if (substr($line_url, 0,2) == "//") { continue; } //スクレイピング scrapingHtml($line_url, $data); } flock($fp, LOCK_UN); } else { echo "ファイルロックに失敗しました"; } } fclose($fp); //結果ファイルに出力 $file = fopen("result.csv", "w"); foreach ($data as $line) { fputcsv($file, $line); } fclose($file); echo '正常終了'; //HTMLをスクレイピング //注意:$dataは参照渡し function scrapingHtml($read_url, &$data) { //出力内容を保持する二次元配列 //$result_data = array(); //$html = file_get_html('http://www.jpubb.com/listnl/list.php?listed=2&ind=%E6%83%85%E5%A0%B1%E3%83%BB%E9%80%9A%E4%BF%A1'); $html = file_get_html($read_url); foreach ($html->find('table[class=corpTable] tr') as $element) { //会社名を取得 $name = $element->find('td[class=name]', 0)->plaintext; //会社名がブランクの場合、読み飛ばし if (empty($name)) { continue; } //公式サイトを取得 $url = $element->find('td[class=other] a', 2)->href; $company = array(mb_convert_encoding($name, "SJIS-win", "UTF-8"), mb_convert_encoding($url, "SJIS-win", "UTF-8")); array_push($data, $company); } //return $result_data; }
CSVで出力したいので、抽出結果を2次元配列で保持します。
$html = file_get_html($read_url);
で、DOMのオブジェクトを返すので、そちらをもとに、
$html->find('table[class=corpTable] tr')
でtable要素のclass名cropTableのtrを取得するという、指示になっています。 この部分は、取得したいサイトによって色々変えてみてください。
リンク
http://www.crystal-creation.com/web-app/tech/programming/php/library/simplehtmldom/