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

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

新規登録して質問してみよう
ただいま回答率
85.37%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Python

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

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

selenium

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

Q&A

解決済

1回答

9435閲覧

プロキシ経由でwebdriverをダウンロードしたい。(Selenium webdriver_manager)

kariaka2020

総合スコア37

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Python

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

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

selenium

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

0グッド

0クリップ

投稿2021/06/20 05:10

編集2021/06/22 12:12

前提・実現したいこと

Pythonでブラウザ起動させ操作するようなシステムを作ろうとしています。
プロキシ下で、webdriver_managerを用いてwebdriverを取得するプログラムを実行した際にエラーが発生しました。

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

driverを取得するところで、エラーが出てしまいます。
自宅や、クラウド上のVMでは問題なく動作するのでプロキシ関連だと思います。

恐縮ですが、現在プロキシのある環境にいないため明確なエラーメッセージを提示できません。
webdriver_managerによるエラーだと思います。
"対象のPCにアクセスできません。"のようなもので、以前requestsというライブラリを使用した際にもそれが出たのですが、
環境変数にプロキシ設定用の項目を追加したところ解消されました。

いくつか調べてみたのですが、プロキシ設定をPythonで書かれているものを見つけられず、質問させていただきました。
optionに--proxyを設定すればよいのかと思いましたが、どのように書けばよいのかわかりませんでした。

サイト① proxy-serverとproxy-bypass-listという項目があるのですが何を設定すればよいのかわかりません。
サイト② how to set https proxy for selenium's webdriver?

よろしくお願いいたします。

該当のソースコード

Python

1from selenium import webdriver 2from webdriver_manager.chrome import ChromeDriverManager 3from selenium.webdriver.chrome.options import Options 4from selenium.webdriver.support.ui import WebDriverWait 5... 6 7# 表示するブラウザの準備 8def ready_browser(): 9 options = Options() #selenium.webdriver.chrome.options 10 11 try: 12 #C:\Users\ユーザー名.wdm\drivers\chromedriver\win32にダウンロードされる。 13 browser = webdriver.Chrome(executable_path = ChromeDriverManager().install(),options = options) 14 except: 15 #ドライバの確認や取得ができなかった場合エラー 16 #プロキシのある環境だと、ここに来てしまう。 17 18 # 要素が見つかるまで、最大x秒間待機するという設定。 19 browser.implicitly_wait(int(Wait_Time)) 20 login(browser)#←指定したページにアクセスし、ログインするメソッド 21

試したこと

環境変数に"http_proxy"と"https_proxy"の設定。

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

Python 3.7

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

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

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

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

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

meg_

2021/06/20 06:22

> 恐縮ですが、現在プロキシのある環境にいないため明確なエラーメッセージを提示できません。 > webdriver_managerによるエラーだと思います。 > "対象のPCにアクセスできません。"のようなもので、 正確なエラー発生箇所とエラーメッセージが分かったら追記してください。
kariaka2020

2021/06/20 06:38

meg_様 ありがとうございます。 会社のプロキシですので明日確認する予定です。 エラー発生箇所はここで間違いありません。 driver取得の際にプロキシを通して通信ができていないためdriverが取得できなかったのではないかと考えています。 `browser = webdriver.Chrome(executable_path = ChromeDriverManager().install(),options = options)`
meg_

2021/06/20 06:46

ちなみに認証ありのプロキシでしょうか?
kariaka2020

2021/06/20 07:18

meg_様 プロキシにあまり詳しくないので、正直わかりません。 ただ、requestsでプロキシ経由での通信をした際はユーザー名やパスワードなどは設定しませんでした。 この時は環境変数に ”プロキシサーバー名(?):ポート番号” 形式で設定をしたところ解決しました。 ブラウザを開いた際もログインを求められたりはしないので、"認証なし"かもしれません。 (ドメインアカウントの情報が自動的に送られているという可能性もあるかもしれませんが。。) もし認証ありであった場合は下記サイトを参考に設定してみようと思っています。 https://qiita.com/ryuichi1208/items/5d400f13a52fe28f4490 ただ、書き方的に開いたブラウザでのプロキシ設定であって、ドライバインストール時に有効なのかどうかがわかりません。。。 よろしくお願いいたします。
meg_

2021/06/20 07:59

参考サイトにあるように、 option.add_argument("--proxy-server='XXXX'"); にて「”プロキシサーバー名(?):ポート番号”」で良いかと思いますが。 --proxy-bypass-listについては質問者さんの会社のプロキシ設定で除外されているものを書けば良いでしょう。(ブラウザで設定しているものがありますよね?) 私はChromeDriverManager自体は使用したことはなく、事前に用意したchromedriverを使用したのですがChromeブラウザの設定そのままと環境変数設定で会社のプロキシを通過出来ていました。上手くいかない場合は質問者さんの会社のネットワーク管理者に確認された方が良いかと思います。
kariaka2020

