headless-chromium-phpが使えるまでを記事にしてく
#インストール
composer require chrome-php/chrome
#使い方
マニュアルページで使い方として以下のコードが載っている
use HeadlessChromium\BrowserFactory;
$browserFactory = new BrowserFactory();
// starts headless chrome
$browser = $browserFactory->createBrowser();
// creates a new page and navigate to an url
$page = $browser->createPage();
$page->navigate('http://example.com')->waitForNavigation();
// get page title
$pageTitle = $page->evaluate('document.title')->getReturnValue();
// screenshot - Say "Cheese"! 😄
$page->screenshot()->saveToFile('/foo/bar.png');
// pdf
$page->pdf(['printBackground'=>false])->saveToFile('/foo/bar.pdf');
// bye
$browser->close();
しかしこれを素直に実行するとこうなる。
PHP Fatal error: Uncaught RuntimeException: Chrome process stopped before startup completed. Additional info: sh: line 0: exec: chrome: not found in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php:379
Stack trace:
#0 /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/Utils.php(51): HeadlessChromium\Browser\BrowserProcess->HeadlessChromium\Browser\{closure}(Object(Symfony\Component\Process\Process))
#1 /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(414): HeadlessChromium\Utils::tryWithTimeout(30000000, Object(Generator))
#2 /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(128): HeadlessChromium\Browser\BrowserProcess->waitForStartup(Object(Symfony\Component\Process\Process), 30000000)
#3 /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/BrowserFactory.php(78): HeadlessChromium\Browser\BrowserPro in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php on line 379
##chromiumが足りない
まずそもそも環境にchromiumをインストールしていなかった
今Macに入っているchromeでいいのかと思ってファクトリーにパスを指定してみたけど、バージョンが読み込めない、ということで使えなかった。
###インストール
怪しげな公式ページからダウンロード
##再実行
$browserFactory = new BrowserFactory('/Applications/Chromium.app/Contents/MacOS/Chromium');
エイリアスが何故か機能しないので、chromiumファイルを直接指定して再度実行する。
BrowserFactoryのコンストラクタで
引数がない場合は環境変数'CHROME_PATH'を参照している。
この環境変数を設定してあげれば引数なしでもうまくいくと思う(試してない)
今度はこんなエラーが
PHP Warning: mkdir(): Read-only file system in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php on line 67
Warning: mkdir(): Read-only file system in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php on line 67
PHP Fatal error: Uncaught HeadlessChromium\Exception\FilesystemException: Could not create the directory /foo. in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php:68
Stack trace:
#0 /Applications/MAMP/htdocs/crawler/php/index.php(21): HeadlessChromium\PageUtils\AbstractBinaryInput->saveToFile('/foo/bar.png')
#1 {main}
thrown in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php on line 68
Fatal error: Uncaught HeadlessChromium\Exception\FilesystemException: Could not create the directory /foo. in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php:68
Stack trace:
#0 /Applications/MAMP/htdocs/crawler/php/index.php(21): HeadlessChromium\PageUtils\AbstractBinaryInput->saveToFile('/foo/bar.png')
#1 {main}
thrown in /Applications/MAMP/htdocs/crawler/composer_project/vendor/chrome-php/chrome/src/PageUtils/AbstractBinaryInput.php on line 68
##無茶なところでフォルダを作ろうとしている
問題はここで起きている
$page->screenshot()->saveToFile('/foo/bar.png');
このスクショを保存しようとしてfooディレクトリをルートに作ろうとしてパーミッションエラーが出ている。
またその下のPDFを保存するところでも/fooを無茶なところで作ろうとしているので保存先を変更してやる
$page->pdf(['printBackground'=>false])->saveToFile('/foo/bar.pdf');
これらの保存先を任意にして再実行するとエラーは出なくなった。
#ここまでのまとめ
- chromiumが足りなかった
- ルートディレクトリに保存しようとするから保存先を変更する必要がある。
#デバック
use HeadlessChromium\BrowserFactory;
$browserFactory = new BrowserFactory();
$browser = $browserFactory->createBrowser([
'headless' => false, // disable headless mode
'connectionDelay' => 0.8, // add 0.8 second of delay between each instruction sent to chrome,
'debugLogger' => 'php://stdout' // will enable verbose mode
]);
createBrowserメソッドの引数にそれぞれ値を指定することでデバッグもができる。
###ページの移り変わりが見える
'headless' => false,
普通にネットサーフィンしてる感覚