【Python自動化プロジェクト第2回】価格監視ロジックを実装!値下げを検知してメッセージを生成しよう ⚙️
「Webページから商品名と価格は取れるようになったけど、これをどうやって『監視』するの?」
「複数の商品を、それぞれの希望価格と比べるにはどうすればいい?」
「価格が安くなっていたら、通知用のメッセージを自動で作成したい!」
こんにちは! Python自動化探検隊、隊長のPythonistaです! 前回の第1回では、requests
とBeautifulSoup4
を使い、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のタスクスケジューラ)にも触れ、完全に自動化された価格監視&通知システムを完成させます。お楽しみに!
コメント
コメントを投稿