לדלג לתוכן

בונים בוט שעוקב אחרי מחירים בשבילכם - ולא מפספסים עוד מבצע

כולם מכירים את הרגע המתסכל - ראיתם מוצר, החלטתם לחכות למחיר טוב יותר, ואז שכחתם ממנו לגמרי עד שגיליתם שהוא כבר לא במבצע. הפרויקט הזה פותר בדיוק את זה, ובדרך מלמד את אחד הרעיונות הכי שימושיים בתכנות - אוטומציה. במקום שאתם תבדקו מחיר כל יום, המחשב יעשה את זה בשבילכם, ויתריע רק כשבאמת שווה לשים לב.

מה בונים בפועל

מעקב מחירים בנוי משלושה חלקים: קריאת המחיר הנוכחי מדף מוצר, שמירת המחיר יחד עם תאריך כדי לבנות היסטוריה, והשוואה בין המחיר החדש לישן כדי להחליט אם לשלוח התראה. כל חלק בפני עצמו פשוט - היופי הוא בחיבור ביניהם ללולאה שרצה לבד.

שלב ראשון - שולפים את המחיר מהדף

זה בעצם מיני-פרויקט של web scraping. עם requests ו-BeautifulSoup מורידים את דף המוצר ומחפשים את התגית שמכילה את המחיר:

import requests
from bs4 import BeautifulSoup

def get_price(url):
    response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
    soup = BeautifulSoup(response.text, "html.parser")
    price_tag = soup.find("span", class_="price")
    return float(price_tag.text.replace("₪", "").strip())

חשוב לשים לב - מחירים בדף כוללים לרוב סימני מטבע, פסיקים ורווחים, וצריך לנקות את זה לפני שהופכים למספר. זו נקודה שהרבה מתחילים נתקעים בה, וזו הזדמנות טובה ללמוד עבודה נכונה עם מחרוזות.

שלב שני - שומרים היסטוריה, לא רק את המחיר האחרון

אם שומרים רק את המחיר העדכני, אין לכם שום דרך לדעת אם הוא ירד או עלה. לכן כל בדיקה צריכה להתווסף לקובץ (CSV פשוט מספיק לגמרי) עם תאריך ומחיר. עם הזמן זה נותן לכם גם גרף מעניין של תנודות המחיר, לא רק התראה חד פעמית.

import csv
from datetime import date

def save_price(price):
    with open("price_history.csv", "a", newline="") as f:
        writer = csv.writer(f)
        writer.writerow([date.today(), price])

שלב שלישי - מתזמנים בדיקות אוטומטיות

כאן הפרויקט הופך מסקריפט חד פעמי לכלי אמיתי. יש כמה דרכים לגרום לקוד לרוץ אוטומטית בפרקי זמן קבועים. הפשוטה ביותר ללמידה היא לולאה אינסופית עם time.sleep שמחכה כמה שעות בין בדיקה לבדיקה. פתרון נוח יותר הוא ספריית schedule, שנותנת תחביר קריא במיוחד:

import schedule
import time

schedule.every(6).hours.do(check_price_job)

while True:
    schedule.run_pending()
    time.sleep(60)

ולבסוף, אם רוצים שהמעקב ירוץ גם כשהמחשב שלכם כבוי, הפתרון המקצועי הוא cron job בשרת - משימה שמערכת ההפעלה מריצה בזמנים קבועים בלי שום קוד פייתון שצריך להישאר פתוח ברקע.

שלב רביעי - שולחים התראה כשהמחיר יורד

זה השלב שהופך את הפרויקט משימושי לכיפי. ברגע שהמחיר החדש נמוך מהמחיר שנשמר בפעם הקודמת (או ממחיר יעד שהגדרתם מראש), שולחים התראה. הדרך הכי פשוטה היא הדפסה לקונסולה, אבל אם כבר בניתם בוט טלגרם בפרויקט קודם - אפשר לחבר בין השניים ולקבל הודעה ישירות לנייד. גם שליחת מייל עם ספריית smtplib היא אופציה נגישה למתחילים.

הטעויות שכדאי להיזהר מהן

הטעות הראשונה היא לבדוק מחיר בתדירות גבוהה מדי - זה מכביד על השרת ועלול לגרום לחסימת ה-IP שלכם, בדיוק כמו בכל פרויקט scraping. בדיקה כל כמה שעות מספיקה בהחלט לרוב המוצרים. הטעות השנייה היא לא לטפל במקרה שהדף השתנה - אתרי מסחר משנים מבנה HTML מדי פעם, וברגע שזה קורה הקוד שלכם עלול לקרוס בלי אזהרה. עטיפת קריאת המחיר ב-try/except ושליחת הודעת שגיאה ברורה כשמשהו משתבש חוסכת הרבה כאב ראש.

למה זה פרויקט שכדאי לבנות

מעקב מחירים משלב יחד את כל מה שלמדתם עד עכשיו - עבודה עם קבצים, קריאה מהאינטרנט, תזמון, וטיפול בשגיאות - לתוך כלי אחד שבאמת עובד בשבילכם בחיים האמיתיים. זו בדיוק סוג ההתנסות שהופכת ידע תיאורטי לביטחון מעשי, וזה בדיוק מה שמלמדים בקורס תכנות בסיסי החינמי שלנו - לא רק תחביר, אלא איך לחבר בין רעיונות לכלי שלם. התחילו את קורס התכנות הבסיסי כאן

הצטרפו לקהילה בדיסקורד