質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

selenium

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

Q&A

解決済

2回答

3500閲覧

Python+Seleniumでwebページからファイルをダウンロード

rororish

総合スコア4

Python

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

selenium

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

0グッド

0クリップ

投稿2023/03/02 12:02

実現したいこと

Python+Seleniumでwebページからファイルをダウンロードしたい

前提

Seleniumでwebページにアクセスして、そのページ内にあるダウンロードリンクを取得まではいくのですが、
driver.getでそのダウンロードurlにアクセスできない。
エラーは発生せず、ただダウンロードができていない。

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

エラーメッセージ なし

該当のソースコード

python

1from selenium import webdriver 2from selenium.webdriver.chrome.service import Service as ChromeService 3from webdriver_manager.chrome import ChromeDriverManager 4from selenium.webdriver.chrome.options import Options 5from selenium.webdriver.common.by import By 6from time import sleep 7 8options = webdriver.ChromeOptions() 9options.add_argument('--headless') 10options.add_argument('--disable-gpu') 11options.add_argument('--no-sandbox') 12options.add_argument('--disable-dev-shm-usage') 13options.add_argument('--remote-debugging-port=9222') # option設定 headless 軽量化 14options.add_experimental_option("prefs", {"download.default_directory": r'G:\マイドライブ\download' }) # option設定 ダウンロード保存先 15driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options) 16 17driver.get('https://www.naaim.org/programs/naaim-exposure-index/') 18sleep(10) 19elem = driver.find_element(By.CSS_SELECTOR,'* strong > a') 20link = elem.get_attribute('href') 21driver.get(link) 22driver.quit()

試したこと

link = elem.get_attribute('href') で正しいurlは取得できています。(そのurlにアクセスするとダウンロードが始まります。)

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

melian

2023/03/02 14:05

手元の環境ですと、sleep を入れることでダウンロードが完了しました。(もっと適切な方法があるとは思いますが。。。) driver.get(link) sleep(10) driver.quit()
rororish

2023/03/03 00:49

ご返信ありがとうございます。私の環境だと、そちらを試しても、変化はありませんでした。 headlessを外すとうまくいったのですが、headlessをつけると、ダウンロードファイルが保存先にありませんでした…
melian

2023/03/03 01:31

一応書いておきますと、こちらの環境は以下の通りです。 Ubuntu Linux 22.04, Google Chrome 110.0.5481.177, ChromeDriver 110.0.5481.77 こちらでは headless モードであってもなくても sleep を入れないとダウンロードされません。
rororish

2023/03/04 07:00

解決いたしました。 どうやら、ヘッドレスだとセキュリティの関係で、ダウンロードできない場合があるようです。 参照 https://isgs-lab.com/183/ いくつか処理を施すことで無事ダウンロードできました。 ご協力ありがとうございました!
guest

回答2

0

自己解決

解決いたしました。
どうやら、ヘッドレスだとセキュリティの関係で、ダウンロードできない場合があるようです。
参照 https://isgs-lab.com/183/
いくつか処理を施すことで無事ダウンロードできました。

投稿2023/03/04 07:00

rororish

総合スコア4

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

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

0

driver.get(link)

で、ダウンロードダイアログが出ているのでは?
いったんheadlesssを止めて、getの直後でのブラウザ画面を見てみましょう。
(--headlessを付けるのは、プログラムが完成してからです)

投稿2023/03/02 13:06

otn

総合スコア84533

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

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

rororish

2023/03/02 23:58

ご返信ありがとうございます。 おっしゃる通り、headlesssを外したところ、正常にダウンロードが完了していました。 しかし、再びheadlesssをつけると、やはり、ダウンロード保存先にファイルは存在しませんでした。 どういったことが考えられますでしょうか…?
otn

2023/03/03 05:50

> しかし、再びheadlesssをつけると、やはり、ダウンロード保存先にファイルは存在しませんでした。 driver.get_screenshot_as_file("/path/to/file.png") で、クリック後にスクリーンショットを見てみましょう。 melianさんのコメントにもありますが、クリック直後にブラウザを終了させると、ダウンロード途中だったかも。
rororish

2023/03/04 06:59

解決いたしました。 どうやら、ヘッドレスだとセキュリティの関係で、ダウンロードできない場合があるようです。 参照 https://isgs-lab.com/183/ いくつか処理を施すことで無事ダウンロードできました。 ご協力ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問