Documents
PHPでJavascriptなどの動的なレンダリングページもスクレイピングする方法
Laravelのコマンドで作成してみますが、通常のPHPでもcomposerを使えるようにしておけばOKです。
./vendor/bin/sail artisan make:command ScrapingCommand
app/Console/Commands/ScrapingCommand.php
というファイルが作成されるので、ここにコードを記述してゆきます。
このファイルはartisan list
で表示されるコマンド一覧に登録されます。Laravel8からはapp/Console/Kernel.php
への登録が不要になったっぽい。
コントローラをディレクトリ内に作成する際は、
$ ./vendor/bin/sail artisan make:command Scraping/ScrapingCommand
というふうにパスで切ってあげれば自動手にディレクトリも作成されます。
コマンドの実行はhadle()メソッドに書きます。以下のように書いておくと、コマンド実行時に「This is sample commad.」が表示されます。
public function handle()
{
echo "This is sample commad.\n";
return Command::SUCCESS;
}
PHPでスクレイピング
Javascriptなどローカルのブラウザー上でレンダリングされるDOMは純粋なPHPだけではデータ取得ができません。ですので昨今はヘッドレスブラウザーを使ってスクレイピングすることになります。ヘッドレスブラウザーとは、コマンドライン上で操作できるブラウザーと思って9割ぐらい間違いではないと思います。CLIブラウザーみたいなもんですかね。(使ってみるとよくわかります。)
いろいろなライブラリーやパッケージがありますが、今現在のベストプラクティスは、Laravelに適正化されたものを使うのがベストだと思います。
ですので、ここで利用するライブラリーやパッケージは、
- Packageist: guzzlehttp/guzzle (HTTPクライアントパッケージ GETとかPOSTができる)
- Packageist: scotteh/php-dom-wrapper( DOM操作をidやクラスで取得できるようにしてくれるライブラリ でjQueryライクにDOMを取得できる)
- Packageist: laravel/dusk(ヘッドレスChrome httpで取得したデータをブラウザー内でレンダリングしてくれるライブラリ)
- Packageist: qxsch/worker-pool (並列処理ができるPackage)
guzzlehttp/guzzle
Packageist: guzzlehttp/guzzle
Github: guzzlehttp/guzzle
Laravelのsailを使っている場合は、これだけでOK。最新のguzzlehttpがインストールされるはず。2022-04-08時点ではguzzlehttp/guzzle: 7.4
がインストールされました。
$ ./vendor/bin/sail php composer.phar require guzzlehttp/guzzle
使い方は公式ドキュメントにもあります。GETやPOSTなどHTTPリクエストは一通りできるものになっています。これで基本的なhttpレスポンスベースのスクレイピングはできるようになります。10年前ぐらいのスクレイピングはここまでで十分でした。
scotteh/php-dom-wrapper
PHP DOMラッパーは、HTMLドキュメントを操作およびトラバースするための単純なDOMラッパーライブラリです。 jQueryの操作およびトラバーサルメソッドに基づいており、主にjQueryの対応する動作を模倣しています、だそうです。
基本的な使い方はREADME.mdを参照すればわかります。guzzleでソースをごっそり抜き取ったらphp-dom-wrapperでパースするというのがよさそうです。
laravel/dusk
guzzleで取得できるものはhttpリクエストに対するサーバーレスポンスだけで、ブラウザー内でレンダリングしているDOMに関しては取得できません。つまりJSのコードをそのままレスポンスとして取得できるだけなのです。そのためそれらのソースを取得したあとにブラウザー表示をしてそのブラウザーを通した最終的なDOMデータを取得しないとJSレンダリングのソースは取得できないわけです。それができるのがヘッドレス・ブラウザーになります。ここではLaravelの公式ドキュメントにもあるlaravel/duskを使います。
laravel/duskは、こういうものであるらしい。「Laravel Duskは、表現力豊かで使いやすいブラウザー自動化およびテストAPIを提供します。 デフォルトでは、DuskではマシンにJDKまたはSeleniumをインストールする必要はありません。 代わりに、DuskはスタンドアロンのChromedriverを使用します。 ただし、他のSeleniumドライバーを自由に利用できます。」
Packageist: laravel/dusk
Github: laravel/dusk
インストールは、
$ ./vendor/bin/sail php composer.phar require --dev laravel/dusk
基本的には--dev
オプションをつけます。もし付けないでいるとつけるように促されます。スクレイピングツールなので開発環境だけで使うっていうのがよいでしょう。
$ ./vendor/bin/sail php artisan dusk:install
Duskパッケージをインストールし終えたらdusk:install Artisan
コマンドを実行します。dusk:install
コマンドは、tests/Browser
ディレクトリとサンプルのDuskテストを作成するみたいです。
続いてChromeをインストールします。
$ ./vendor/bin/sail artisan dusk:chrome-driver
ChromeDriver binary successfully installed for version 100.0.4896.60.
qxsch/worker-pool
https://packagist.org/packages/qxsch/worker-pool
qxsch/WorkerPool
https://github.com/qxsch/WorkerPool
https://github.com/qxsch/WorkerPool
scotteh/php-dom-wrapper( DOM操作をidやクラスで取得できるようにしてくれるライブラリ でjQueryライクにDOMを取得できる)