エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法

      2020/02/08

PHPのスクレイピングのライブラリは「PHP Simple HTML DOM Parser」がオススメ

 

PHPのスクレイピングのライブラリは「PHP Simple HTML DOM Parser」

 
PHPでスクレイピングをするならば「PHP Simple HTML DOM Parser」がオススメです。
 
PHP Simple HTML DOM Parser
https://simplehtmldom.sourceforge.io/
 
ライブラリのダウンロードは下記の「Source Forge」から。
https://sourceforge.net/projects/simplehtmldom/files/
 
 
多くのサイトでは「phpQuery」が紹介されていますが、「PHP Simple HTML DOM Parser」を使うほうがいい理由も含めて「PHP Simple HTML DOM Parser」を紹介いたします。
 
 

「phpQuery」より「PHP Simple HTML DOM Parser」をオススメする理由

 

「phpQuery」に問題があると考える理由

 
まず、PHPでスクレイピングするために「PHP スクレイピング」と検索してみると、検索結果に表示される上位のページは「phpQuery」に関連する記事で埋め尽くされています。(2020年01月現在。)
 
そのため、PHPでスクレイピングをするなら「phpQuery」を使うことが一般的なんだな、と思うだろうと思います。
私もそう思いました。
 
 
phpQueryのダウンロードページ
https://code.google.com/archive/p/phpquery/downloads
 
ですが、いざ「phpQuery」を使うためにダウンロード先として提示してある上記のページに遷移してみると、気になることが出てきました。
「Uploaded」の日付が、最新の日付でも「2009年 5月」なのです。
 
10年以上前に開発されたライブラリが未だに使われているということは、10年前の時点ですでに完成されたライブラリだった、という考え方も可能だろうと思います。
しかし、ここ 10年間で発見されたセキュリティホールに対しては一切対応されていない状況でもあるわけです。
 
 
さて、10年以上も前に開発が止まったライブラリを使っても問題ないでしょうか??
 
 

「PHP Simple HTML DOM Parser」は継続的に開発が行われている

 
というわけで、PHPのスクレイピング関連ではほとんどが「phpQuery」の記事であるわけですが、その中で違うライブラリとして登場してくるのが「php-simple-html-dom-parser」なのです。
 
https://sourceforge.net/projects/simplehtmldom/files/simplehtmldom/
 
ライブラリ「php-simple-html-dom-parser」を配布している上記 URLを見てみると、現在(2020年01月)でも開発が行われているであろうことを感じることが出来ます。
 
 
https://github.com/Kub-AT/php-simple-html-dom-parser
 
また、上記の Githubで配布されている 2020年01月時点での最新安定版である「Version 1.9.1」では、「PHP 7.3 compatible」と書かれています。
 
これから新しくスクレイピングのライブラリをインストールするなら、「PHP Simple HTML DOM Parser」を選択すべきではないでしょうか??
 
 
また、「phpQuery」と「php-simple-html-dom-parser」を両方使ってみると分かりますが、基本的な使い方は大きな違いはありません。
 
さらに、「PHP Simple HTML DOM Parser」の方がより便利な使い方ができる関数も用意されているわけですので、「PHP Simple HTML DOM Parser」を選択しない理由がありません。
 
 
今回、こんな記事を書いていますが、実は、3年前に「PHP Simple HTML DOM Parser」に関する記事を書いていました。
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
 
「PHP Simple HTML DOM Parser」の使い方については触れていませんが、3年くらい前にスクレイピングをするツールを作った記憶がありますので、そのときに使い、記事を書いたのだと思います。
 
 

「PHP Simple HTML DOM Parser」の設置方法、使用方法

 
「PHP Simple HTML DOM Parser」の基本的な設置方法、および、使用方法を紹介します。
 
 

1.PHP Simple HTML DOM Parserをダウンロード

 
PHP Simple HTML DOM Parser
https://sourceforge.net/projects/simplehtmldom/files/
 
上記の URLにあるソースファイル一式をダウンロードします。
ダウンロードした zipファイルを展開し、「simple_html_dom.php」ファイルを取り出し、ライブラリを読み込むプログラムと同じ階層に配置します。
 
 

2.「simple_html_dom.php」ファイルを読み込み

 
「simple_html_dom.php」ファイルを PHPに読み込みます。
 

 
 

3.HTMLファイルをスクレイピング

 
HTMLのソースコードを取得し、スクレイピングする処理を記述します。
 

 
このサンプルでは、「body」タグを取得し、タグに含まれるテキストを表示する処理にしています。
 
「find(“body”,0)」の「find()」の 1つめのパラメーターが取得するタグの指定で、2つめのパラメータが 1つめのパラメーターで指定したタグの何番目のノード(項目)を取得するかを指定しています。(「0」は「1個目」を指定していることになります。)
 
 
2つめのパラメータが抜けている場合は、下記のエラーメッセージが表示されます。
 

 
 

