株式会社IoTBankでは一緒に働く仲間を募集しています
こんにちは、サーバー側で自社サービスのスクリーンショットを撮る必要出てきたので、そのお話を簡単にします。
スクレイピングはPythonで行うと言う方も多いと思いますが、弊社のバックエンドはLaravelを使ってシステム開発しておりますのでPHPでスクレイピングを行いました。
ライブラリで有名どころはGoutteやseleniumなどありますが、今回はPuPHPeteerを使用しました。
PuPHPeteerはNodeライブラリであるPuppeteerをPHPでも利用出来るようにしたもので、Headless Chrome, Firefoxを使ってのスクレイピングも簡単に行えます。
スクリーンショットを撮るサンプル
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer([
'executable_path' => {node_path},
]);
$browser = $puppeteer->launch(['args' => ['--no-sandbox', '--disable-setuid-sandbox']]);
$page = $browser->newPage();
$page->goto('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();
オプションでサイズの変更したりフルページスクリーンショットなども指定出来ます。
サイズ変更したい場合
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer([
'executable_path' => {node_path},
]);
$browser = $puppeteer->launch(['args' => ['--no-sandbox', '--disable-setuid-sandbox']]);
$page = $browser->newPage();
$page->goto('https://example.com');
// サイズ指定
$page->setViewport([
'width' => {width},
'height' => {height},
]);
$page->screenshot(['path' => 'example.png']);
$browser->close();
フルページで撮りたい場合
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer([
'executable_path' => {node_path},
]);
$browser = $puppeteer->launch(['args' => ['--no-sandbox', '--disable-setuid-sandbox']]);
$page = $browser->newPage();
$page->goto('https://example.com');
// フルページ指定
$page->screenshot(['path' => 'example.png', 'fullPage' => true]);
$browser->close();
また、スクリーンショットを撮る他にもDOM操作をしてゴニョゴニョしたりも出来ます。
Pタグの中身を取得
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer([
'executable_path' => {node_path},
]);
$browser = $puppeteer->launch(['args' => ['--no-sandbox', '--disable-setuid-sandbox']]);
$page = $browser->newPage();
$page->goto('https://example.com');
// Pタグの中身を取得
foreach ($page->querySelectorAll('p') as $el) {
var_dump($el->getProperty('textContent')->jsonValue());
}
$browser->close();
検索フォームに入力して検索結果をスクリーンショット
use Nesk\Puphpeteer\Puppeteer;
$puppeteer = new Puppeteer([
'executable_path' => {node_path},
]);
$browser = $puppeteer->launch(['args' => ['--no-sandbox', '--disable-setuid-sandbox']]);
$page = $browser->newPage();
$page->goto('https://ec.mamosearch.jp/');
// 検索フォームに入力して検索
$page->type('input[name="name"]', 'まもサーチ');
$page->click('button, input[type="submit"]');
$page->setViewport([
'width' => 1920,
'height' => 1440,
]);
$page->screenshot(['path' => storage_path('app/public/') . 'example.png']);
$browser->close();
他社のサービスなどをスクレイピングする時は禁止していないか規約を確認して、相手のサーバーに負担をかけないように注意しましょう。