自分基準

自分の思ったことを気ままにメモ代わりに書いていこうかと

Pythonでスクレイピング2(Selenium):UFJの残高取得

前回に引き続きPythonとSeleniumを使ってスクレイピングを行ったのでそのメモ。 今回は三菱東京UFJ銀行のネットバンキングから残高を取得してみた。

ソースコード

とりあえず先に今回作ったソースコードを載せる。

# -*- coding:utf-8 -*-
import time
from selenium import webdriver

#URL
MUFG_URL = 'https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001'

# MUFG_ID&Pass
ID = "***"
PASSWORD = "***"

try:
    browser = webdriver.Chrome()
    browser.get(MUFG_URL)
    time.sleep(1.5)

    #ログイン
    browser.find_element_by_id('account_id').send_keys(ID)
    browser.find_element_by_id('ib_password').send_keys(PASSWORD)
    browser.find_element_by_class_name('admb_m').click()
    time.sleep(1)

    #口座残高取得
    s = browser.find_element_by_id("setAmountDisplay").text
    print(s)

finally:
    browser.quit()

1行目はutf-8の文字を使うという宣言をするためにある。
2行目はWebサイトにアクセスしてしばらく待つ作業が必要なのでそのための文
3行目は前回記載のSeleniumを使うための文

URLとID,Passを先に覚えさせておく

#URL
MUFG_URL = 'https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001'

# MUFG_ID&Pass
ID = "***"
PASSWORD = "***"

この箇所は最初にURLとID,Passを後で使うために、変数に代入しておく箇所
IDとPASSWORDには自分のアカウントのを記載しておく。

実際にアクセス

ここから実際にURLにアクセスする。

1.webdriverのセット
    browser = webdriver.Chrome()
    browser.get(MUFJ_URL)
    time.sleep(1.5)

まず始めにwebdriverを使うのでbrowserに結びつける。
次にbrowserにドライバが結びつけられているのでそこから.getを使って先ほど覚えさせたMUFJ_URLにアクセスする。
その後time.sleep()を使って上の例では1.5秒待っている。

2.IDとPassWordを入力

webdriverはfind_element_by_xxxを使うことでHTMLから要素を探しだしてくれる。 抜き出せる要素は様々で赤文字のxxxを変えることでidやclass_nameやxpathなどから取得できるが今回はユーザIDとパスワードはidから探してみる。

実際に三菱東京UFJ銀行のサイトにアクセスをしてみてHTMLのソースコードを確認してみると以下のようになっている。

(略)...
<input type="text" name="KEIYAKU_NO" id="account_id" value="" maxlength="22" tabindex="1" autocomplete="off" onkeydown="submitOnEnter(event);">
(略)...

ログイン - 三菱東京UFJ銀行より

f:id:nisiki_satika:20160504201811p:plain

拡大
f:id:nisiki_satika:20160504214027p:plain

拡大2
f:id:nisiki_satika:20160504214032p:plain

上記の事からユーザIDの入力箇所のid要素はaccount_idということが分かるので以下のように探索する。

browser.find_element_by_id('account_id')

そして抜き出した要素に先ほど代入しておいたIDを挿入するために.send_keys(ID)を文の下につなげる。そうすることで入力欄にIDの中身が挿入される。

※また、別に予め変数に代入しておかなくても

browser.find_element_by_id('account_id').send_keys("自分のid")

でも良い。

パスワードも同じようにしてHTMLからidを探し出してみるとib_passwordなので抽出するコードは以下の通りになる。

browser.find_element_by_id('ib_password').send_keys(PASSWORD)
3.ログインボタンをクリック

ユーザIDとパスワードを入力したら次はログインボタンをクリックする。 というわけでHTMLソースコードを確認してみるのだが今度はid要素がなく以下のとおりになっている。

<p class="acenter admb_m">

f:id:nisiki_satika:20160504204244p:plain

拡大1
f:id:nisiki_satika:20160504214504p:plain

拡大2
f:id:nisiki_satika:20160504214523p:plain

上記の事からログインボタンのHTMLのclassはacenter admb_mの2つということが分かるので今回は後者のadmb_mを指定する。 class_nameから探索してするには以下のとおりである。

browser.find_element_by_class_name('admb_m').click()

そして今度は文字を挿入するのではなくボタンをクリックするのが目的なので後ろに.click()をつなげる。 するとログインボタンがクリックされユーザIDとパスワードが間違ってなければログインできる。

残高の確認

ログインに成功したら今度は残高を取得するのが目的なので残高が記載されている箇所をまたしても同じように探してみる。 f:id:nisiki_satika:20160504210133p:plain

これがログイン後の画面でこの矢印の部分に残高が記載されているのでここを取得できれば良い。 ちなみにソースコードは以下の様になっている。

f:id:nisiki_satika:20160504210720p:plain

<p id="setAmountDisplay">xxx,xxx<span></span></p>

上記の事から口座残高はid要素のsetAmountDisplayに記載されていることがわかる。

なのでこれをテキストとして変数に代入する。

 s = browser.find_element_by_id("setAmountDisplay").text

最後に口座残高を代入した変数を表示すれば画面に残高が表示される。

 print(s)

ブラウザを終了するときは前回記載のbrowser.quit()で終了すれば良い。