0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP】ChromeDriverでPDFをダウンロードする方法

Last updated at Posted at 2021-12-16

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)

サンプルプログラム

sample.php
<?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();

実行結果

スクリーンショット 2021-12-16 19.08.28.png
ブラウザが開き、赤丸の場所をクリックさせます。
スクリーンショット 2021-12-16 18.37.01.png
ダウンロードされました!

まとめ

今回は、PHPにおけるSelenium+ChromeDriverでWebブラウザの自動操作を行う際に、PDFのリンクをクリックしてダウンロードする方法を紹介しました。
サンプルプログラムで載せたような場合だと、curl等で直接ダウンロードすればいいじゃん!と思う方も多いと思いますが、JavaScriptでレンダリングされたサイトでログインした後でしかダウンロードできないものなどの場合は非常に使えると思います。

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?