ひぐのカメラとプログラミング日記

大学院生の日記です。主にプログラミングとカメラについて。最近はデータ分析・Kaggleにハマっています

【驚愕】Amazonの半年の合計購入金額をスクレイピングした結果…

f:id:zerebom:20181110102422p:plain

こんにちは、ひぐです!

スクロールするとついてくる広告みたいなタイトルで申し訳ないです。

 

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

 

実店舗での買い物だったら

商品を手に取って、

 

他の店と比較して、

財布とにらめっこして、

やっぱ店員さんがグイグイ来るからやめようか…

 

みたいな葛藤があると思いますが、

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

憎いねぇ!即日発送ゥ!

 

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

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

 

心なしか、amazonのロゴがいつもより笑っているように見えます

f:id:zerebom:20181110102338p:plain

 

しかし!

そうもいってられません。俺の全財産がベゾスに吸い上げられてしまわぬよう

今回は財布のひもを再び固めるようなコードを紹介したいと思います。

 

 

それは

Amazonの合計使用金額を算出」するコードです!

自分の使用金額を確認して無駄遣いを減らしていきましょう 

 

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

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タグを取得するときは、

Beautiful Soupと記述方法が同じです

日本語で翻訳してくれた方(神)がいるので参考にどうぞ↓

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

 

os.environってなに?

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

コードに直接個人情報を書き込むのは、IQ3でも危険とわかるでしょう

os.environによってローカルの別ファイルに保存してある

任意の文字列を読み込んで、コードを実行できます。

 

詳しくは

note.nkmk.me

 

実行結果

f:id:zerebom:20181110102200p:plain

 

使いすぎワロタ

 

おわり

google-site-verification: google1c6f931fc8723fac.html