Python らしいコードの書き方
私はCやPerlなどの言語で長くやってきてたのですがPythonは本当に初心者で、記法や変数の扱いが少し特殊なのですぐ忘れてしまう。最近はネットでサンプルがすぐ調べられるのですが、記法をまとめてくれているページがあるのでそれらを以下にリンクさせていただきます。私がこのページからアクセスさせていただきます。
Python tips
私はCやPerlなどの言語で長くやってきてたのですがPythonは本当に初心者で、記法や変数の扱いが少し特殊なのですぐ忘れてしまう。最近はネットでサンプルがすぐ調べられるのですが、記法をまとめてくれているページがあるのでそれらを以下にリンクさせていただきます。私がこのページからアクセスさせていただきます。
前回から少し前進して、ログインしてページ情報をゲットしたいと思います。
前回も参考にあげたこのページのやり方だと、どうしても例外になってしまう。いろいろ動きを調べると、正しくページが取得出来ていなかったり、HTMLの要素が取り出せていないようだ。
ポイントは
+ 目的のページがロードされるまで待つ処理
+ クリックするリンクをたどる取るためのHTML要素取得
の部分を直す。
ページをの取得をする際に、implicitly_wait()関数で待ち時間を指定する方法があるが、WebDriverWait()関数を使って、タイムアウト例外で処理した方が処理が簡単そう。
ChromeでSBI証券のページに行って検証してみると、Aタグ以下にLink textが設定されていないケースもあり、上記参考ページの例ではリンクをたどる要素がうまく取得できないことが分かった。XPATHを使って、下位のimgタグで、altテキストに”口座管理”という文字列を持つ要素を探す、というようにしてみた。
user_id
とuser_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
を解析して、口座の詳細情報をデータとして取り出します。
Anacondaで作った環境に突っ込みます。いろんな作業の裏で処理したいのでヘッドレスなPhantomJSというブラウザを使ってみたいと思います。anacondaにパッケージがあったというのもポイント。beautifulsoup4は、HTMLを解析したりするのに使う。
Anacondaで適当に作った環境のTerminalを開いて、以下のようにパッケージを入れていきます。
conda install beautifulsoup4
conda install phantomjs
pip install selenium
とりあえず、seleniumを動かしてみる。
python
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from selenium import webdriver
>>> driver = webdriver.PhantomJS()
>>> driver.get('https://www.sbisec.co.jp/ETGate')
>>> driver.save_screenshot("sbi.png")
True
>>> driver.quit()
カレントディレクトリにsbi.png
というファイルが出来て、開いたら、SBIのトップページの画像が出来ていたら成功。
次はSBI証券の口座情報をゲット(未だ書けてません)しようと思います。
class foo:
def __init__(self, val_1, val_2):
self.val1 = val_1
self.val2 = val_2
afoo = foo(10, 20)
print(vars(afoo))
>>>
{'val1': 10, 'val2': 20}