正規表現を頻繁に書く必要がなく、特に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;
}
少し執着家のような気配があります。
ソースコードはまだ読んでいませんが、読む価値があります。
現在、他の機能についてはブログに記載しています。