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に適正化されたものを使うのがベストだと思います。

ですので、ここで利用するライブラリーやパッケージは、

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を取得できる)




2022.04.08