5
6

More than 3 years have passed since last update.

headless-chromium-phpを使ってみる

Last updated at Posted at 2020-07-18

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, 

普通にネットサーフィンしてる感覚

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6