2017年07月12日

Python + Seleniumによるヨドバシカメラ注文履歴の取得

Amazon注文履歴取得の時にも書きましたが、家計管理上、毎月の自分が使った分は分類でまとめたEXCELを作成して妻に送っています。そのデータには自分のクレジットカードの内容も含まれています。クレジットの明細だけだと、何を買ったのか分からないため過去の履歴を知りたい時があります。実はよっぽどのことが無い限り紙の本はAmazonではなくヨドバシで買っているので、ヨドバシの履歴も必要になります。

今回は「Python + Selenium」で取得してみました。備忘録替わりのソースコードは後回しで先に実行方法と結果です。

必要なもの

Seleniumとchromdriver(ブラウザにChromeを使っているので)をインストールしました。

コマンドと実行結果

引数にID(メールアドレス)とパスワードを渡して実行して3か月分の結果を取得します。
> python.exe .\yodobashi_order_history.py <ID> <Password>
Navigating...
Signing in...
---------------
注文日:2017年7月7日 注文番号:2142606149 ヨドバシ・ドット・コムでのご注文: 配達受取商品
  Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド- [ムックその他]
---------------
注文日:2017年6月11日 注文番号:2141144933 ヨドバシ・ドット・コムでのご注文: 配達受取商品
  リンスインシャンプー つめかえ用 [400ml]
  Fシステムサムライエッジ 8P [T字カミソリ替刃]
---------------
注文日:2017年4月22日 注文番号:2138765666 ヨドバシ・ドット・コムでのご注文: 配達受取商品
  KF-C118G-3A [microSDHCカード 8GB Class4]
  BSCR19U2WH [高速カードリーダー/ライター ホワイト]
値段は出力できていないのですが、クレジット明細に出ているのでわざわざ出力しなくても良いかなと思って出力していません。

つづいてソースコードです。

ソースコード

こちらも基本は「Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド」を読みつつSelenium用にベースのコードを拡張しただけですが。
import sys
import os
import bs4
import re
from selenium import webdriver
from selenium.webdriver.support.ui import Select

# chromeを起動させる
browser = webdriver.Chrome("chromedriver.exe")

# 認証の情報は引数から取得する。
YODOBASHI_EMAIL = sys.argv[1]
YODOBASHI_PASSWORD = sys.argv[2]

def main():
# 注文履歴のページを開く。
print('Navigating...', file=sys.stderr)
browser.get('https://order.yodobashi.com/yc/mypage/index.html')

# サインインページにリダイレクトされていることを確認する。
assert 'ログイン:ヨドバシ・ドット・コム' in browser.title

# IDとPASSWORDを入力
input_element = browser.find_element_by_name('memberId')
input_element.send_keys(YODOBASHI_EMAIL)
input_element = browser.find_element_by_name('password')
input_element.send_keys(YODOBASHI_PASSWORD)

# フォームを送信する。
print('Signing in...', file=sys.stderr)
botton_element = browser.find_elements_by_class_name('strcBtn30')
botton_element[0].click()

# 会員用ページかどうかを確認する
assert '会員のお客様専用ページ:ヨドバシ・ドット・コム' in browser.title
# 注文履歴に移動
botton_element = browser.find_elements_by_class_name('yBtnInner')
botton_element[0].click()

# 表示する注文履歴の設定を変更
pulldown_element = browser.find_elements_by_id('selectedPeriod')
select_obj = Select(pulldown_element[0])
select_obj.select_by_visible_text('過去3ヶ月以内のご注文')
botton_element = browser.find_elements_by_class_name('yBtnText')
botton_element[4].click() # 0:ご注文番号から検索 1:再注文 2:未配達 3:キャンセル 4:更新

# 注文履歴を表示する。
print_order_history()

def print_order_history():
for orderInformation in browser.find_elements_by_class_name('orderDetailBodyInner'):
print("---------------")
# 不要な行を削除。改行がある場合と無い場合の2種類がある
orderInformationAfterSub = re.sub(r"配達手続きが完了しました\n*","",str(orderInformation.text),0)
orderInformationAfterSub = re.sub(r"注文内容の確認\n*","",str(orderInformationAfterSub),0)

# 行によって出力処理が変わるので改行でsplitして配列に詰め込む
orderInformationList = orderInformationAfterSub.split('\n')
for i in range(len(orderInformationList) - 1):
if i == 0:
# 最初の行は注文日や注文番号を出力する
print(orderInformationList[i])
elif i % 2 == 0:
# i % 2 == 1 の時は製造元なので出力しない
# 奇数行は商品名なので出力出力する
print(" " + orderInformationList[i])

if __name__ == '__main__':
main()
これでAmazonとヨドバシの明細が自動で取得できて楽になりました。それにしてもSeleniumで自動でブラウザが動いていく様子を見るのは面白いですね。

スポンサーリンク
posted by くまなべ at 20:37 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180322466
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック