ショウのプログラミング教室

【Pythonで自動化】Amazonの「価格暴落」をLINEで検知!自分専用のお得通知ツールを作ろう

こんにちは、ショウです。

前回の記事では、作った天気予報アプリからLINEにメッセージを送る方法を解説しました。これで**「何か情報があったら、自動でLINEに教えてもらう」**という仕組みの基礎ができましたね。

今回はこの強力な仕組みを使って、誰もが「これは便利!」と思うようなツールを作ってみましょう。

具体的には、Amazonの特定商品の価格を監視し、設定した価格以下になったらあなたのLINEに通知するツールです。

「あの商品、セールになったら買いたいんだけど見逃しちゃう…」そんな悩みを、PythonとLINE Messaging APIで解決します!


1. 今回作るツールの全体像

今回のツールは、以下のステップで動きます。

  1. PythonプログラムがAmazonの商品ページにアクセスする(requests)。
  2. 商品ページのHTMLコードから、商品の価格情報を探し出して抽出する(BeautifulSoup)。
  3. 抽出した価格が、あらかじめ設定した「目標価格」以下かどうかを判定する。
  4. 目標価格以下だったら、あなたのLINEに通知を送る(LINE Messaging API)。

これまでに学んだ知識がすべて繋がる、とても実践的な内容です!


2. 事前準備:必要なライブラリのインストール

今回のスクレイピングには、以下のライブラリを使います。まだインストールしていない場合は、コマンドプロンプトやターミナルでインストールしておきましょう。

Bash

pip install requests beautifulsoup4

また、LINE Messaging APIの**「チャネルアクセストークン」**と**「ユーザーID」**は、前回の記事で取得したものを使いますので、手元に用意しておいてください。


3. 実装コード:Amazon価格監視ツール

新しく amazon_price_checker.py というファイルを作成し、以下のコードを貼り付けてください。

【重要】AmazonのURLと目標価格、LINEのAPIキーはあなたの情報に書き換えてください。

Python

import requests
from bs4 import BeautifulSoup
import json
import time # 一時停止のために追加

# --- 設定エリア ---
# あなたが監視したいAmazonの商品URL (例: https://www.amazon.co.jp/dp/B0XXXXXXXX/)
TARGET_URL = "ここに監視したいAmazonの商品URLを貼り付け"
# 目標価格 (この価格以下になったら通知)
TARGET_PRICE = 9500 # 例: 9500円

# LINE Messaging APIの設定 (前回の記事で取得したもの)
CHANNEL_ACCESS_TOKEN = "あなたのLINEチャネルアクセストークン"
USER_ID = "あなたのLINEユーザーID"

# --- LINEにメッセージを送る関数 (前回と同じ) ---
def send_line_message(text):
    url = "https://api.line.me/v2/bot/message/push"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}"
    }
    data = {
        "to": USER_ID,
        "messages": [
            {
                "type": "text",
                "text": text
            }
        ]
    }
    response = requests.post(url, headers=headers, json=data)
    if response.status_code == 200:
        print("LINE送信成功!")
    else:
        print(f"送信失敗: {response.status_code} {response.text}")

# --- Amazonから価格を取得する関数 ---
def get_amazon_price(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    try:
        # Amazonへのアクセスが短時間に集中しすぎないよう、少し待つ
        time.sleep(2) 
        response = requests.get(url, headers=headers)
        response.raise_for_status() # HTTPエラーがあれば例外を発生させる
        
        soup = BeautifulSoup(response.text, "html.parser")
        
        # Amazonの価格要素は変更されることがあります。
        # 現在の主な価格要素のIDやクラスを試します。
        # id="priceblock_ourprice" (古い)
        # id="priceblock_saleprice" (古い)
        # id="newBuyBoxPrice" (新しい)
        # class="a-price-whole" (新しい、もっとも一般的)

        # まずは、a-price-wholeクラスを持つ要素を探す
        price_whole = soup.find("span", class_="a-price-whole")
        price_fraction = soup.find("span", class_="a-price-fraction")

        if price_whole and price_fraction:
            # カンマを除去し、整数に変換
            price_str = price_whole.get_text().replace(",", "") + price_fraction.get_text()
            current_price = int(float(price_str)) # 小数点以下も考慮
            return current_price
        
        # もし見つからなければ、別のIDを試す (念のため)
        price_element = soup.find(id="newBuyBoxPrice")
        if price_element:
            price_str = price_element.get_text().replace("¥", "").replace(",", "")
            current_price = int(float(price_str))
            return current_price

        return None # 価格が見つからなかった場合

    except requests.exceptions.RequestException as e:
        print(f"Amazonへのアクセスでエラーが発生しました: {e}")
        return None
    except Exception as e:
        print(f"価格の解析中にエラーが発生しました: {e}")
        return None

# --- メイン処理 ---
if __name__ == "__main__":
    print("Amazon価格監視を開始します...")
    
    # Amazonから現在の価格を取得
    current_price = get_amazon_price(TARGET_URL)

    if current_price is not None:
        product_title_element = None
        try:
            # 商品タイトルも取得 (通知を分かりやすくするため)
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
            }
            response = requests.get(TARGET_URL, headers=headers)
            soup = BeautifulSoup(response.text, "html.parser")
            product_title_element = soup.find(id="productTitle")
        except Exception as e:
            print(f"商品タイトルの取得中にエラー: {e}")

        product_title = product_title_element.get_text().strip() if product_title_element else "不明な商品"

        print(f"商品名: {product_title}")
        print(f"現在の価格: ¥{current_price}")
        print(f"目標価格: ¥{TARGET_PRICE}")

        if current_price <= TARGET_PRICE:
            message = f"【価格通知アラート🔔】\n\n商品名: {product_title}\n現在の価格が目標価格を下回りました!\n\n現在の価格: ¥{current_price}\n目標価格: ¥{TARGET_PRICE}\n\nいますぐチェック!\n{TARGET_URL}"
            send_line_message(message)
            print("目標価格以下になりました。LINEに通知を送信しました。")
        else:
            message = f"商品名: {product_title}\n現在の価格は¥{current_price}です。\nまだ目標価格(¥{TARGET_PRICE})には達していません。"
            send_line_message(message) # 毎回通知するか、目標価格以下の場合だけにするかはお好みで
            print("目標価格以上です。LINE通知は行いませんでした。(毎回通知する設定の場合を除く)")
    else:
        print("価格の取得に失敗したため、処理を中断します。")


4. コードのポイント解説


5. さらに発展させるアイデア(脱・初心者への道!)

このツールは、あくまで基本形です。さらに便利にするためのアイデアをいくつかご紹介します。


まとめ

今回は、PythonのスクレイピングとLINE Messaging APIを組み合わせることで、**自分だけの「価格自動監視&通知システム」**を構築しました。

「情報収集」と「情報通知」を自動化できるこのスキルは、個人的なお得活動だけでなく、副業でのデータ収集や、業務効率化ツール作成の基盤にもなります。

ぜひ、このコードを参考に、あなただけのオリジナルツールをどんどん作ってみてください!


あわせて読みたい記事:


編集後記

スクレイピングは非常に強力なツールですが、Webサイトの規約を必ず確認し、過度なアクセスは避けるようにしましょう。また、サイトのHTML構造は頻繁に変わるため、定期的なコードのメンテナンスも忘れずに! 次回は、今回のツールを**「サーバーで動かす方法」**について解説するのも面白そうですね!

モバイルバージョンを終了