簡易的にAmazonの注文履歴を整理したい場合のPythonスクリプトです。
- Amazonの注文履歴から金額と商品名と日付を抽出したいな
- とはいえ、わざわざ
Selenium
を使ってスクレイピングするほどでもないな - でも、手作業で集計するのはめんどくさいな
こういったときに、さらっとAmazonの注文履歴から金額、商品名、日付を抽出するPythonスクリプトを紹介します。
購入履歴抽出Pythonスクリプトの構成
次の手順でコピペした購入履歴を最終的にDataFrame
に整理します。
- テキストで注文履歴のインプットを用意
- 正規表現で、注文日、金額、商品名(複数購入の場合は一つ目)を抽出
pandas
のDataFrame
に変換
テキストで購入履歴のインプットを用意
作業の半自動化の際の最重要アイデアだと思います。
注文履歴の画面を全選択して、そのままコピペします。効率化を考えてショートカットで実行しましょう。
- Amazonの注文履歴の画面を開いておく
Ctrl + a
-> 全選択Ctrl + c
-> コピー- テキストファイルに貼り付け
コピーした内容をテキストファイルに張り付けて保存します。
これで強引にテキスト形式のインプットを準備できました。
テキストファイルの読み込み
次に作成したインプットテキストファイルを読み込みます。
ここではインプットファイル名をamazon_input.txt
としています。
FILE = "amazon_input.txt"
with open(FILE, "r", encoding="utf-8") as f:
src = f.read()
正規表現で必要なデータを抽出
正規表現を利用して、注文日、金額、商品名(同時注文の場合は一つ目)を抽出します。
import re
res = re.findall(r"""(?<=\n注文日\n) # 注文日から始まっていることが条件(肯定先読み)
(\d{4}年\d{1,2}月\d{1,2}日)\n # 注文日を取得
合計\n # 「合計」の行
¥\s([\d,]+) # 金額を取得
.*?配送状況を確認\n\n # 配送状況を確認まで飛ばす
(.*?)\n # 商品名を取得
""", src, (re.VERBOSE|re.DOTALL))
# re.VERBOSEは正規表現内にコメントを記述するために必要
# re.DOTALLは[.]で改行も含ませるために必要
抽出結果をDataFrameに格納
抽出結果を集計しやすいように、DataFrame
に格納します。
あとから集計しやすいように、次のように型を変換しておきましょう。
- 注文日 ->
DataFrame
- 価格 ->
int
(,
があるので文字列になっているので)
import pandas as pd
df = pd.DataFrame(res, columns=["注文日", "金額", "商品名(同時注文の場合は一つ目)"])
df["注文日"] = pd.to_datetime(df["注文日"], format="%Y年%m月%d日") # "注文日"列をDateTimeに変換
df = df.set_index("注文日").sort_index() # 注文日でソート
df["金額"] = df["金額"].str.replace(',','').astype(int) # "金額"列をintに変換
次のようなDataFrame
が生成されます。
リスト
からDataFrame
を生成する方法は次の記事で詳しく解説しています。
"文字列"
をDatetime
に変換する方法は次の記事で詳しく解説しています。
あとは必要に応じて日付を抽出したり、合計金額を集計したりすることができます。
df_extract = df.loc[:"20220420"]
print(f"合計金額:{df_extract['金額'].sum()}円")
# 合計金額:27178円
print(f"購入数:{len(df_extract['金額'])}個")
# 購入数:3個
print(f"最大金額:{df_extract['金額'].max()}円")
# 最大金額:26608個
DataFrame
のインデックス列の設定、ソート方法については次の記事で詳しく解説しています。
グラフ化したい場合はmatplotlib
で適宜グラフ化しましょう。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.rcParams['font.family'] = "MS Gothic"
fig, ax = plt.subplots(tight_layout=True)
ax.bar(x=df.index, height=df["金額"])
ax.set_ylabel("金額")
ax.tick_params(axis='x', labelrotation= 45)
次のようなグラフが出力されました。
matplotlib
の基本的な使い方は、次の記事で詳しく解説しています。
日本語の設定方法は、次の記事で詳しく説明しています。
Pythonで作業を効率化する方法
今回はipynb
をmarkdown
に変換する方法を紹介しました。
pythonを使えば、簡単なスクリプトで作業を劇的に効率化することも可能です!
pythonの効率化関係で言えば、次の記事で紹介しているような本が自動化の本がおススメです。