【Python自動化プロジェクト第2回】価格監視ロジックを実装!値下げを検知してメッセージを生成しよう ⚙️

「Webページから商品名と価格は取れるようになったけど、これをどうやって『監視』するの?」
「複数の商品を、それぞれの希望価格と比べるにはどうすればいい?」
「価格が安くなっていたら、通知用のメッセージを自動で作成したい!」

こんにちは! Python自動化探検隊、隊長のPythonistaです! 前回の第1回では、requestsBeautifulSoup4を使い、Webページから特定の商品情報を抽出する「目」となる関数を作成しましたね。Web上の情報をピンポイントで抜き出す、強力なスキルを手に入れました。

シリーズ第2回となる今回は、いよいよこのツールの**「頭脳」となる監視ロジック**を実装していきます! 複数の商品をリストで管理し、抽出した価格とあらかじめ設定した「希望価格」を比較し、条件を満たした場合にのみ通知用のメッセージを生成するという、自動化の核心部分です。この記事を読み終える頃には、あなたはコンピュータに自律的な判断を行わせる、本格的な監視プログラムを完成させることができます!


1. 準備:監視対象リストの作成 (CSVファイル)

まず、どの商品を、いくらになったら通知してほしいのか、という「監視対象リスト」を作成します。毎回コードを書き換えるのは大変なので、CSVファイルで管理するのがスマートです。

以下の内容でtargets.csvという名前のファイルを作成し、Pythonスクリプトと同じディレクトリに保存してください。

url,target_price
https://example.com/product/A,15000
https://example.com/product/B,29800
https://example.com/product/C,800
  • url: 監視したい商品ページのURL。
  • target_price: この価格以下になったら通知してほしい、あなたの希望価格。

このように設定を外部ファイルに分離することで、後から監視対象を追加・変更するのが非常に楽になります。


2. ステップ1:CSVから監視リストを読み込む

プログラムの最初に、このtargets.csvファイルを読み込み、処理しやすい形(辞書のリストなど)に変換する部分を実装します。

import csv

def load_targets(filename):
    """
    監視対象リスト(CSV)を読み込み、辞書のリストとして返す関数
    """
    targets = []
    try:
        with open(filename, mode='r', encoding='utf-8') as infile:
            reader = csv.DictReader(infile)
            for row in reader:
                targets.append({
                    'url': row['url'],
                    'target_price': int(row['target_price'])
                })
        print(f"'{filename}' から {len(targets)}件の監視対象を読み込みました。")
        return targets
    except FileNotFoundError:
        print(f"エラー: 監視対象ファイル '{filename}' が見つかりません。")
        return []
    except (ValueError, KeyError) as e:
        print(f"エラー: '{filename}' の形式が正しくありません。'url'と'target_price'列を確認してください。 - {e}")
        return []

この関数は、CSVファイルを読み込み、各行を{'url': '...', 'target_price': ...}という辞書に変換して、それらをリストにまとめて返します。


3. ステップ2:監視ロジックのメインループを実装

ここが今回の核心部分です。読み込んだ監視リストを元に、ループで1件ずつ商品をチェックし、価格を比較するメインのロジックを構築します。

このロジックは、第1回で作成したget_product_info()関数を呼び出すことを前提としています。

import time
# requests, BeautifulSoupなどもインポートしておく
# from part1_scraper import get_product_info  # 第1回の関数をインポートするイメージ

# (第1回で作成した get_product_info 関数をここに貼り付けるか、インポートする)
def get_product_info(url):
    # ... (前回の記事のコードと同じ) ...
    pass

