猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

2021年 PHP 8 でスクレイピングするなら php-html-parser

f:id:yoshiki_utakata:20211228075735j:plain

phpQuery vs php-html-parser

以前、以下の記事を書きました。この記事では phpQuery というライブラリを使いましたが、phpQuery は3年以上更新が止まっており、最新の PHP に対応してないなど問題がありました。

www.utakata.work



別のライブラリを探していたら、 php-html-parser がかなり良かったので紹介します。

github.com

この記事で扱う 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" です。

f:id:yoshiki_utakata:20210511094808p:plain



コードは以下の通り。

<?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等対応 コンパクト 軽量 携帯 リモコン付き バックミラー付き ()



実際のコード全体はこちらのリポジトリから確認できます。

github.com

まとめ

phpQuery はメンテナンスがされておらず、PHP8 に対応していないので、PHP8 でスクレイピングするのであれば、php-html-parser を使いましょう。