PHPでHTMLスクレイピング(Windowsアプリ版)

(1/1)
PHPでDOMDocumentを使ってスクレイピング」では、ホームページからtitleタグとmeta name="description"タグの内容を取得するHTMLスクレイピングを紹介した。
残念ながら、DOMDocumentクラスはPHP5以上でないと利用できない。そこで、PHP4でも利用できるライブラリ「HTML Parser for PHP-4」を利用することにした。

サンプル・プログラム

PHPでHTMLスクレイピング

解説:スクレイピング

0086: /**
0087:  * スクレイピングの実行
0088:  * @param int $windowウィンドウID
0089:  * @return titleの内容
0090: */
0091: function execScraping($window) {
0092:     $url = wb_get_text(wb_get_control($window, IDC_URL_EDIT));
0093:     $html = @file_get_contents($url);
0094:     if ($html == FALSE || $html == '') {
0095:         put_error($windowERROR_NOCONTENTS);
0096:         return;
0097:     }
0098: 
0099:     //parsing
0100:     $parser = new HtmlParser(mb_convert_encoding($html, INTERNAL_ENCODING, 'auto'));
0101:     $title = $description = '';
0102:     $flag['title'] = $flag['description'] = FALSE;
0103:     while ($parser->parse()) {
0104:         //<title>
0105:         if (!$flag['title'] && (preg_match('/title/i', (string)$parser->iNodeName) == 1)) {
0106:             $parser->parse(); //読み進める
0107:             $title = (string)$parser->iNodeValue;
0108:             $flag['title'] = TRUE;
0109: 
0110:         //<meta name="description">
0111:         } else if (!$flag['description'] && (preg_match('/meta/i', $parser->iNodeName) > 0)) {
0112:             if ($parser->iNodeType == NODE_TYPE_ELEMENT) {
0113:                 $attrValues = $parser->iNodeAttributes;
0114:                 $attrNames = array_keys($attrValues);
0115:                 $size = count($attrNames);
0116:                 for ($i = 0; $i < $size$i++) {
0117:                     $name = $attrNames[$i];
0118:                     if ((preg_match('/name/i', $name) > 0) && (preg_match('/description/i', $attrValues[$name]) > 0)) {
0119:                         $name = $attrNames[$i + 1];
0120:                         if ((preg_match('/content/i', $name) > 0)) {
0121:                             $description = (string)$attrValues[$name];
0122:                         }
0123:                     }
0124:                 }
0125:             }
0126:         }
0127:     }
0128:     //表示
0129:     wb_set_text(wb_get_control($window, IDC_TITLE_EDIT), internal2sjis($title));
0130:     wb_set_text(wb_get_control($window, IDC_DESCRIPTION_EDIT), internal2sjis($description));
0131: }

まず、指定されたコンテンツを  file_get_contents  を使って読み込む。
次に、これをクラスライブラリ「HTML Parser for PHP-4」に渡す。このとき、内部エンコードに変換しておくこと。

この時点でHTMLのパーシングは行われており、あとはwhileループを回して、1つ1つの要素をチェックしていく。
タグ名は iNodeName に、タグの実体は iNodeValue に格納されている。また、属性値は1つ1つ分解され iNodeAttributes に格納されている。

コンパイル

コマンドラインから "bamcompile scrapingwin.bcp" を実行する。コンパイルが完了すると、"scrapingwin.exe" が生成される。"scrapingwin.exe" は、DLL不要で、単独で動作するEXEプログラムである。

参考サイト

(この項おわり)
header