🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

7789閲覧

<Python> <Selenium> <Firefox> PDFファイルのダウンロード実行時に処理が中断してしまう

optopt

総合スコア5

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/11/20 06:44

編集2019/11/20 13:13

(Python、Seleniumともに初学者のため必要な情報が欠けている場合は追記いたします)

前提・実現したいこと

【実行環境】
OS:Windows 10 Pro (64bit)
Firefox:70.0.1 (64bit)
Python:3.6.3
Selenium:3.141.0

FirefoxでSeleniumを使用し、特定のURLからPDFファイルをダウンロードするツールを作成しています。
特定のURLにアクセス→PDFのダウンロード→ブラウザを閉じて終了、までの機能を想定しています。

発生している問題・エラーメッセージ

上記機能のうち、特定のURLにアクセス→PDFのダウンロード までは実装できていますが
ファイルのダウンロード後、ブラウザを閉じることができません。
実際にはPythonのプログラムが実行されていない(中断している)状態です。
処理が進まないため、プログラムを中止した際のメッセージです。

Traceback (most recent call last): File "demo_1.py", line 16, in <module> driver.get('https://hogehoge.pdf') File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get self.execute(Command.GET, {'url': url}) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute response = self.command_executor.execute(driver_command, params) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 374, in execute return self._request(command_info[0], url, body=data) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 397, in _request resp = self._conn.request(method, url, body=body, headers=headers) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\request.py", line 80, in request method, url, fields=fields, headers=headers, **urlopen_kw File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\request.py", line 171, in request_encode_body return self.urlopen(method, url, **extra_kw) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\poolmanager.py", line 330, in urlopen response = conn.urlopen(method, u.request_uri, **kw) File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\connectionpool.py", line 672, in urlopen chunked=chunked, File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\connectionpool.py", line 421, in _make_request six.raise_from(e, None) File "<string>", line 3, in raise_from File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\connectionpool.py", line 416, in _make_request httplib_response = conn.getresponse() File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 1331, in getresponse response.begin() File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 297, in begin version, status, reason = self._read_status() File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\http\client.py", line 258, in _read_status line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") File "C:\Users\Piyopiyo\AppData\Local\Programs\Python\Python36\lib\socket.py", line 586, in readinto return self._sock.recv_into(b) KeyboardInterrupt

該当のソースコード

Python

1from selenium import webdriver 2 3# FirefoxProfile設定 4fp = webdriver.FirefoxProfile() 5fp.set_preference("browser.download.folderList",1) 6fp.set_preference("browser.download.manager.showWhenStarting",False) 7fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") 8# PDFファイルのダウンロード用Profile設定 9fp.set_preference("pdfjs.disabled", True) 10fp.set_preference("plugin.scan.Acrobat", "99.0") 11fp.set_preference("plugin.scan.plid.all", False) 12 13# Firefoxドライバ起動 14driver = webdriver.Firefox(firefox_profile=fp) 15# URLアクセス 16driver.get('https://hogehoge.pdf') #任意のURL 17 18# クローズ 19driver.close() 20

16行目のdriver.getで対象のURLにアクセス→ダウンロードは実行できているのですが、その後の処理に進みません。
上記ではドライバのクローズを試みていますが、別途試したprintなども実行されないため
Pythonのプログラムが実行されていないと判断しました。
###解決したいこと 
URLアクセス(ファイルダウンロード)後、処理が止まっている原因を除去し後続処理を実行したい。
アドバイスのほどよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

printを打っても表示されないということは
https://hogehoge.pdfにアクセスをしたところでとまっているということですね。

すなわちhttps://hogehoge.pdfというWebページが
完全に読み込み終わっているかどうかを
pythonが判断できていないということです。

もしくは延々と何らかの空スクリプトのようなものが
読み込まれ続けているのかもしれません。

wait系の待機関数は使えなさそうですね。


気になったので軽く調べてみましたが
pdfをDLし終わったかどうかを判定できるかは見つからなかったです。

かろうじて見つかったのは、

python

1driver.set_page_load_timeout(30)

という関数で、この例だと30秒待ってもページがロードしきらなかった場合
TimeoutExceptionを起こすというものでした。
これをdriver.getの直前に書いてみてください。

python

1from selenium import webdriver 2from selenium.common.exceptions import TimeoutException 3 4# FirefoxProfile設定 5fp = webdriver.FirefoxProfile() 6fp.set_preference("browser.download.folderList",1) 7fp.set_preference("browser.download.manager.showWhenStarting",False) 8fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") 9# PDFファイルのダウンロード用Profile設定 10fp.set_preference("pdfjs.disabled", True) 11fp.set_preference("plugin.scan.Acrobat", "99.0") 12fp.set_preference("plugin.scan.plid.all", False) 13 14# Firefoxドライバ起動 15driver = webdriver.Firefox(firefox_profile=fp) 16 17# URLアクセス 18driver.set_page_load_timeout(30) 19try: 20 driver.get('https://hogehoge.pdf') #任意のURL 21except TimeoutException: 22 pass 23 24print('DLしました') 25 26# クローズ 27driver.close()

pdfのおおよそのDL時間が分かっていない場合は
使い物になりませんが。。。

投稿2019/11/20 12:27

shirai

総合スコア1290

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

optopt

2019/11/20 13:11

shiraiさま ご回答ありがとうございます。 ご回答の内容で解決しました。 ご教示頂いた通り、driver.getの直前にset_page_load_timeoutを仕込んだところ TimeoutExceptionが発生し、catchすることで後続の処理が走りました。 当該のpdfでは3秒以内にDLが完了することが判明しているため適宜設定しました。 稚拙な質問にもかかわらず事象の的確な把握と適切な対処のご提示、誠にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問