クラスの継承とオーバーライド

## オーバライドした関数が親クラスからも呼ばれる例


class base(): def __init__(self): return def a(self): print ("base") def b(self): self.a() class inhe(base): def __init__(self): return def a(self): print("infe") if __name__ == '__main__': inhe = inhe() inhe.b()

この結果はちゃんと

infe

となる。

Python らしいコード

Python らしいコードの書き方

私はCやPerlなどの言語で長くやってきてたのですがPythonは本当に初心者で、記法や変数の扱いが少し特殊なのですぐ忘れてしまう。最近はネットでサンプルがすぐ調べられるのですが、記法をまとめてくれているページがあるのでそれらを以下にリンクさせていただきます。私がこのページからアクセスさせていただきます。

リンク集

Webサイトに自動ログインして情報収集2

SBI証券にログインして口座情報を取得する

前回から少し前進して、ログインしてページ情報をゲットしたいと思います。

リンク情報の取得に悩む

前回も参考にあげたこのページのやり方だと、どうしても例外になってしまう。いろいろ動きを調べると、正しくページが取得出来ていなかったり、HTMLの要素が取り出せていないようだ。
ポイントは
+ 目的のページがロードされるまで待つ処理
+ クリックするリンクをたどる取るためのHTML要素取得
の部分を直す。

WebDriverWait

ページをの取得をする際に、implicitly_wait()関数で待ち時間を指定する方法があるが、WebDriverWait()関数を使って、タイムアウト例外で処理した方が処理が簡単そう。

Elementの取得にはXPathを使う

ChromeでSBI証券のページに行って検証してみると、Aタグ以下にLink textが設定されていないケースもあり、上記参考ページの例ではリンクをたどる要素がうまく取得できないことが分かった。XPATHを使って、下位のimgタグで、altテキストに”口座管理”という文字列を持つ要素を探す、というようにしてみた。

上記二つの対策を立てたコード

user_iduser_passwordには、ログインIDとパスワードを指定して下さい。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common import exceptions as selExceptions
def fetch_sbi_account_html(user_id,user_password):
    driver = webdriver.PhantomJS()
    print('driver start')
    driver.get('https://www.sbisec.co.jp/ETGate')
    try:
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.NAME, "user_id"))
        )
    except selExceptions.TimeoutException:
        driver.quit()
        print("Give up loading start page.")
        quit()
    else:
        print ("Success:load entry page.")
        driver.save_screenshot("screen1.png")

    uid = driver.find_element_by_name('user_id')
    password = driver.find_element_by_name('user_password')
    uid.send_keys(user_id)
    password.send_keys(user_password)

    driver.find_element_by_name('ACT_login').click()
    try:
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.XPATH, '//img[@alt="口座管理"]'))
        )
    except selExceptions.TimeoutException:
        driver.quit()
        print("Give up loading logined page.")
        quit()
    else:
        print ("Success:load logined page.")
        driver.save_screenshot("screen2.png")

    html = driver.page_source
    driver.quit()
    print('driver quit')
    return html

この関数をuser_idとuser_passwordを設定して呼び出して、screen2.pngというファイルにきちんと中身が出来ていればOK。

次回は、返却されたhtmlを解析して、口座の詳細情報をデータとして取り出します。