Dockerで構築したJupyterLab環境からSeleniumを動かす

プログラミング
この記事は約7分で読めます。
Web操作の自動化やスクレイピングに利用できるSeleniumをDockerで構築したJupyterLab環境から動かす方法を紹介します。

Dockerについて

Dockerとは、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

上記記事でWindows 10へのインストール方法を紹介しています。ぜひご覧ください。

JupyterLab について

JupyterLab(ジュピター・ラボ)とは、ブラウザ上で動作する対話型実行環境です。

上記記事でJupyterLabの導入方法を紹介しています。ぜひご覧ください。

Seleniumについて

Seleniumとは、ブラウザ操作を自動化するツールとライブラリのことで、JavaやPython、Ruby、JavaScriptなどから利用できます。

Chrome、Firefoxm、Edge、Internet Explorer、Safari、Operaと主要ブラウザに対応しています。

Docker上のイメージ図

Docker上にあるJupyterLabサーバとSeleniumサーバ、あとnoVNCサーバのイメージ図です。

JupyterLabとは別のコンテナをたててSeleniumを動かします。

VNCは、Virtual Network Computingと略で遠隔操作用のソフトウェアです。Seleniumサーバでブラウザが動く様子をVNCサーバを介して見ることができます。

noVNCは、VNCクライアントがブラウザになったものです。通常、VNCビューアというソフトウェアを利用しないとVNCサーバに接続できないのですが、ブラウザからVNCサーバにアクセスできるようにしたものです。

このあと示すdocker-compose.ymlで、Python396コンテナでポート番号を8008:8888で、Selenium_firefoxコンテナでポート番号を7979:7900で指定したときはこのようになります。

JupyterLabサーバ自体はポート番号8888番でアクセスを受ける設定になっていますが、コンテナの外からはポート番号8008番でアクセスすることになります。

また、 noVNCサーバ自体はポート番号7900番でアクセスを受ける設定になっていますが、コンテナの外からはポート番号7979番でアクセスすることになります。

実施環境

  • Windows 10 バージョン21H1(OSビルド 19043.1165)
  • Docker Desktop 4.0.0(Docker Engine 20.10.8)

実施環境はこちらです。

構築手順

上記の記事と同じようにpython 3.9.6のイメージをベースに、JupyterLabをインストールしたイメージをビルドして作り、コンテナを起動することにします。

構成

まず、Dockerfiledocker-compose.ymlは上記のような構成にします。

python396_selenium用のDockerfileとselenium_firefox用のDockerfileは場所をわけておきます。

本記事では、WindowsのE:\workの場所に配置しました。

python_seleniumのDockerfile

python_seleniumのDockerfileはこちらです。

下記のことを実施しています(Seleniumをインストールしているところだけがコチラの記事との違い)。

  • python 3.9.6をベースに
  • pipをアップグレードして、JupyterLabとSeleniumをインストール
  • コンテナのワークディレクトリを/JupyterLabに、リッスンポート番号を8888番に設定
  • コンテナ起動時にjupyter-labコマンドを実行して、下記設定をおこなう
    • IPアドレス接続制限なし
    • ポート番号8888でアクセスを受ける
    • ブラウザを起動しない
    • rootでの実行を許可
    • トークンなしでのアクセスを許可
    • 作業ディレクトリを/JupyterLabに設定

selenium_firefoxのDockerfile

selenium_firefox のDockerfileはこちらです。

SeleniumのFirefox版のDockerイメージを持ってくるだけです。

docker-compose.yml

docker-compose.ymlは上記の内容になります。

python396_seleniumセクションではpython396_seleniumというイメージからpython396_selenium_containerという名前のコンテナを起動するように指定しています。

ポート番号については、8008番で受けてコンテナ内は8888番に流す、という設定です。

同様にselenium_firefoxセクションではselenium_firefoxというイメージからselenium_firefox_containerという名前のコンテナを起動するように指定しています。

ポート番号については、7979番で受けてコンテナ内は7900番に流す、という設定です。

このようにpython396_seleniumセクションとselenium_firefoxセクションを同時に起動することでhttp://selenium_firefox:4444/wd/hubでJupyterLabからSeleniumにアクセスすることができます(Seleniumはデフォルトでポート番号4444番でリッスンしています)。

PowerShellでの構築

Dockerfiledocker-compose.ymlを作ったら、PowerShellを開いてE:\workに移動します。

docker buildコマンドでDocker HubからDockerfileに記載の内容にしたがってDocker imageを作ります。

イメージが作り終わったらdocker-composeコマンドでコンテナを起動させます。-dオプションでバックグラウンドで起動になります。

Docker Desktop上での表示

Docker Desktop上で見ると、このように見えます。

JupyterLabの確認

コンテナが起動したらブラウザでJupyterLabとnoNVCにアクセスできるようになります。

http://localhost:8008/labにアクセスすると、JupyterLab環境が表示されます!

noNVCの確認

http://localhost:7979にアクセスすると、noVNCが表示されます!

JupyterLabからSeleniumから動かす

noNVCに接続する

まずはnoNVCに接続しましょう。

【接続】をクリックします。

パスワードには「secret」を入力して【資格情報を送信】をクリックします。

無事接続できると上記のような画面が表示されます。

Seleniumを動かす

それではいよいよJupyterLabからSeleniumを動かしてみましょう。

このコードをセルに貼り付けて【Shift + Enter】を押します。

https://www.google.com/にアクセスするだけの単純な処理ですね。

noNVCの画面を見るとこのようにGoogleの画面にアクセスできているのがわかります。

まとめ

DockerでJupyterLab環境とSelenium環境を構築して、JupyterLabからSeleniumを利用する方法を紹介しました。

JupyterLabコンテナとSeleniumコンテナを別々に起動させてコンテナ同士をやり取りさせています。

Seleniumが不要なときはコンテナを起動させなければ良いだけなので、Dockerは楽ですね。

タイトルとURLをコピーしました