2021/06/20 08:41

meg_様 ありがとうございます。明日試してみます!
otn

2021/06/20 09:13

> option.add_argument("--proxy-server='XXXX'"); それは、Chromeブラウザが動作する時用の設定ですね。 ChromeDriverManagerがChromeDriverをダウンロードするとの設定はChromeDriverManagerにしないとけない。 ChromeDriverManagerを使わないで、自分でChromeDriverをダウンロードすれば問題回避できます。
kariaka2020

2021/06/20 09:21

meg_様 otn様 ありがとうございます。 あれからもう少し別の視点で調べてみたのですが、 もしかすると原因がプロキシだけでなく、ChromeDriverManagerとexe化させるために利用したPyinstallerで--noconsoleでビルドしたことによる問題がある可能性も出てきました。 明日、例外処理を外した状態で実行してみます。 https://teratail.com/questions/309860 ありがとうございます。
otn

2021/06/20 09:24

proxy · Issue #88 · SergeyPirogov/webdriver_manager · GitHub https://github.com/SergeyPirogov/webdriver_manager/issues/88 の、 mosvath commented on 4 Sep 2020 のコメントを見ると、環境変数の設定で行けたと書いてありますね。まさかとは思うけど、大文字にしないといけないとか?
meg_

2021/06/20 09:32 編集

> それは、Chromeブラウザが動作する時用の設定ですね。 すみません、そうですね。 ***コメント完全に被ってしまいました。以下ご参考です*** 下記が参考になりそうです。 https://github.com/SergeyPirogov/webdriver_manager/issues/88 オーナーが「WD Manager download driver using requests. If it's possible to set proxy for requests it's will be possible to cover your needs」とのコメントも残しています。(こちらの質問者の解決方法はos.environでしたが)
otn

2021/06/20 09:32

> 明日、例外処理を外した状態で実行してみます。 そもそも、そんなところでtry~exceptするのが疑問。Pythonコードでリカバリーしようのない例外しか起こらないと思うのですが。例外発生時にプログラム終了以外の手段は無いのでは?
kariaka2020

2021/06/20 09:45 編集

meg_様 otn様 調べていただいてありがとうございます。 こちらの説明、検証不足の状態で質問しまったことが原因で混乱させてしまい申し訳ございません。 環境変数で問題なく通るのであればChromeDriverManagerとPyinstallerの相性が悪い可能性が高くなってきてしまいましたね。 >>otn様 >そもそも、そんなところでtry~exceptするのが疑問。Pythonコードでリカバリーしようのない例外しか起こらないと思うのですが。例外発生時にプログラム終了以外の手段は無いのでは? 社内にChromeの更新を意図的に止めている人がいるため、フラグ的な管理方法ではありますが 自動更新を行うか行わない(ローカルにあるものを使用する)かを分けていました。 そのため、自動更新をする設定をしているにも関わらず環境変数が設定されていなかったり、何らかの理由でエラーになってしまった場合、ローカルにドライバが残っていないか一応確認するという処理を書いていました。(この質問は簡略化のため省略していました。) プログラム初心者のため意味の無いような書き方は大目に見ていただけるとありがたいです。。
otn

2021/06/20 10:00

よく分かりませんが、意味のある後処理があるのですね。余計なアドバイスでした。
meg_

2021/06/20 12:04

> 環境変数で問題なく通るのであればChromeDriverManagerとPyinstallerの相性が悪い可能性が高くなってきてしまいましたね。 「Pyinstaller」ですか?どうやら質問本文には書いていないことがあるようですね。 コメントを読んだ感じではexe化したプログラムを第三者に配布して使用させるんでしょうか?
guest

回答1

0

自己解決

プロキシ下において、ドライバインストールなどの通信をする場合は環境変数のみで十分でした。

今回のエラーの原因は、
webdriver_managerとexe化するために使用したpyinstallerにありました。
exe化する際に、--noconsoleを指定した場合、webdriver_manager起動時の出力がそれによって防がれエラーになってしまう、というものだそうです。
(subprocess モジュールを正常に利用できなくなり、「ハンドルが無効です」のエラーを生じる)

この件に関しては下記サイトの解決法を実践し、解決することができました。
https://teratail.com/questions/309860

投稿2021/06/22 12:11

kariaka2020

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問