PythonとSelenium WebDriverを使ってChromeを自動操作する方法をわかりやすく説明します。Pythonで出来ることは実に多様ですが、なかでもスクレイピングや今回のブラウザ操作はよく用いられる使い方の1つです。
今回は「東京駅+ラーメン」のように「場所+好きな食べ物」をグーグル検索し、好きな食べ物ごとに新規にタブを開く操作をPythonで自動化します。
まずは以下の動画で完成したプログラムの動作を確認してみてください。
右のコマンドプロンプトで「東京駅」と入力すると、「東京駅+カレー」、「東京駅+ラーメン」・・のように食べ物ごとに新しいタブを開いて検索します。ここでは、5品目のタブを開いて、最後に先頭のタブに戻ります。この操作が20行に満たないPythonのコードで自動化できます。
では以下の目次の順序で説明します。
本記事の目次
今回使用した環境はWindows10です。Google ChromeとPythonはインストール済みの状態で行いました。Pythonをインストールしていない場合は、以下のページを参考にインストールしてください。
Chrome用のWebDriverのダウンロード
Selenium WebDriverを介してPC上のChromeを操作します。Selenium WebDriverは各種ブラウザごとにドライバが用意されていますので、今回は以下のサイトからChrome用のWebDriverをダウンロードします。
https://sites.google.com/a/chromium.org/chromedriver/downloads
上記のダウンロードサイトを開いたら、使用しているChromeのバージョンに該当するリンクをクリックします。この画面は随時更新されているので、配置が少し変わっている可能性があります。
以下のようなページが表示されたら、chromedriver_win32.zip
をダウンロードします。
ダウンロードしたファイルにはchromedriver.exe
というファイルが1つだけ圧縮されています。解凍したら、以下のように今回作成するプログラムと同じ階層にdriverフォルダ
を作成しその中に入れてください。
# プログラムフォルダの中身
├ driver/
│ ├ chromedriver.exe # WebDriver
│
├ browser_auto_foods.py # 今回作成するPytyonプログラム
Chromeのバージョンの調べ方
Chromeのバージョンを調べるには、Chromeのアドレスの部分にchrome://version
と入力します。すると以下のようにバージョンが表示されます。以下の画面のバージョンは「74
」です。
Chromeが自動更新されたらドライバも新しくする
通常の設定では、Chromeは自動更新されるので、知らないうちにドライバのバージョンと一致しなくなることがあります。そうするとselenium.common.exceptions.SessionNotCreatedException
というエラーが発生します。その時は、バージョンが一致するドライバをダウンロードし直します。
Seleniumモジュールのインストール
pip
を用いてSeleniumモジュールをインストールします。コマンドプロンプトを開いて、以下のコマンドを実行するとインストールできます。
C:¥Users¥Ichiro> py -m pip install selenium
このSeleniumモジュールがクライアントとなりWebDriverを操作します。モジュールの詳細については以下のPyPIのページで確認できます。
https://pypi.org/project/selenium/
ちなみにPython以外にもJavaやC#のクライアントもあります。
pyコマンド
(py.exe
:Python Launcher)を用いていますが、Pythonインタプリタにパスを通して使用している場合は、py
をpython
に読み替えてください。
Pythonプログラミング
今回のプログラムは以下のコードだけです。場所と一緒に検索する好きな食べ物は「カレーからお好み焼きまで」の5品目ですが、もっと検索したい場合にはfavorite_foods
に追加します。
# browser_auto_foods.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
chrome = webdriver.Chrome("./driver/chromedriver.exe")
location = input("場所入力:")
favorite_foods = ["カレー", "ラーメン", "チャーハン", "とんかつ", "お好み焼き"]
for i, food in enumerate(favorite_foods):
if i > 0:
# 新しいタブ
chrome.execute_script("window.open('','_blank');")
chrome.switch_to.window(chrome.window_handles[i])
# グーグルを開く
chrome.get("https://www.google.co.jp")
# 検索ワード入力
search_box = chrome.find_element_by_name("q")
search_words = location, food
search_box.send_keys(" ".join(search_words))
# 検索実行
search_box.send_keys(Keys.RETURN)
print(chrome.title)
# 先頭のタブに戻る
chrome.switch_to.window(chrome.window_handles[0])
WebDriverオブジェクトの作成
まず、webdriver.Chrome()
のかっこ内にダウンロードしたchromedriver.exe
のパスを指定して実行しchrome
変数に代入します。後は、このchrome
変数にアクセスしてChromeを操作します。
新しいタブの開き方
新しいタブを開くには、JavaScriptのコード(window.open('','_blank');
)をChromeに送信して実行します。他に「Ctrl+Tのキー」を送信する方法もありますが、今回はJavaScriptのコードを実行する方がうまく動作しました。
次に新しく開いたタブに移動します。i
番目のタブはchrome.window_handles[i]
で取得できるので、chrome.switch_to.window()
のかっこ内に指定して実行すれば移動します。
検索ワードの入力と検索実行
プログラムで「検索ボックス」に検索ワードを入力するには、まずHTMLの構造を解読して該当する要素を特定します。グーグルの検索ボックスは、以下のようにname
属性が"q"
のinput
要素です。
このinput
要素を取得するにはfind_element_by_name()
を用います。かっこ内にname
属性の値"q"
を指定して取得できます。
search_box = chrome.find_element_by_name("q")
ここに検索ワードを入力してEnterキー(RETERN)を送信すれば、ブラウザで検索する操作を再現できます。
search_box.send_keys(" ".join(search_words))
search_box.send_keys(Keys.RETURN)
すべての検索が終了したら、先頭のタブに移動します。
chrome.switch_to.window(chrome.window_handles[0])
HTML要素の特定方法
1つのホームページからHTML要素を特定するには、「CSSセレクタ」と「XPath」による2通りの方法があります。Seleniumモジュールは以下のドキュメントにあるようにどちらにも対応しています。
https://selenium-python.readthedocs.io/locating-elements.html
Seleniumモジュールに用意されているメソッドの中から、今回はname属性のCSSセレクタに特化したfind_element_by_name()メソッド
を利用しました。このように通常は簡潔に書けるCSSセレクタの方をよく用います。CSSセレクタは、大抵のHTML+CSSの教科書で学べます。
プログラムの実行
WindowsにPythonをインストールするとデフォルトでは、拡張子.py
のファイルにはPythonランチャ(py.exe
)が関連付いているので、ダブルクリックで実行できます。
そこで、今回はデフォルトでPythonがインストールされている状態を想定して、作成したプログラムのファイルbrowser_auto_foods.py
をダブルクリックして実行します。実行すると、
1)最初にコマンドプロンプトが起動し、
2)次にChromeが起動します。Chromeには以下のように、自動テストソフトウェア、つまりWebDriverで制御されていることが表示されます。
3)あとはコマンドプロンプトに場所を入力してEnterキーを押せばChromeで検索が始まります。
改良のポイント
Seleniumモジュールを利用すれば、他にも「リンクをクリックする」、「フォームに入力して送信する」、「スクリーンショットを撮る」、「ブラウザの戻るボタンをクリックする」など、様々な操作を自動化できます。
Seleniumモジュールの機能については以下の公式ドキュメントを参照してください。
https://selenium-python.readthedocs.io
なお、今回の状態でもプログラムは問題なく動作しますが、コマンドプロンプトに逐次細かなエラーが表示されるので、以下のコードを追加してログのレベルを下げた方が使い勝手が良くなります。
.....
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--log-level=3")
chrome = webdriver.Chrome("./driver/chromedriver.exe", chrome_options=options)
.....
最後に
実際にPythonで書いてみると、案外短いコードで実現できることに驚くことがあります。それがPythonの魅力でもあります。
プログラミングで何が出来るかは、文章を読んだだけではなかなか理解できませんが、まずはつくって動かしてみるとその価値がわかります。
コードの意味がわからなくても、まずは記事のまま動かしてみてください。プログラミングを始めたくなるはずです。