Selenium+ChromeDriverでWebブラウザの自動操作をする際、リンクが貼ってあるPDFを保存することが出来ずに詰まりました。
Pythonでの解決記事はいくつかあったのですが、PHPでの記事はなかった(気がする)ので、残しておこうと思います。
PDFのリンクをクリックした時に直接ダウンロード
Google Chromeがデフォルトの設定のままだと、PDFファイルへのリンクをクリックした際、自動的にその内容がタブ内に表示される一方で、PDFファイルはローカルに保存されません。
よって今回は、PDFのリンクをクリックした際に直接ダウンロードするようにするChromeDriverのoption指定を紹介します。
$options->setExperimentalOption('prefs', [
'download.default_directory' => $directory_path, //デフォルトのダウンロード先を変更(必須ではない)
'plugins.always_open_pdf_externally' => true //これでPDFのリンクをクリックした際に直接ダウンロードされる
]);
実際に使ってみる
簡単なサンプルとして、セブン&アイのHP(https://www.7andi.com/sustainability/) からサステナビリティデータブックというPDFファイルをクリックしてダウンロードするものを作ってみました。
記事投稿段階では動きますが、サイトの構造が変わったりすると、XPathでfindElementしているところが正常に動かなくなると思うので、参考程度に見てください。
ディレクトリ構成
├ vendor/ (composerでfacebook/webdriver)
│ └ いろいろ
├ download/
│ └ ここにPDFがダウンロードされる
├ sample.php (今回動かすサンプルプロググラム)
├ chromedriver (windowsの方は.exe)
サンプルプログラム
<?php
require_once(__DIR__ . '/vendor/autoload.php');
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Chrome\ChromeDriver;
putenv("webdriver.chrome.driver=" . __DIR__ . "/chromedriver"); //windowsは.exe
$directory_path = __DIR__ . "/download"; //ダウンロード先
//オプションを指定
$options = new ChromeOptions();
$options->setExperimentalOption('prefs', [
'download.default_directory' => $directory_path, //デフォルトのダウンロード先を変更
'plugins.always_open_pdf_externally' => true //これでPDFのリンクをクリックした際に直接ダウンロードされる
]);
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = ChromeDriver::start($caps);
$driver->get('https://www.7andi.com/sustainability/'); //セブン&アイHPへ遷移
//クリックしてダウンロード
$element = $driver->findElement(WebDriverBy::xpath('//*[@id="pbBlock1024212"]/div/div/a'));
$element->click();
$driver->close();
実行結果
ブラウザが開き、赤丸の場所をクリックさせます。
ダウンロードされました!
まとめ
今回は、PHPにおけるSelenium+ChromeDriverでWebブラウザの自動操作を行う際に、PDFのリンクをクリックしてダウンロードする方法を紹介しました。
サンプルプログラムで載せたような場合だと、curl等で直接ダウンロードすればいいじゃん!と思う方も多いと思いますが、JavaScriptでレンダリングされたサイトでログインした後でしかダウンロードできないものなどの場合は非常に使えると思います。
参考