LoginSignup
10
13

More than 3 years have passed since last update.

(Python Selenium)自動ダウンロードした PDFファイル名を取得する

Last updated at Posted at 2019-09-03

Python Selenium で自動ダウンロードした PDFファイル名を取得したい

クローリングで ダウンロードした PDFファイル名を取得したいと思います。自動化してPDFダウンロードした際の課題として以下のものをあげました。

  • 1. ダウンロード先フォルダをプロジェクトのフォルダに指定したい。

開発環境毎に異なるダウンロード場所になってしまうことを防ぐため、ChromeDriver の立ち上げの際に指定したダウンロードフォルダを設定します。

  • 2. 処理がファイル名を直接指定して読み込めない

ファイル名が分からないため、ダウンロード直後に、ファイル名をすぐ取得する処理ができないか検討をしました。

以上の2点を自動ファイルダウンロードの課題としてあげました。これらを解決してダウンロードしたPDFファイル名を取得したいと思います。

WebDriver インスタンス作成時にダウンロード先を指定する

まず、ブラウザ でダウンロードした際のダウンロード先を、WebDriverインスタンスを生成するタイミングで設定します。(Chromeドライバの場合、selenium.webdriver.ChromeOptionsインスタンスにadd_experimental_option()メソッドでdownload.default_directoryの指定をします。

WebDriverModule.py
from selenium import webdriver
from selenium.webdriver import ChromeOptions 
from selenium.webdriver.chrome.webdriver import WebDriver
import os

downloadsFilePath = './downloads'
class WebDriverModule(object):
    def getChromeDriver(self)->WebDriver:
        return webdriver.Chrome(
            options=self.getCoromeOptions()
        )
    def getCoromeOptions(self)->ChromeOptions:
        options = ChromeOptions()
        prefs = {
            "plugins.always_open_pdf_externally": True,
            "profile.default_content_settings.popups": 1,
            "download.default_directory": 
                    os.path.abspath(downloadsFilePath) + r"\\", #IMPORTANT - ENDING SLASH V IMPORTANT
            "directory_upgrade": True
        }
        options.add_experimental_option("prefs", prefs)
        return options

webDriverModule = WebDriverModule()
driver = webDriverModule.getChromeDriver()

DownloadDemo1.png

この時、plugins.always_open_pdf_externally=True を設定することで、PDFファイルにアクセスした際に、default の Viewer を使う処理を制御して、ファイルを直接ダウンロードできます。

test.py
from WebDriverModule import WebDriverModule
webDriverModule = WebDriverModule()
driver = webDriverModule.getChromeDriver()
fileUrl = 'http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h30/pdf/30daijin.pdf'
driver.get(fileUrl)

DownloadDemo2.png

ダウンロードディレクトリ内の最新ダウンロードファイル名を取得する。

os と max(list, key)を使用して、ダウンロード先内の全ファイルから「最新の日付のファイル」という条件で1ファイル取得します。

WebDriverModule.py
downloadsFilePath = './downloads'
class WebDriverModule(object):
    def getLatestDownloadedFileName(self):
        if len(os.listdir(downloadsFilePath)) == 0:
            return None
        return max (
            [downloadsFilePath+ f for f in os.listdir(downloadsFilePath)], 
            key=os.path.getctime
        )

test.py
print(webDriverModule.getLatestDownloadedFileName())
出力結果.txt
python .\test.py
./downloads/30daijin.pdf

これで、PDFファイル名を取得することができました。

まとめ

  • ChromeDriver 立ち上げ時に、ダウンロード先を指定する。
  • ダウンロード先の最新のファイル名を取得する。

これで、ダウンロードしたPDFファイル名を取得することができました。

以上です。

10
13
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
10
13