4.全体のソースコード

 
1~3までのソースコードまとめると全体で下記のソースコードになります。
わずか 3行でスクレイピングが出来てしまっているわけです。
 

 
 

URLを指定してスクレイピングをする方法

 
先の例では、関数「str_get_html()」を使用し、パラメータとして HTMLのソースコードを指定しました。
 
ですが、「PHP Simple HTML DOM Parser」には、URLを指定して直接 HTMLのオブジェクトを生成する関数「file_get_html()」も用意されています。
この関数を使うと直接 URLを指定してオブジェクトを生成することが出来ます。
 

 
今回は、サンプルとして「東京都」の URLを指定しています。
 
 

「PHP Simple HTML DOM Parser」の「file_get_html()」を使う際のつまづきポイント

 
実は、「PHP Simple HTML DOM Parser」の「file_get_html()」を使う際には一つのつまづきポイントがあります。
 
サンプルとして「東京都」の URLを指定していますので、特にエラーが発生することなく正しい情報が取得できているのではないか、と思います。
 
ですが、「東京都」のサイトから変えて SSL化されている URLを指定すると下記のエラーが表示される場合があります。
ここでは、例として「https://www.yahoo.co.jp/」を指定しています。
 

 
1行目にエラーの原因が書かれていますが、SSL証明書が設定されていないためエラーとなっています。
 
SSL証明書がしっかり登録されているサーバであれば問題ありませんが、私のように XAMPPを使って実験しているような場合は対応が非常に難しくあります。
 
こうなる理由は、「simple_html_dom.php」の中を見てもらえば分かりますが、「file_get_contents()」でサイトにアクセスしているためです。
 
 

cURLで Webサイトにアクセスをして PHP Simple HTML DOM Parserを利用する方法

 
というわけで、関数「file_get_html()」に URLを指定してスクレイピングをするためのオブジェクトを生成する方法は、SSLに対応したサイトでは利用できませんので、何らかの対応を行う必要がありますが、そんなときに利用する方法として cURLがあります。
 
cURLを利用して HTMLを取得し、取得した HTMLを「str_get_html()」で処理をする、という方法です。
 

 
 
なぜ cURLを使う方がいいのか、また、上記の cURLの関数の解説などの cURLについて「PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較」の記事を書いていますので、合わせて確認をしてください。
 
 
また、「PHP Simple HTML DOM Parser」の詳しい使い方や、サイトによっては気をつける必要がある場面の解説などについて下記に記事を書きました。併せて確認をしてください。
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方
 
また、「PHP Simple HTML DOM Parser」を CakePHP3で使うときの設置方法については下記に記事を書きました。
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
 
 

スクレイピングとスキャルピング

 
プログラムとは関係ありませんが、いつも「スクレイピング」と「スキャルピング」とがごちゃごちゃになります。
どっちがどっちか、どうやって覚えたらいいでしょうか??
 
 
「スキャルピング」とは、FX(Foreign Exchange。外国為替証拠金取引。)や株式取引において、薄利の取引を短時間で数多く繰り返すトレーディング手法のことです。
「スキャルピング(scalping)」のもとの意味は「皮むき」で、りんごなどの皮をむくように薄い利益を取っていく手法であるためにこの名前が付いています。
 
また、スクレイピングは「scrape(スクレイプ、削る)」の「ing形」です。
「scrap(スクラップ、切れ端、小片、解体する)」とは関係がないようです。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Comment

  1. sonicpepe(:HN) より:

    初めまして。突然のメッセージ失礼いたします。

    現在、情報を集めるWebページを作り、自サイトの更新を簡単に使用と考えてスクレイピングを考えており、phpQueryでどうしても取得できず、こちらにたどり着き、simple html domでかつ、curlを利用したもので取得することができ必要な情報はechoで確認できている状態です。

    しかし、アクセスを海外からする必要がある場合があり、proxyをかませたいと考えているのですがgetApiDataCurl関数にproxyを入れることができず困っております。(curlは全く分かりません(泣))
    お時間がございましたら、教えていただければ幸いです。

    • エス技研 より:

      sonicpepe(:HN)さん、コメントありがとうございます。

      cURLでプロキシを経由してサイトにアクセスをする場合は、オプションとしてプロキシ接続の設定を追記します。

      オプション設定として「$option2」の配列として設定します。
      それを、「array_merge()」関数でマージします。

      もともとの「$option」配列に直接追記する方法でもかまいませんが、関数の中ですので、別配列として持ち、関数のパラメータなどで必要に応じて組み込むと言った方法がいいのではないかと思います。

      ただし、このソースは全く検証していませんので、その点はご了承ください。

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

ECCUBEの新規追加ページがInternal Server Error・Not Foundに

ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。

ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について

レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。

路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索

路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。

PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法

PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!

ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合

テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。

PHP range関数を使って階乗と重複組み合わせを計算

PHPの range関数を使って階乗と重複組み合わせを計算し、それを元に乱数発生器を作成しました。

ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。

指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い
指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い

文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。

QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ

CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。

ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定

Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。