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

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

詳細はこちら
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

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

selenium

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

Q&A

解決済

1回答

4841閲覧

Dockerを利用してseleniumを使用したい

keisuke0919

総合スコア34

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

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

selenium

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

0グッド

0クリップ

投稿2020/12/09 05:03

編集2020/12/09 07:07

分からないこと

Dockerコンテナ内でseleniumを操作してスクレイピングを行いたいのですが、
使用方法がどうにも分かりません。

参考にしたサイト

やったこと

【Qiita】 10分で理解する Seleniumこの記事の内容を実行しました。

  • ターミナル(ローカル)で以下コマンドを実行
$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-beta-1-prerelease-20201208 >>> e396b9aff5d621693a2a6507330934d8f5d6e478db93036e441f2ec8d0237251
  • Dockerコンテナ内に立ち上げたJupyterLabにて以下コマンドを実行

python

1from selenium import webdriver 2 3# Chrome のオプションを設定する 4options = webdriver.ChromeOptions() 5options.add_argument('--headless') 6 7# Selenium Server に接続する 8driver = webdriver.Remote( 9 command_executor='http://localhost:4444/wd/hub', 10 desired_capabilities=options.to_capabilities(), 11 options=options, 12) 13 14# Selenium 経由でブラウザを操作する 15driver.get('https://qiita.com') 16print(driver.current_url) 17 18# ブラウザを終了する 19driver.quit()

エラー内容

--------------------------------------------------------------------------- ConnectionRefusedError Traceback (most recent call last) /opt/anaconda3/lib/python3.8/site-packages/urllib3/connection.py in _new_conn(self) 158 try: --> 159 conn = connection.create_connection( 160 (self._dns_host, self.port), self.timeout, **extra_kw /opt/anaconda3/lib/python3.8/site-packages/urllib3/util/connection.py in create_connection(address, timeout, source_address, socket_options) 83 if err is not None: ---> 84 raise err 85 /opt/anaconda3/lib/python3.8/site-packages/urllib3/util/connection.py in create_connection(address, timeout, source_address, socket_options) 73 sock.bind(source_address) ---> 74 sock.connect(sa) 75 return sock ConnectionRefusedError: [Errno 111] Connection refused <<<<<<<<<<<<<<<<<<<<<<<<<中略>>>>>>>>>>>>>>>>>>>>>>>>>>> /opt/anaconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 722 e = ProtocolError("Connection aborted.", e) 723 --> 724 retries = retries.increment( 725 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] 726 ) /opt/anaconda3/lib/python3.8/site-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 437 438 if new_retry.is_exhausted(): --> 439 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 440 441 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) MaxRetryError: HTTPConnectionPool(host='localhost', port=4444): Max retries exceeded with url: /wd/hub/session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f7c235d95b0>: Failed to establish a new connection: [Errno 111] Connection refused'))

調べてみたのですが意味がよく分かりません。
わかる方いらっしゃいましたら教えていただけますと幸いです。

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

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

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

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

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

t_obara

2020/12/09 13:23

どう言う構成で動作させようとしているか理解してやっていますか?それとも何かを見てでしょうか。
keisuke0919

2020/12/10 04:57 編集

どのような構成なのか、あまり理解できていないですね、、 ざっと調べた感じだと2つのコンテナを使っているのかなと思いました。 $ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-beta-1-prerelease-20201208 を実行することで1つ目のコンテナでchromeやchrome_driverなどを動かして、 2つ目のコンテナから'http://localhost:4444/wd/hub 'にアクセスして、seleniumを使って1つ目のコンテナ内のchromeを操作する。 と予想しています、が、定かではないですね。 こちらのQiita記事(https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a )を参考にしました。 あとはselenium公式サイトやGitHub、dockerhubなどを確認しましたがよく分からなかったですね、、
guest

回答1

0

ベストアンサー

