PHPスパイダーを使ったウェブスクレイピング

正規表現を頻繁に書く必要がなく、特にHTMLの構造が不規則な場合は面倒です。ページの最小限の変動でも正規表現を再調整する必要があり、非常に煩わしい作業になります。

そこで、最初はスクレイピングライブラリを探しましたが、PHPで成熟したオープンソースプロジェクトはいくつかありました。

初めて試したのはphpQueryでしたが、jQueryのような機能を提供しており、時間を節約できると考えていました。しかし、これは6年前のプロジェクトで、元のプロジェクトはhttp://code.google.com/p/phpquery/ にあり、GitHubにもコピーされていましたが、メンテナンスされていませんでした。Composerでのインストールも必要であり、https://packagist.org には登録されていません。さらに多くの新しいプロジェクトはPHP7をベースにしているため、このライブラリは時代遅れとなっています。

その後、phpspiderというフレームワークを見つけました。注意点として、これはphp-spiderではなく、中国語のドキュメントがありますが、まだ完全ではありません: 公式ドキュメントGitHubリポジトリ

注意: このフレームワークはコマンドラインでのみ動作します。コマンドライン、コマンドライン、コマンドライン。重要なことは3回繰り返します ^\_^

しかし、Web上で実行したいと考え、test_requests.phpを見つけて、CSSセレクタを使用して正規表現を書かずにデータを抽出できることがわかりました。

Web上で直接実行可能です。

use phpspider\core\requests;
use phpspider\core\selector;

// データ取得と処理
$html = requests::get('http://www.ccmn.cn/');
$data = selector::select($html, "#40288092327140f601327141c0560001", "css");
$dataRows = selector::select($data, "tr", "css");
array_shift($dataRows);

$resultArray = [];
if (!empty($dataRows) && is_array($dataRows)) {
    foreach ($dataRows as &$row) {
        $rowData = selector::select($row, "td", "css");
        foreach ($rowData as &$cell) {
            $cell = str_replace('
', '', $cell);
            $cell = str_replace(["\r\n", "\r", "\n"], "", $cell);
            $cell = trim($cell);
        }
        $rowData[3] = selector::select($rowData[3], "font", "css");
        unset($rowData[6]);
        $resultArray[] = $rowData;
    }
}

これで、比較的複雑なウェブページからの特定の位置のデータを取得できました。

簡単ですね。

公式ドキュメントでは、より強力なCSSセレクタがサポートされており、基本的なものは十分です: セレクタドキュメント

jQueryのような感覚で書けます。

なお、これはCLIでの実行ですが、以下のコメントを削除しないでください。

/* Do NOT delete this comment */
/* このコメントを削除しないでください */

これらのコメントが削除されるとエラーが発生します。

if (!preg_match("#/\* Do NOT delete this comment \*/#", $content) || !preg_match("#/\* このコメントを削除しないでください \*/#", $content)) {
    $msg = "不明なエラー...";
    log::error($msg);
    exit;
}

少し執着家のような気配があります。

ソースコードはまだ読んでいませんが、読む価値があります。

現在、他の機能についてはブログに記載しています。

タグ: PHP webscraping phpspider css-selector

5月26日 02:57 投稿