Python Selenium で自動ダウンロードした PDFファイル名を取得したい
クローリングで ダウンロードした PDFファイル名を取得したいと思います。自動化してPDFダウンロードした際の課題として以下のものをあげました。
- 1. ダウンロード先フォルダをプロジェクトのフォルダに指定したい。
開発環境毎に異なるダウンロード場所になってしまうことを防ぐため、ChromeDriver の立ち上げの際に指定したダウンロードフォルダを設定します。
- 2. 処理がファイル名を直接指定して読み込めない
ファイル名が分からないため、ダウンロード直後に、ファイル名をすぐ取得する処理ができないか検討をしました。
以上の2点を自動ファイルダウンロードの課題としてあげました。これらを解決してダウンロードしたPDFファイル名を取得したいと思います。
WebDriver インスタンス作成時にダウンロード先を指定する
まず、ブラウザ でダウンロードした際のダウンロード先を、WebDriverインスタンスを生成するタイミングで設定します。(Chromeドライバの場合、selenium.webdriver.ChromeOptionsインスタンスにadd_experimental_option()メソッドでdownload.default_directoryの指定をします。)
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()
この時、plugins.always_open_pdf_externally=True を設定することで、PDFファイルにアクセスした際に、default の Viewer を使う処理を制御して、ファイルを直接ダウンロードできます。
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)
ダウンロードディレクトリ内の最新ダウンロードファイル名を取得する。
os と max(list, key)を使用して、ダウンロード先内の全ファイルから「最新の日付のファイル」という条件で1ファイル取得します。
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
)
print(webDriverModule.getLatestDownloadedFileName())
python .\test.py
./downloads/30daijin.pdf
これで、PDFファイル名を取得することができました。
まとめ
- ChromeDriver 立ち上げ時に、ダウンロード先を指定する。
- ダウンロード先の最新のファイル名を取得する。
これで、ダウンロードしたPDFファイル名を取得することができました。
以上です。