Higu`s diary

新米データサイエンティストのブログ。技術についてゆるく書きます〜

Amazonの合計利用金額を自動で算出する方法

f:id:zerebom:20181110102422p:plain

こんにちは、ひぐです!

 

突然ですが、Amazonの商品購入のスムーズさってやばいですよね。

欲しいと思ってるうちに手が滑って、気づいたら家に届いてるんすよね。

 

Amazonの滑らかなUIによって、

僕の財布の紐はひもQ並みにゆるゆるになってしまいました。

 

今回はAmazonでの使いすぎを防ぐべく、

Pythonを用いて「Amazonの合計使用金額を算出」する方法を紹介します。

使用金額を確認して無駄遣いを減らしていきましょう:D

 

この記事はこの本を参考にしました

gihyo.jp

 

 

 

コード全文

import sys
import os
import re
from robobrowser import RoboBrowser

# 認証情報は環境変数から取得する。
AMAZON_EMAIL = os.environ['AMAZON_EMAIL']
AMAZON_PASSWORD = os.environ['AMAZON_PASSWORD']

# RoboBrowserオブジェクトを作成する。
browser = RoboBrowser(
    parser='html.parser',  # Beautiful Soupで使用するパーサーを指定する。
    # Cookieが使用できないと表示されてログインできない問題を回避するため、
    # 通常のブラウザーのUser-Agent(ここではFirefoxのもの)を使う。
    user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:45.0) Gecko/20100101 Firefox/45.0')


def main():
    # 注文履歴のページを開く。
    sum_money=0
    print('Navigating...', file=sys.stderr)
    browser.open('https://www.amazon.co.jp/gp/css/order-history')

    # サインインページにリダイレクトされていることを確認する。
    assert 'Amazonログイン' in browser.parsed.title.string

    # name="signIn" というサインインフォームを埋める。
    # フォームのname属性の値はブラウザーの開発者ツールで確認できる。
    form = browser.get_form(attrs={'name': 'signIn'})
    form['email'] = AMAZON_EMAIL  # name="email" という入力ボックスを埋める。
    form['password'] = AMAZON_PASSWORD  # name="password" という入力ボックスを埋める。

    # フォームを送信する。正常にログインするにはRefererヘッダーとAccept-Languageヘッダーが必要。
    print('Signing in...', file=sys.stderr)
    browser.submit_form(form, headers={
        'Referer': browser.url,
        'Accept-Language': 'ja,en-US;q=0.7,en;q=0.3',
    })

    # ページャーをたどる。
    while True:
        assert '注文履歴' in browser.parsed.title.string  # 注文履歴画面が表示されていることを確認する。
        print(browser.parsed.title.string)

        sum_money+=print_order_history()  

        link_to_next = browser.get_link('次へ')  # 「次へ」というテキストを持つリンクを取得する。
        if not link_to_next:
            print('直近半年のAmazon使用合計金額は')
            print(str(sum)+'円です')
            break  # 「次へ」のリンクがない場合はループを抜けて終了する。

        print('Following link to next page...', file=sys.stderr)
        browser.follow_link(link_to_next)  # 「次へ」というリンクをたどる。


def print_order_history():
    """
    現在のページのすべての注文履歴を表示する。
    """
    # ページ内のすべての注文履歴について反復する。ブラウザーの開発者ツールでclass属性の値を確認できる。
    sum=0
    for line_item in browser.select('.order-info'):
        order = {}  # 注文の情報を格納するためのdict。
        # 注文の情報のすべての列について反復する。
        for column in line_item.select('.a-column'):
            label_element = column.select_one('.label')
            value_element = column.select_one('.value')
            # ラベルと値がない列は無視する。
            if label_element and value_element:
                label = label_element.get_text().strip()
                value = value_element.get_text().strip()
                order[label] = value  # 注文の情報を格納する。

        print(order['注文日'], order['合計'])  # 注文の情報を表示する。
        price=re.sub(r'¥ ' ,'',order['合計'])
        price=re.sub(',' ,'',price)


        sum+=int(price)
    return(sum)

if __name__ == '__main__':
    main()

 

 

コードの概要

Robobrowserというライブラリを用いてブラウザを開き、

フォームに情報を入力し、ログインする。

その後、値段が記載されているCSSの特定の要素を選択し、

for文を用いてページ内の商品を全て取得し合計を出力する。

 

細かい説明

 

RoboBrowserってなに?

RoboBrowserはヘッドレスブラウザ(画面が表示されないブラウザ)です。

ブラウザの動きをコードで指定し、自動で動かしてくれるライブラリです。

ヘッドレスブラウザはいくつもあるのですが、robobrowserは

フォームの入力など簡単にできます

GitHub - jmcarp/robobrowser

 

ちなみに、RoboBrowserでCSSタグを取得するときは、

HTML構文解析ライブラリのBeautiful Soupと同じ記法で出来ます。

kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

 

os.environってなに?

今回のコードはAmazonにログインするため、メアドとPWが必須になります。

コードに直接個人情報を書き込むのは危険なため、os.environによってローカルの別ファイルに保存してある文字列を読み込んで、実行します。

 

詳しくは

note.nkmk.me

 

実行結果

f:id:zerebom:20181110102200p:plain

 

使いすぎワロタ

 

おわり

google-site-verification: google1c6f931fc8723fac.html