クレジットカードの利用明細はこまめにチェックする必要がある。なぜなら、カードの不正使用などの危険があるからだ。しかし、最近ではオンライン明細が推奨されており、カード会社のサイトにログインして、明細をダウンロードしなければならないことも多い。カードが複数枚あるなら、それはかなり面倒な作業となる。そこで、自動でカード明細をダウンロードするプログラムを作ってみよう。今回は、環境の構築をし、簡単なプログラムを作ってみよう。

  • Webブラウザを自動操縦しているところ

    Webブラウザを自動操縦しているところ

Webブラウザを自動操作しよう

PythonにはデータをWebから取得する命令がいろいろある。最も簡単なのは、Pythonに標準で用意されているurllib.requestだ。これを使うと任意のURLからデータを取得できる。しかし、最近のWebサイトは、セッションという仕組みを利用していたり、JavaScriptでページをレンダリングしたりすることも多い。この場合、単にURLを指定してデータを取得しただけでは、エラーとなり目的のページにたどり着けないことが多い。そこで、抜本的な解決方法として、WebブラウザをPythonで自動操縦するなら、確実に目的のページにたどり着くことができる。

自動操縦の定番Seleniumライブラリを使おう

Webブラウザを自動操縦するには、Seleniumというライブラリを利用するのが定番だ。しかも、Seleniumは様々なWebブラウザに対応している。逆に言うと、このライブラリに加えて、自動操縦したいブラウザに対応したドライバを追加インストールする必要がある。

今回は、Google Chromeを自動操作するため、ChromeDriverをインストールしてみよう。ここでは、Python標準のpipコマンドを利用してライブラリをインストールする。また、当然ながら、Google Chromeをインストールしてあることが大前提だ。

WindowsでAnacondaを利用している場合は、スタートメニューから「Anaconda3 > Anaconda Prompt」を起動して、以下のコマンドを入力しよう。(macOSならターミナル.appを起動して以下のコマンドを入力しよう。)

pip install selenium

続いて、ChromeDriverをインストールしよう。ChromeDriverもpipコマンドでインストールできる。

pip install chromedriver-binary

ただし、Pythonのプログラムからドライバのインストールパスを指定する必要があるので、pipでインストールしたパッケージがどこにインストールされているのか確認しておこう。

pip show chromedriver-binary

以下は、筆者がWindowsで試したところだ。Locationで示されるパスのところにインストールされる。このフォルダ以下にあるchromedriver-binary以下に、chromedriver.exe(macOSでは、chromedriver)という実行ファイルがあるのを確認しよう。

  • pip showでインストールパスが確認できる

    pip showでインストールパスが確認できる

次に、このドライバファイルを環境変数PATHに登録されているフォルダにコピーしよう。どのフォルダにパスが通っているかを確認するには、コマンドラインで以下のように実行しよう。

# Windowsの場合
echo %PATH%


# macOSの場合
echo $PATH

もし、よく分からなければ、この後紹介するPythonのプログラムにあるSeleniumのChromeDriverの初期化コードを次のように書き換えれば良い。

driver = webdriver.Chrome()

   ↓

path = r"C:\Users\(ユーザー名)\Anaconda3\Lib\site-packages\chromedriver_binary\chromedriver.exe"
driver = webdriver.Chrome(path)

自動操縦の基本をマスターしよう

それでは一番簡単な例として、Chromeブラウザを起動して、本連載「ゼロからはじめるPython」をGoogle検索するというプログラムを作ってみよう。以下のプログラムを「hello.py」という名前で保存する。

import time
from selenium import webdriver

# Chromeを起動する --- (*1)
driver = webdriver.Chrome()
# Googleのページを開く --- (*2)
driver.get('https://www.google.com')
# ページが開くまで待つ --- (*3)
time.sleep(5) 
# 検索ボックスのオブジェクトを得る --- (*4)
q = driver.find_element_by_name('q')
# 検索ボックスにキーを送信する --- (*5)
q.send_keys('ゼロからはじめるPython')
# フォームを投稿する --- (*6)
q.submit()
# 結果を30秒表示して終了する --- (*7)
time.sleep(30)
driver.quit()

そして、コマンドラインから以下のように実行しよう。

python hello.py

実行すると、以下の画像のように「Chromeは自動テスト ソフトウェアによって制御されていうます」という画面が出て、Googleの画面が表示され、続いてテキストボックスに、検索ワードが挿入され、検索が行われる。

  • Chromeを自動操縦して検索を行ったところ

    Chromeを自動操縦して検索を行ったところ

ChromeDriverがうまく動かなかった場合

もし、上記のサンプルが動作しない場合には、ChromeとChromeDriverのバージョンが異なっている可能性がある。この場合、「This version of ChromeDriver only supports Chrome version XX」のように、バージョンが合わない旨のメッセージが表示される。

一度、Chromeを起動して、メニューから「ヘルプ > Chromeについて」をクリックして、Google Chromeのバージョンを確認しよう。その後、以下のWebサイトでインストールしているChromeと同じバージョンのChromeDriverをダウンロードし、先ほどインストールしたChromeDriverを上書きする必要がある。

・任意のバージョンのChromeDriverのダウンロードサイト
http://chromedriver.chromium.org/downloads

プログラムを確認してみよう。プログラムはそれほど長くないが、比較的詳しい説明が必要だろう。一つずつ確認していこう。

(*1)の部分で、Chromeを起動する。この時点でエラーが出る場合、正しくChromeDriverのパスが認識できていないことが原因だ。どうしてもパスが認識できない場合、上記で紹介しているように『webdriver.Chrome("ドライバのパス")』のようにパスを指定してみよう。

(*2)のgetメソッドを実行すると、任意のURLのページを開くことができる。そして、当然ながらページを開くには時間がかかるので(*3)のように、time.sleep(秒数)を利用して、ページが開くのを待機するようにしよう。

(*4)の部分では、Googleのページ内にある、qという名前が振られた入力ボックスのオブジェクトをしている。しかし「q」とは何のことかと思うことだろう。実は、Googleのページ内には、<input name="q">というテキストボックスがあるのだ。

これは、Chromeの開発ツールを使うと調べることができる。Chromeの画面上で、右クリックしポップアップメニューから「検証」をクリックしよう(あるいは[F12]キーを押す)。すると開発ツールが表示される。それで、以下の画面の(1)のボタンをクリックし、続いて、Webページ上のテキストボックスをクリックしよう。すると、<input ... name="q" ...>と書かれているボックスを調べることができる。

  • Chromeの開発ツールを使うとページ内の要素を調べることができる

    Chromeの開発ツールを使うとページ内の要素を調べることができる

そして、(*5)の部分では、send_keysメソッドを使って、テキストボックスに任意のキーワードを送信し、(*6)のsubmitメソッドでGoogleのサーバーにフォームを投稿する。すると、画面が切り替わる。

(*7)では、再び、time.sleepで待機して、driver.quit()でChromeの自動操縦を終了するという流れだ。

まとめ

以上、今回は、PythonでChromeブラウザを自動操縦するために必要な環境の構築方法と、簡単なプログラムを実行するまでの部分を紹介した。次回は、実際に会員制のサイトにログインし、データをダウンロードするプログラムを紹介するのでお楽しみに。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。