PHPでスクレイピング!何を使えばいい? - inokawablog

PHPでスクレイピング!何を使えばいい?

PHPでスクレイピングを行う場合に、以下の選択肢があります。

状況やプロジェクトによりますが、seleniumpantherを使うと思います。PHPでスクレイピングをするには他にもたくさん選択肢があるので、今回はそれぞれについて説明していきます。

  • phpQuery
  • selenium
  • Goutte
  • PuPHPeteer
  • panther
  • Dusk(Laravel)

phpQuery

phpQueryはDOM操作をjQuery風に行うことができます。

zipでインストールするかと思っていましたが、composerも使えるらしいです。

$ composer require electrolinux/phpquery

あまりjQueryライクにかけることがメリットかわからないので、触ってはいません。

参考

selenium

seleniumもテスト自動化などによく使われています。Selenium自体はJavaでできています。

ブラウザごとのドライバーをインストールする必要があります。

facebook-webdriver + ブラウザのドライバ(今回はSelenium Google Chrome Driver) + Selenium Server Standalone

の組み合わせで使用します。

facebook-webdriverはFacebookが作成したPHP Webdriverです。php-webdriverのAPIドキュメント

Selenium Serverはリクエストを受け取ったら適切なブラウザのドライバを起動して、ブラウザのドライバにリクエストを行います。

ブラウザのドライバダウンロードページ一覧

少々セットアップが面倒ですが、記事数も多いですし、一番汎用性が高いです。一番無難に使用できるのでseleniumを使った方が良いと思います。

参考

Goutte

こちらは記事がたくさんあるので、詰まることはほとんどないと思います。

$ composer require fabpot/goutte

しかし動的ページを操作することができないので、動的ページが多い昨今ではあまり使えないかもしれません。

参考

PuPHPeteer

PHPからNodeリソースを管理しており、puppeteerをPHPで使えるようにしたライブラリ。開発はあまり頻繁には行われていないようです。

puppeteer自体ははHeadless Chrome使うのを便利にするNodeライブラリで、Chrome DevToolsのチームが開発しています。

私はnode.jsで自動化させる必要がある場合は毎回puppeteerを使用しています。とても使いやすいですし、Selenium Webdriverと違いヘッドレスブラウザを使うことができるので、高速に動作させることができます。

Chrome DevToolsのチームが開発しているということもあり、Chromeのブラウザしか操作することができません。

githubのスターも59.3kととても多く、その使いやすさと開発の手厚さがわかります。

さて、PuPHPeteerですが、puppeteerとのブリッジということもあり、Chrome限定になってします。さらに日本語の記事がとても少ないです。

puppeteerに慣れていればすんなり始めることができると思うので、puppeteerを普段使っていれば有力な選択肢にはなると思います。

参考

laradockでpuppeteer
Puphpeteer: A Puppeteer bridge for PHP

Panther

Pantherは、実際のブラウザーを使用してエンドツーエンドのテストを実行するための便利なスタンドアロンライブラリです。アプリケーションのテストに必要なすべての機能が含まれているので、すべてのPHPプロジェクトで使用できます。
$ composer req --dev symfony/panther

SymfonyBrowserKitおよびDomCrawlerコンポーネントを実装しています。
なので、Symfonyアプリの機能テストを作成したことがある場合はすぐに同じように書くことができます。

特徴

  • Webページに含まれるJavaScriptコードを実行します
  • Chrome(またはFirefox)が実装するすべてをサポートします
  • スクリーンショットを取ることができます
  • 非同期にロードされた要素が現れるのを待つことができます
  • ロードされたページのコンテキストで独自のJSコードまたはXPathクエリを実行できます
  • カスタムSeleniumサーバーのインストールをサポート
  • SauceLabsやBrowserStackなどのリモートブラウザテストサービスをサポート

使い勝手がとてもいいのでたまに使用しますが、なんせ日本語の記事が全くないので、詰まったら結構時間を食われてします。しかし環境に依存しないという点はとても素晴らしいので使ってみるのも良いと思います。

参考

Laravelの場合

Dusk

Facebook php-webdriverのラッパー。
DuskはスタンドアローンのChromeDriverを使用しいるため、JDKやSeleniumのインストールする必要はありません。上記のseleniumを使うまでの一連の流れが全て終了しているような感じのものです。

今まで使ったスクレイピングのライブラリの中ではかなり使いやすい方です。

しかしここで一つ注意したいのが、本番では使ってはいけないということ。

本番環境にDuskをインストールしてはいけません。
インストールすると、アプリケーションに対する未認証でのアクセスを許すようになります。

つまり、Duskの内部ではだれでもシステムユーザーとしてログインできるエンドポイントを公開しているので、本番で使用すると外部からの未認証アクセスを許すようになってしまうことになりセキュリティ的にアウトということ。

本番にインストールしようとすると、エラーメッセージが出ます。

それでも、本番環境にインストールしたい場合は、以下コマンドでインストールできます。

composer install --no-dev

参考

まとめ

一番無難に使えるseleniumになるのかなと思います。

スクレイピング全般に関してですが、どれも一長一短なので、いくつか触ってみて気に入ったものを使うと良いと思います。