ご参照されたページ(https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a)
では、(1)ブラウザと WebDriverが含まれたイメージを起動し、(2)それが動作するホスト環境で実行しています。
その点が異なっているため、上記(1)にアクセスしようとhttp://localhost:4444/wd/hubしても、到達できない状況になっています。
上記(2)を別のdocker環境で動作させるのであれば、localhostではなくIPアドレスを指定するか、docker-composeを利用してそこで定義した名前を利用するといった方法が必要と思います。
https://docs.docker.jp/compose/networking.html

投稿2020/12/10 02:34

t_obara

総合スコア5488

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

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

keisuke0919

2020/12/10 03:10

なるほど! $ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-beta-1-prerelease-20201208 を実行した際に起動した環境にアクセスし、そこからhttp://localhost:4444/wd/hubにアクセスする必要があるということなのですね。 続けての質問で恐縮ですが、 (1)ブラウザと WebDriverが含まれたイメージを起動し、(2)それが動作するホスト環境で実行しています。 と書いていただいていますが、(2)それが動作するホスト環境、というのはdocker run で実行された「コンテナ」のことですか?
t_obara

2020/12/10 04:23

docker runを実行した環境のことです。
keisuke0919

2020/12/10 05:38

接続できました!ありがとうございます! 加えて、上記で教えていただいたdocker-composeを利用してそこで定義した名前を利用する方法を試してみたいと思います。
keisuke0919

2020/12/10 12:22 編集

https://docs.docker.jp/compose/networking.html ご紹介いただいたこちらの記事を読ませていただきました。 要約すると、同じdocker-compose.ymlファイルでコンテナを起動すると、 それぞれのコンテナが同じネットワーク内に配置をされ、通信ができるという理解をしました。 実際に下記のdocker-compose.ymlファイルを作成し、実行してみました。 ``` version: "3" services: web: image: selenium/standalone-chrome:4.0.0-beta-1-prerelease-20201208 ports: - '4444:4444' volumes: - '/dev/shm:/dev/shm' pytorch: build: . ports: - '2222:8888' volumes: - './work/:/work/' ``` 一応ネットワークも確認します。 ``` [ { "Name": "doc_default", "Id": "0774dfd9ecc3cd6a3bd73a9887bdf6ae2e32f3962aea79c38f3b370e23198b50", "Created": "2020-12-10T11:49:39.1148325Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.31.0.0/16", "Gateway": "172.31.0.1" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "c125a118125652957bd4f4cdcb091d1085a9e9760c6f11901e9ecd5cfacd46d1": { "Name": "doc_web_1", "EndpointID": "27e78c9c8496d10844499d53dc858adbacd237a11f25cb69cb534a2ae36c49b5", "MacAddress": "02:42:ac:1f:00:03", "IPv4Address": "172.31.0.3/16", "IPv6Address": "" }, "d2f5e5c5c7807365819d82db0e8bcbc20483acf7f1f885e0a721258245972102": { "Name": "doc_pytorch_1", "EndpointID": "133e8353017c7d556a843178da63f49bfd031e126130e4661b10acf43dc327d3", "MacAddress": "02:42:ac:1f:00:02", "IPv4Address": "172.31.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "doc", "com.docker.compose.version": "1.27.4" } } ] ``` このように自動で同じネットワークに割り当てられました。 そして、JupyteLabでlocalhost:2222に接続して、 ```python from selenium import webdriver # Chrome のオプションを設定する options = webdriver.ChromeOptions() options.add_argument('--headless') # Selenium Server に接続する driver = webdriver.Remote( command_executor='http://localhost:4444/wd/hub ', desired_capabilities=options.to_capabilities(), options=options, ) # Selenium 経由でブラウザを操作する driver.get('https://qiita.com ') print(driver.current_url) # ブラウザを終了する driver.quit() ``` を実行したのですが、別コンテナからアクセスした時と同じエラーが出てしまいました。(最初のエラーと同じなので省略) どこを変更すればうまくいきますでしょうか?
keisuke0919

2020/12/10 12:24

'http://localhost:4444/wd/hub ' → '172.31.0.3:4444/wd/hub 'に変更したら接続できました! Dockerにこんな機能があったのを初めて知りました。 また、今までipアドレスというのを意識したことがなかったので、大変参考になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問