YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Amazonの購入履歴をスクレイピングしないで抽出

簡易的にAmazonの注文履歴を整理したい場合のPythonスクリプトです。

  • Amazonの注文履歴から金額と商品名と日付を抽出したいな
  • とはいえ、わざわざSeleniumを使ってスクレイピングするほどでもないな
  • でも、手作業で集計するのはめんどくさいな

こういったときに、さらっとAmazonの注文履歴から金額、商品名、日付を抽出するPythonスクリプトを紹介します。

購入履歴抽出Pythonスクリプトの構成

次の手順でコピペした購入履歴を最終的にDataFrameに整理します。

  1. テキストで注文履歴のインプットを用意
  2. 正規表現で、注文日、金額、商品名(複数購入の場合は一つ目)を抽出
  3. pandasDataFrameに変換

テキストで購入履歴のインプットを用意

作業の半自動化の際の最重要アイデアだと思います。

注文履歴の画面を全選択して、そのままコピペします。効率化を考えてショートカットで実行しましょう。

  1. Amazonの注文履歴の画面を開いておく
  2. Ctrl + a -> 全選択
  3. Ctrl + c -> コピー
  4. テキストファイルに貼り付け

コピーした内容をテキストファイルに張り付けて保存します。

これで強引にテキスト形式のインプットを準備できました。

テキストファイルの読み込み

次に作成したインプットテキストファイルを読み込みます。

ここではインプットファイル名を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を生成する方法は次の記事で詳しく解説しています。

≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
pandasでは、リストからデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①リストからデータフレームを生成、行と列を追加する方法、②インデックス名、コラム名を設定する方法、③DataFrameを転値する方法(行と列が期待と逆だった時の対応)をサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_list
 

"文字列"Datetimeに変換する方法は次の記事で詳しく解説しています。

≫pandas 文字列⇒Datetime変換|時系列操作を簡単マスター!
pandasで"文字列"をDatetimeに変換する方法、Datetimeの基本的な操作方法を解説します。"文字列"のままでは、日時関連の計算や条件判定が自由にできません…。Datetimeに変換して、日付の差分計算や便利な機能を使えるようにしましょう!
www.yutaka-note.com/entry/pandas_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のインデックス列の設定、ソート方法については次の記事で詳しく解説しています。

≫pandas DataFrameにインデックス設定|パターン別にわかりやすく解説
pandasのDataFrameでは、インデックス名でデータにアクセスします。しかし、DataFrameへのインデックス指定方法は少しわかりにくい部分も…。そこで、この記事では、パターン別に設定方法を解説!①DataFrame作成時にインデックス列指定、②既存DataFrameで指定、③ExcelやCSVから読み込み時に指定 ④インデックスの振り直し…
www.yutaka-note.com/entry/pandas_index_setting
 
≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

グラフ化したい場合は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の基本的な使い方は、次の記事で詳しく解説しています。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

日本語の設定方法は、次の記事で詳しく説明しています。

≫Matplotlib 日本語の表示方法 厳選3選|最適な方法選んで!
Matplotlibでグラフを描くとき、「日本語を表示しようとしたら文字化けした!」「日本語を表示するには、何を設定すればいいの?」という方向けに、「Matplotlibで日本語を表示する方法厳選3選」、「使用できるフォントのチェック方法」を紹介していきます。追加のインストールなしで、フォントの設定を変更するだけの方法を紹介します!
www.yutaka-note.com/entry/matplotlib_japanese
 

Pythonで作業を効率化する方法

今回はipynbmarkdownに変換する方法を紹介しました。

pythonを使えば、簡単なスクリプトで作業を劇的に効率化することも可能です!

pythonの効率化関係で言えば、次の記事で紹介しているような本が自動化の本がおススメです。

≫【レビュー】退屈なことはPythonにやらせよう | 単純作業は自動化
名著「退屈なことはPythonにやらせよう 」をレビュー!単純作業を自動化して、自分が本当にしたいことのために時間を確保していこう!所要時間やできるようになったことを紹介!この本を参考にして作成した、自作自動化スクリプトも紹介しています!
www.yutaka-note.com/entry/python_jido
 
≫【レビュー】Python自動処理 全部入り。 | 即効性重視!Pythonによる自動化事例集!
今回は、Pythonの作業自動処理の解説本『Python自動処理全部入り』をレビュー!この本は、特定の作業に特化した即効性の重視の自動化解説本です。よくある作業から自動化しやすい作業を抽出して、それらの自動化を集中的に解説した本という印象です。本の中に自分のニーズに合った自動化処理が見つかれば、その日からすぐ使える事例集のような印象です。
www.yutaka-note.com/entry/python_jido_zenbu