今、私の使っているWindowsのPCは自作したのですが、作ってから5年程度経過しており、そろそろバージョンアップを考えています。構成については決まったので、あとは価格がいい感じに下がったら購入しようと思っています。ただ、毎日チェックするのが面倒だったので、チェック結果を毎日メールでもらえるようにPythonでコードを書きました。
(価格コムにもリマインダーがあるじゃん、と思ったのですが、暇だったので作りました)
必要なもの
Mac
私はMacは常にインターネットに接続して起動してある状態なので、Macにしました。同じ条件であればWindowsでもできると思います。
Python3
Macであれば標準でインストールされています。Windowsはどうだったっけなぁ。なので、下記をターミナルで試してみればいいと思います。
python3 --version
必要なライブラリのインストール
pip3 install requests beautifulsoup4 yagmail
スクリプトの概要
私のほしい次の4商品の価格を価格.comから取得し、Gmailを使って毎朝9時に送信します。
- Ryzen 7 7800X3D
- ASRock B850I Lightning WiFi
- AX5U6400C3232G-DCLARBK
- Radeon RX 9070 XT Steel Legend Dark
以下のスクリプトを script.py という名前で、任意のフォルダに保存してください。
import requests
from bs4 import BeautifulSoup
import yagmail
from datetime import datetime
import re
# 価格.comの商品URL
PRODUCTS = {
"Ryzen 7 7800X3D": "https://kakaku.com/item/K0001507444/",
"ASRock B850I Lightning WiFi": "https://kakaku.com/item/K0001669879/",
"AX5U6400C3232G-DCLARBK": "https://kakaku.com/item/K0001579840/",
"Radeon RX 9070 XT Steel Legend Dark": "https://kakaku.com/item/K0001683328/",
}
def fetch_price(url):
headers = {
"User-Agent": "Mozilla/5.0"
}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, "html.parser")
price_tag = soup.select_one(".priceTxt")
if price_tag:
return price_tag.get_text(strip=True)
return "価格取得失敗"
def parse_price(price_str):
""" 文字列から整数を抽出。価格取得失敗時は0を返す """
match = re.search(r"([\d,]+)", price_str)
if match:
return int(match.group(1).replace(",", ""))
return 0
def main():
report_lines = []
total = 0
for name, url in PRODUCTS.items():
price_str = fetch_price(url)
price_val = parse_price(price_str)
total += price_val
report_lines.append(f"{name}: {price_str}({url})")
report_lines.append(f"\n【合計金額】{total:,}円")
report = "\n".join(report_lines)
now = datetime.now().strftime("%Y-%m-%d %H:%M")
subject = f"PCパーツ価格通知({now} 実行)"
body = f"本日の価格は以下の通りです。\n\n{report}"
# Gmail設定
yag = yagmail.SMTP(user="送信元メールアドレス", password="アプリパスワード")
yag.send(to="送信先メールアドレス", subject=subject, contents=body)
if __name__ == "__main__":
main()
スクリプト内の user および to の部分は、ご自身のGmailアドレスおよび受信先に置き換えてください。
Gmailのアプリパスワード発行手順(2段階認証が必要)
送信元のGmailのアプリパスワードを取得します。
- 送信元のGoogleアカウントにログイン
- https://myaccount.google.com/apppasswords
- アプリ:適当に入力する(私の場合、PC部品最安値通知、としました)
- 表示されたパスワードをコピーして、script.pyのアプリパスワードに貼り付け
ちゃんと通知メールが届くか試してみる
ターミナルで、script.pyが保存されたディレクトリに移動して以下を実行して、送信先メールアドレスにメールが届くか、試してみる。
python3 script.py
Macで毎朝9時にスクリプトを自動実行する(cron設定)
- ターミナルでcrontab編集
crontab -e
- 以下の1行を追記
0 9 * * * /usr/bin/python3 /Users/あなたのユーザー名/適当なフォルダ/script.py
上記の/usr/bin/python3
は、ご自身の環境でのpython3のありかを示す。もしわからなければターミナルでwhich python3
で教えてくれます。/Users/あなたの、、、
は「スクリプトの概要」で保存したscript.pyのフルパスを指定すればいいです。
補足
- Macの蓋が閉じているとcronは動かない場合があります。Macがスリープしないようにしたいなら Amphetamine などのツールがおすすめです。
- launchd を使うことでGUI操作でもっと確実にスケジュール実行可能ですが、cronの方が手軽です。
- 価格.comはHTML構造がよく変わるので、取得に失敗することがありえます。その場合も「取得失敗」と表示されます。
リンク
リンク
リンク
リンク
コメント