前回の記事でCronが動く環境が手に入ったので、今度はSeleniumが使えるようにします。
このログは、こちらのレポジトリでDjango+Dockerセットアップ後の環境を想定しています。
Seleniumはブラウザを使った自動化ツールで、例えばE2E(エンドツーエンド)テストで採用されています。
目的の検証を自動で行えるため、精度や時間やコストの面で恩恵が得られるのかなと思います。
また、スクレイピング目的でもよく使われているみたいです。
それでは実際に動く環境を作っていきます。
例によってDocker環境のため、こちらも調べるのが大変でした…
Seleniumコンテナのセットアップ
E2E(エンドツーエンド)テストで使われる場合は複数のブラウザコンテナをHubを介して制御するみたいですが、
僕の場合、スクレイピングなのでスタンドアローンのChromeコンテナのみをセットアップします。
1 2 3 4 5 6 7 8 9 10 |
django: links: - selenium selenium: image: selenium/standalone-chrome-debug container_name: 'nuxt_django.selenium' ports: - 4444:4444 - 5900:5900 |
djangoコンテナとLinksでつなげるのがポイントみたいですね。
ビルドします。
1 |
docker-compose up -d |
この時点で、デバッグビューワーとSeleniumのコンテナが手に入ると思います。
macではファインダーの「サーバーへ接続」で「vnc://localhost:5900」(パスワード:secret)を入力したらビューワーが起動しました。
どういう仕組みなのか謎です…
ちなみに、http://localhost:4444でSeleniumコンテナを確認できます。
DjangoにSeleniumをインストール
Djangoコンテナにはいり、 pipコマンドでSeleniumをインストールします。
1 2 |
docker-compose exec django bash pip install selenium |
これでSeleniumを動かせる環境も手に入りました。
この後は、例えば以下のようなコードを実行すると、バックグラウンドで処理をしてくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities def scrape(): # Selenium try: driver = webdriver.Remote( command_executor='http://selenium:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME ) # タイトルタグに「Python」が含まれているか確認 driver.get('http://www.python.org') print('Python' in driver.title) # 検索窓で「pycon」を検索したときに「No results found.」がソースに踏まれるか確認 elem = driver.find_element_by_name('q') elem.clear() elem.send_keys('pycon') elem.send_keys(Keys.RETURN) print('No results found.' not in driver.page_source) driver.close() driver.quit() except: import traceback traceback.print_exc() |
「vnc://localhost:5900」でデバッグビューワーを起動していると、ビューワー内で実際にブラウザが立ち上がって処理を中身を視覚的に確認できます。
手っ取り早く確認したい方は下記のレポジトリとかいいかなと思います。
以上です。