この記事は何?
Seleniumを使って並列でwebdriverをぶん回してやりたいと思った時のサンプルです。(例えば自社のサービスに手操作と同じルーチンで大量データを作成したい場合など)
巷のSeleniumHowtoは単一プロセスでwebdriverを利用するケースは多々あるのですが、並列で回す例はあまりなく、かつpythonで並列処理というサンプルもあまりなかったので、書き起こしました。
早速ですがサンプルです。
実行環境
Python 3.6.4
selenium (3.11.0)
以下の様な感じになります。
from selenium import webdriver
from selenium.webdriver import Chrome
import concurrent.futures
def driverfunc(order):
drvpath="C:/mydriverpath/chromedriver.exe"
driver = webdriver.Chrome(drvpath)
# basic認証の場合はユーザー:パスワード@サイトURLでgetできる
driver.get("http://basicuser:basicpass@example.com")
# ==============================================
# 以下seleniumでの自動処理を記述する。
# ==============================================
driver.close()
# 並列実行するテストケースの配列
# このサンプルはあくまでも書き方サンプルなのでデータは適当
testcase = [1,2,3,4,5]
# 並列実行するexecutorを用意する。
# max_workers が最大の並列実行数
executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
for t in testcase:
executor.submit(driverfunc,t)
注意する点
-
concurrent.futures.ThreadPoolExecutor
のmax_workers
が同時実行数になる。- 当然僕らのChromeはじゃぶじゃぶメモリを食うの、で少ない数で試して閾値を決めよう。
- 当然アクセスされるサイトも並列で処理されるので、スクレイピングなんかで使うと×××される可能性もあると思うので注意
-
executer.submit()
でexecuter.submit(func(arg))
というような書き方をすると、シングルスレッドで実行されるだけで並列処理されない。ドキュメント記載の通り、executer.submit(func,arg)
と書いて引数を渡そう。 - このサンプルは
headless
で実行していないので、ブラウザがworkerの数立ち上がる。煩わしいったらないので、headless推奨。
参考サイト
concurrent.futures -- 並列タスク実行 — Python 3.7.4 ドキュメント
https://docs.python.org/ja/3/library/concurrent.futures.html#threadpoolexecutor
【Python】マルチスレッドでSeleniumのFirefoxを複数起動する方法 - あずみ.net
https://a-zumi.net/python-selenium-multithread/