PythonとSelenium WebDriverを使ってChromeを自動操作する方法をわかりやすく説明します。Pythonで出来ることは実に多様ですが、なかでもスクレイピングや今回のブラウザ操作はよく用いられる使い方の1つです。

今回は「東京駅+ラーメン」のように「場所+好きな食べ物」をグーグル検索し、好きな食べ物ごとに新規にタブを開く操作Pythonで自動化します。

まずは以下の動画で完成したプログラムの動作を確認してみてください。

右のコマンドプロンプトで「東京駅」と入力すると、「東京駅+カレー」、「東京駅+ラーメン」・・のように食べ物ごとに新しいタブを開いて検索します。ここでは、5品目のタブを開いて、最後に先頭のタブに戻ります。この操作が20行に満たないPythonのコードで自動化できます。

では以下の目次の順序で説明します。

本記事の目次

今回使用した環境はWindows10です。Google ChromePythonはインストール済みの状態で行いました。Pythonをインストールしていない場合は、以下のページを参考にインストールしてください。

最新版のPythonにインストールとIDLE起動の方法

Chrome用のWebDriverのダウンロード

Selenium WebDriverを介してPC上のChromeを操作します。Selenium WebDriverは各種ブラウザごとにドライバが用意されていますので、今回は以下のサイトからChrome用のWebDriverをダウンロードします。

https://sites.google.com/a/chromium.org/chromedriver/downloads

上記のダウンロードサイトを開いたら、使用しているChromeのバージョンに該当するリンクをクリックします。この画面は随時更新されているので、配置が少し変わっている可能性があります。

chrome webdriver

以下のようなページが表示されたら、chromedriver_win32.zipをダウンロードします。

webdriver download win32

ダウンロードしたファイルにはchromedriver.exeというファイルが1つだけ圧縮されています。解凍したら、以下のように今回作成するプログラムと同じ階層driverフォルダを作成しその中に入れてください。

# プログラムフォルダの中身
  ├ driver/
  │  ├ chromedriver.exe # WebDriver
  │   
  ├ browser_auto_foods.py # 今回作成するPytyonプログラム

Chromeのバージョンの調べ方

Chromeのバージョンを調べるには、Chromeのアドレスの部分にchrome://versionと入力します。すると以下のようにバージョンが表示されます。以下の画面のバージョンは「74」です。

chrome version

Chromeが自動更新されたらドライバも新しくする

通常の設定では、Chromeは自動更新されるので、知らないうちにドライバのバージョンと一致しなくなることがあります。そうするとselenium.common.exceptions.SessionNotCreatedExceptionというエラーが発生します。その時は、バージョンが一致するドライバをダウンロードし直します。

Seleniumモジュールのインストール

pipを用いてSeleniumモジュールをインストールします。コマンドプロンプトを開いて、以下のコマンドを実行するとインストールできます。

C:¥Users¥Ichiro> py -m pip install selenium

pip install selenium

このSeleniumモジュールがクライアントとなりWebDriverを操作します。モジュールの詳細については以下のPyPIのページで確認できます。

https://pypi.org/project/selenium/

ちなみにPython以外にもJavaやC#のクライアントもあります。

ここではpyコマンドpy.exe:Python Launcher)を用いていますが、Pythonインタプリタにパスを通して使用している場合は、pypythonに読み替えてください。

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要素です。

google input element

この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)最初にコマンドプロンプトが起動し、

cmd launch

2)次にChromeが起動します。Chromeには以下のように、自動テストソフトウェア、つまりWebDriverで制御されていることが表示されます。

chrome launch

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の魅力でもあります。

プログラミングで何が出来るかは、文章を読んだだけではなかなか理解できませんが、まずはつくって動かしてみるとその価値がわかります。

コードの意味がわからなくても、まずは記事のまま動かしてみてください。プログラミングを始めたくなるはずです。