中安拓也のブログ

プログラミングについて書くブログ

【Python】[Selenium]クレジットカードの利用明細をダウンロードする

Pythonを練習しようパート1

Pythonの入門書を読んでから数ヶ月...全くパイソンを書かない日々が続いたので、勉強がてらクレジットカード利用明細のダウンロードをやってみました

出典

ゼロからはじめるPython(49) Pythonでブラウザ自動操縦してカード明細を自動でダウンロードしよう(その1) | マイナビニュース

ゼロからはじめるPython(50) Pythonでブラウザ自動操縦してカード明細を自動でダウンロードしよう(その2) | マイナビニュース

上の記事を見ながらカタカタと実装していきます。

バージョン情報

PCはmacOS Mojave(10.14.6)

  • selenium: 3.141.0
  • chrome: 76.0
  • ChromeDriver: 76.0
  • Python 3.7.3

SeleniumとChromeDriverのインストール

ChromeブラウザをPythonから操作することによってクレジットカードの利用明細をダウンロードするので、 UIテスト自動化ツールのSeleniumとChromeDriverをインストールが必要になります。

まずpip installコマンドでSeleniumをインストール。

$ pip install selenium

Chrome driverについては手動でPATHを通すのが面倒だったので、pip installではなくHomebrewでインストールをしました。

$ brew install chromedriver

brew install chromedriverを実行した結果下記のエラーメッセージが出力されて失敗。

Error: No available formula with the name "chromedriver" 
Found a cask named "chromedriver" instead. Try
  brew cask install chromedriver

エラーメッセージに従って下記のコマンドでChrome driverのインストールを実行し、成功。

$ brew cask install chromedriver

テストプログラムの実行

環境構築(SeleniumとChromeDriverのインストール)ができていることを確認するために、下記のテストプログラムを実行します。

  • hello.py
import time
from selenium import webdriver

# Chromeを起動する
driver = webdriver.Chrome()
# Googleのページを開く
driver.get('https://www.google.com')
# ページが開くまで待つ
time.sleep(5)
# 検索ボックスのオブジェクトを得る
q = driver.find_element_by_name('q')
# 検索ボックスにキーを送信する
q.send_keys('まちカドまぞく')
# フォームを投稿する
q.submit()
# 結果を30秒表示して終了する
time.sleep(30)
driver.quit()

テストプログラムの内容としては、Chromeブラウザを開いてまちカドまぞくについて検索するというもの。

下記のコマンドでテストプログラムを実行します。

$ python hello.py

実際にテストプログラムを実行した結果、下記のエラーが表示されて失敗しました。

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 76

Chrome driverとChromeのバージョンが一致していないことが原因のエラーとなります(ChromeDriverのバージョンが76なのに、Chromeブラウザのバージョンが72だった)。

Chromeのバージョンを76にアップグレードして、再度テストプログラムを実行したところ成功しました

f:id:l08084:20190827234011p:plain
テストプログラム成功

クレジットカード利用明細のダウンロード

では環境構築が完了したので、実際にクレジットカード明細のダウンロードをやっていきます。

注意事項

明細取得に進む前に注意事項ですが…自動でログインするのを禁じているサイトなどもあるため、事前にサイトの利用規約を読んでおきましょう

実装

ドコモユーザーでもないのにDカードを使っているので、Dカードの利用明細を取得するコードを書いていきます。

ドコモのクレジットカード(Dカード)の利用明細をダウンロードするコード

上のコードでは、find_element_by_nameでエレメントのname属性をキーに、ユーザID欄とパスワード欄を取得して、値を入力してログインしてから、
利用明細ページで利用明細のCSVをダウンロードするメソッドを呼び出す...といった処理をやっています。

ユーザIDとパスワードについては、Gitに間違えてアップしたら大変なので、.gitignoreに設定しているファイルに定義しています。

  • d_credentials.py
ID = "XXXXXXXXX"
PASS = "XXXXXXXXX"

上のプログラムを実行すると、Chromeブラウザが立ち上がって、ユーザIDとパスワードを自動で入力して明細のCSVをダウンロードしてくれます。

$ python download_d-card.py

f:id:l08084:20190903214229p:plain
プログラム実行時

遭遇したエラー

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a href="javascript:void(0)" onclick="doSubmitForm(document.download_form);">...</a> is not clickable at point (891, 803). Other element would receive the click: <td scope="col" colspan="4"></td>

Pythonで利用明細のダウンロードリンクをクリックしようとする過程で上記のエラーに遭遇しました。

利用明細CSVのダウンロードリンク<a href="javascript:void(0)" onclick="doSubmitForm(document.download_form);">...</a>が他のエレメントに邪魔されてクリックできないというエラーになります。

最終的にCSVダウンロードリンクをクリックするのを諦めて、execute_scriptで直接DカードのWebサイト側で定義しているCSVのダウンロードメソッドdoSubmitForm(document.download_form)を呼び出すことで解決しました。

参考サイト

Selenium利用時のトラブルシューティング方法[クリック編]

おわりに

自慢じゃないけどクレジットカードの明細みるの1年ぶりくらいです...(家で見たことないから実家に届いてるのかもしれない