こんにちは、ショウです。
前回の記事では、作った天気予報アプリからLINEにメッセージを送る方法を解説しました。これで**「何か情報があったら、自動でLINEに教えてもらう」**という仕組みの基礎ができましたね。
今回はこの強力な仕組みを使って、誰もが「これは便利!」と思うようなツールを作ってみましょう。
具体的には、Amazonの特定商品の価格を監視し、設定した価格以下になったらあなたのLINEに通知するツールです。
「あの商品、セールになったら買いたいんだけど見逃しちゃう…」そんな悩みを、PythonとLINE Messaging APIで解決します!
1. 今回作るツールの全体像
今回のツールは、以下のステップで動きます。
- PythonプログラムがAmazonの商品ページにアクセスする(
requests)。 - 商品ページのHTMLコードから、商品の価格情報を探し出して抽出する(
BeautifulSoup)。 - 抽出した価格が、あらかじめ設定した「目標価格」以下かどうかを判定する。
- 目標価格以下だったら、あなたの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. コードのポイント解説
TARGET_URLとTARGET_PRICE: ここをあなたの監視したい情報に設定します。User-Agent: Amazonのような大手サイトは、プログラムからのアクセス(Bot)をブロックすることがあります。User-Agentを設定することで、あたかも普通のブラウザからアクセスしているように見せかけています。time.sleep(2): 短時間に連続してアクセスすると、サイト側に負荷がかかったり、ブロックされたりする可能性があります。適度に休止を入れるのがマナーです。BeautifulSoupでの価格抽出: AmazonのHTML構造は頻繁に変わります。今回は比較的安定しているclass="a-price-whole"やid="newBuyBoxPrice"を使って価格を探しています。もし動かなくなったら、ブラウザの開発者ツール(F12キーで開く)で価格が表示されている要素のidやclassを確認し、コードを修正してみてください。response.raise_for_status(): サイトが存在しない(404エラー)など、HTTPリクエストで問題があった場合にエラーを発生させてくれます。if current_price <= TARGET_PRICE:: ここが価格を判定する重要な部分です。目標価格以下であればLINE通知が飛びます。
5. さらに発展させるアイデア(脱・初心者への道!)
このツールは、あくまで基本形です。さらに便利にするためのアイデアをいくつかご紹介します。
- 複数商品の監視:
TARGET_URLとTARGET_PRICEのリストを作り、ループ処理で複数の商品を一括監視する。 - 実行の自動化:
- PCで自動実行: WindowsのタスクスケジューラやMacのAutomatorを使って、毎日決まった時間にスクリプトを実行する。
- サーバーで自動実行: 無料枠のあるクラウドサービス(Google Cloud PlatformのCloud Functionsなど)を使えば、PCをつけっぱなしにしなくても自動で監視できます。これはまた別の記事で詳しく解説しても面白いですね!
- 価格履歴の記録: 取得した価格をCSVファイルやデータベースに保存して、過去の価格推移をグラフ化する。
- 商品の在庫確認: 価格だけでなく、在庫切れかどうかもスクレイピングでチェックする。
まとめ
今回は、PythonのスクレイピングとLINE Messaging APIを組み合わせることで、**自分だけの「価格自動監視&通知システム」**を構築しました。
「情報収集」と「情報通知」を自動化できるこのスキルは、個人的なお得活動だけでなく、副業でのデータ収集や、業務効率化ツール作成の基盤にもなります。
ぜひ、このコードを参考に、あなただけのオリジナルツールをどんどん作ってみてください!
あわせて読みたい記事:
- 【Python応用】自作の天気アプリから「LINE」に通知を送る方法(Messaging API編)
- [初心者必見]ウェブスクレイピングの一番簡単な方法[Python]
- 【初心者必見】プログラミング学習にAI(ChatGPT)を「最強の家庭教師」として使い倒す方法
編集後記
スクレイピングは非常に強力なツールですが、Webサイトの規約を必ず確認し、過度なアクセスは避けるようにしましょう。また、サイトのHTML構造は頻繁に変わるため、定期的なコードのメンテナンスも忘れずに! 次回は、今回のツールを**「サーバーで動かす方法」**について解説するのも面白そうですね!
