phpQuery vs php-html-parser
以前、以下の記事を書きました。この記事では phpQuery というライブラリを使いましたが、phpQuery は3年以上更新が止まっており、最新の PHP に対応してないなど問題がありました。
別のライブラリを探していたら、 php-html-parser がかなり良かったので紹介します。
この記事で扱う PHP のバージョン
今回、 PHP のバージョンは 8.0 を使っていますが、7.4 とか、7系でも問題なく動くと思います。
$ php -v PHP 8.0.0 (cli) (built: Nov 30 2020 13:43:08) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
php-html-parser をインストール
composer を使って php-html-parser をインストールします(composer の使い方については省略します。 PHP を使うなら composer は知っておいたほうが良いです)。
下記コマンドでインストールします。
$ composer require paquettg/php-html-parser
実際に使ってみる
Amazon のページから、商品名をとってみます。
商品名が書いてある dom は id="productTitle"
です。
コードは以下の通り。
<?php require_once __DIR__ . '/vendor/autoload.php'; use PHPHtmlParser\Dom; use PHPHtmlParser\Options; // 文字コードを設定する。 // 日本語だと文字コードの自動解析がうまく動かないようなので、 // ページに合わせて設定する必要があります $options = new Options(); $options->setEnforceEncoding('utf8'); // 文字化けする場合は Shift JIS を試してみてください // $options->setEnforceEncoding('sjis'); // ページを解析 $url = 'https://www.amazon.co.jp/gp/product/B07QNJDLGR'; $dom = new Dom(); $dom->loadFromUrl($url, $options); // 商品名を取得 $element = $dom->find('#productTitle'); echo $element->text . "\n";
簡単に取得することができます。
$ php scraper.php 【最新版】自撮り棒 iphone Android セルカ棒 Bluetooth 無線 シャッターボタン付き 360度回転 スマホ セルカ棒 三脚/一脚兼用 小型 iphone6 s/iphone7/iphone8/iphone8 plus/iphone x/xs/max等対応 コンパクト 軽量 携帯 リモコン付き バックミラー付き (黒)
実際のコード全体はこちらのリポジトリから確認できます。
まとめ
phpQuery はメンテナンスがされておらず、PHP8 に対応していないので、PHP8 でスクレイピングするのであれば、php-html-parser を使いましょう。