def check_prices(targets):
    """
    監視対象リストを元に、価格をチェックし、値下げがあった商品の通知メッセージを生成する
    """
    print("\n価格監視を開始します...")
    
    found_deals = [] # 値下げが見つかった商品を格納するリスト
    
    for i, item in enumerate(targets):
        url = item['url']
        target_price = item['target_price']
        
        print(f"[{i+1}/{len(targets)}] チェック中: {url}")
        
        # ステップ2-1: 商品情報を取得
        product_info = get_product_info(url)
        
        # サーバーへの負荷軽減のための待機
        time.sleep(1)
        
        if product_info is None or product_info['price'] is None:
            print("  -> 情報取得に失敗しました。スキップします。")
            continue
            
        current_price = product_info['price']
        product_name = product_info['name']
        print(f"  -> 現在価格: {current_price:,}円 (目標: {target_price:,}円)")

        # ステップ2-2: 価格を比較
        if current_price <= target_price:
            print("  ✨✨✨ 値下げを発見しました! ✨✨✨")
            
            # ステップ2-3: 通知メッセージを生成
            message = (
                f"🎉 **価格アラート** 🎉\n\n"
                f"**商品:** {product_name}\n"
                f"**現在価格:** `{current_price:,}円`\n"
                f"**目標価格:** `{target_price:,}円`\n\n"
                f"今がチャンスです!\n"
                f{url}"
            )
            found_deals.append(message)
            
    return found_deals

このcheck_prices関数は、監視リストを受け取り、ループ処理で各商品をチェックし、値下げが見つかった場合にのみ整形されたメッセージ文字列をリストに追加して返します。


4. 全体を統合するメインスクリプト

最後に、これまでに作成した関数を呼び出し、全体の処理を制御するメイン部分を記述します。

# --- メインの処理 ---
if __name__ == '__main__':
    target_file = 'targets.csv'
    
    # 1. 監視対象をCSVから読み込む
    targets_to_check = load_targets(target_file)

    if targets_to_check:
        # 2. 価格をチェックし、値下げ商品のメッセージリストを取得
        deal_messages = check_prices(targets_to_check)
        
        # 3. 結果を表示
        print("\n--- 監視結果 ---")
        if deal_messages:
            print(f"{len(deal_messages)}件の値下げ商品が見つかりました!")
            for i, msg in enumerate(deal_messages):
                print(f{'-'*20} メッセージ {i+1} {'-'*20}")
                print(msg)
        else:
            print("今回は値下げされた商品はありませんでした。")

実行結果 (値下げが見つかった場合の例):

'targets.csv' から 3件の監視対象を読み込みました。

価格監視を開始します...
[1/3] チェック中: https://example.com/product/A
  -> 現在価格: 14,800円 (目標: 15,000円)
  ✨✨✨ 値下げを発見しました! ✨✨✨
[2/3] チェック中: https://example.com/product/B
  -> 現在価格: 30,000円 (目標: 29,800円)
[3/3] チェック中: https://example.com/product/C
  -> 現在価格: 900円 (目標: 800円)

--- 監視結果 ---
1件の値下げ商品が見つかりました!
-------------------- メッセージ 1 --------------------
🎉 **価格アラート** 🎉

**商品:** すごいガジェット Pro
**現在価格:** `14,800円`
**目標価格:** `15,000円`

今がチャンスです!
https://example.com/product/A

これで、値下げを検知し、通知用のメッセージを生成するまでのロジックが完成しました!


まとめと次回予告

今回は、価格監視ツールの「頭脳」となる、以下の重要なロジックを実装しました。

  • csvモジュールを使い、監視対象リストを外部ファイルから読み込む方法。
  • forループで各商品を順番にチェックし、第1回で作成した情報抽出関数を呼び出すメインループ
  • if文を使った、現在価格と目標価格の比較ロジック
  • 値下げを検知した場合に、分かりやすい通知メッセージを自動で生成する処理。

あなたのプログラムは、もう自律的にWebサイトを監視し、特定の条件に基づいて「判断」を下せるようになりました。これは、単なるスクリプトから、インテリジェントな「エージェント」への大きな一歩です。

さて、値下げが見つかった時にメッセージがコンソールに表示されるだけでは、ずっとPCの前にいなければなりませんよね。次回、いよいよシリーズ完結編では、この生成されたメッセージを、以前作成したDiscord通知スクリプトと統合します! さらに、この監視スクリプトを**あなたのPCで定期的に自動実行する**方法(LinuxのcronやWindowsのタスクスケジューラ)にも触れ、完全に自動化された価格監視&通知システムを完成させます。お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