أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول

أتمتة تتبع أسعار المنتجات بـ Playwright و Discord — السكربت الكامل

📅 ٢٠ أبريل ٢٠٢٦⏱ 5 دقائق قراءة
أتمتة تتبع أسعار المنتجات بـ Playwright و Discord — السكربت الكامل

أتمتة تتبع أسعار المنتجات بـ Playwright و Discord

لو بتستنى منتج ينزل سعره على Amazon أو Noon، بتدخل تشيك يدوي كل يوم وبتنسى أو بتلاقي السعر طلع تاني. السكربت اللي هنا بيراقب لك السعر كل ساعة، ويبعتلك Discord notification لمّا ينزل تحت الحد اللي حددته، بدون اشتراك شهري ولا أدوات خارجية.

المشكلة باختصار

تتبع الأسعار يدوي مش مستدام. سواء بتراقب لاب توب، شاشة، أو حتى تذكرة طيران، الـ price drops غالبًا بتحصل في وقت غير متوقع وبتختفي خلال ساعات. أدوات زي Keepa أو CamelCamelCamel ممتازة لـ Amazon US، لكن مش بتغطي Noon ولا Amazon.eg ولا متاجر إقليمية تانية. والاشتراكات الجاهزة بتاخد منك من 5 لـ 15 دولار شهريًا لكل منصة.

الحل اللي هنبنيه هنا بيشتغل على أي متجر فيه HTML واضح للسعر، بيتكلّف صفر دولار، وبيشتغل على VPS بـ 5 دولار شهريًا لـ 50 منتج بسهولة.

لوحة تحليلات تعرض رسومًا بيانية لتغيّر أسعار منتجات مع مؤشرات صعود وهبوط

المكونات اللي محتاجها

  • Playwright: browser automation framework بيفتح المتجر وياخد السعر زي ما المستخدم العادي يعمل، فبيتجاوز الـ anti-bot الأساسي اللي بيقع فيه requests/BeautifulSoup.
  • Python 3.10+: اللغة اللي هنشغل بيها السكربت.
  • Discord Webhook: مجاني تمامًا، بيبعت إشعار مباشر لأي قناة في السيرفر بتاعك. تقدر تعمله من Server Settings → Integrations → Webhooks.
  • cron job: لتشغيل السكربت كل ساعة أو حسب التردد اللي عايزه.

مثال بسيط للقارئ المبتدئ

تخيّل إن عندك صديق بيدخل صفحة المنتج كل ساعة، يبص على السعر، ولو لقاه نزل بيبعتلك واتساب. اللي هنعمله هنا بالظبط نفس الفكرة — بس الصديق ده برنامج بيشتغل لوحده، Discord بدل واتساب، و cron هو اللي بيقوله "روح شوف دلوقتي". دي اللي اسمها أتمتة دورية — أي مهمة بتتكرر بتتحوّل لسكربت + جدولة زمنية.

السكربت الكامل

السكربت بياخد قائمة منتجات من ملف JSON، يفتح كل منتج في Playwright، يستخرج السعر بالـ CSS selector اللي حددته، يقارنه بالحد المسجل، ولو السعر نزل بيبعت Discord notification بكل التفاصيل.

Python
import asyncio
import json
import os
import httpx
from playwright.async_api import async_playwright

DISCORD_WEBHOOK = os.environ["DISCORD_WEBHOOK_URL"]

async def get_price(page, product):
    await page.goto(product["url"], wait_until="domcontentloaded", timeout=30000)
    await page.wait_for_selector(product["selector"], timeout=15000)
    text = await page.inner_text(product["selector"])
    digits = "".join(c for c in text if c.isdigit() or c == ".")
    return float(digits)

async def notify(product, current_price):
    message = {
        "content": (
            f"السعر نزل! **{product['name']}**\n"
            f"السعر الحالي: {current_price} EGP\n"
            f"الحد المستهدف: {product['target_price']} EGP\n"
            f"{product['url']}"
        )
    }
    async with httpx.AsyncClient(timeout=10) as client:
        await client.post(DISCORD_WEBHOOK, json=message)

async def main():
    with open("products.json") as f:
        products = json.load(f)

    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        context = await browser.new_context(
            user_agent=(
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                "AppleWebKit/537.36 (KHTML, like Gecko) "
                "Chrome/124.0.0.0 Safari/537.36"
            )
        )
        page = await context.new_page()

        for product in products:
            try:
                price = await get_price(page, product)
                if price <= product["target_price"]:
                    await notify(product, price)
                    print(f"[ALERT] {product['name']}: {price}")
                else:
                    print(f"[OK] {product['name']}: {price} > {product['target_price']}")
            except Exception as e:
                print(f"[ERROR] {product['name']}: {e}")

        await browser.close()

if __name__ == "__main__":
    asyncio.run(main())

وملف products.json فيه الإعدادات:

JSON
[
  {
    "name": "MacBook Air M3",
    "url": "https://www.noon.com/egypt-ar/macbook-air-m3-13-inch/N12345/p/",
    "selector": "div[data-qa='price-now']",
    "target_price": 65000
  },
  {
    "name": "Sony WH-1000XM5",
    "url": "https://www.amazon.eg/dp/B09XS7JWHH",
    "selector": "span.a-price-whole",
    "target_price": 8500
  }
]

تشغيل السكربت بـ cron

السكربت محتاج يشتغل دوريًا. أبسط حل على Linux أو Mac:

Bash
pip install playwright httpx
playwright install chromium

export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/...."

# crontab -e
0 * * * * cd /home/user/price-tracker && /usr/bin/python3 tracker.py >> /var/log/tracker.log 2>&1

السطر ده بيشغّل السكربت كل ساعة. لو عايز كل 30 دقيقة استبدل 0 بـ */30. خد بالك إن المتاجر ممكن تطبق rate limit لو طلبت أكتر من اللزوم — تردد أقل من 15 دقيقة لنفس المنتج بيرفع نسبة الحظر بشكل كبير.

شاشة هاتف تعرض إشعار Discord باللون الأزرق على واجهة تطبيق

الأرقام والـ trade-offs

  • وقت الـ run: من 8 لـ 15 ثانية لكل منتج (Playwright بيحمّل الصفحة كاملة بـ JavaScript).
  • استهلاك الذاكرة: 200 لـ 300 ميجا أثناء التشغيل، بيرجع صفر بعد ما يخلص.
  • التكلفة الفعلية: صفر لو شغّاله على جهازك. على VPS بـ 5 دولار شهريًا (DigitalOcean basic droplet) بيستحمل 50 منتج كل ساعة بدون مشاكل.
  • الـ trade-off الأساسي: Playwright أبطأ بـ 10x من scraper بـ requests + BeautifulSoup. المكسب: بيشتغل على مواقع SPA و JavaScript-heavy، بـ uptime 95%+ بدلاً من scrapers تقليدية بتفشل أول ما الموقع يحدّث الـ DOM.
  • دقة السعر: الـ CSS selector ممكن يتغيّر فجأة لو الموقع عمل redesign. متوسط العمر الافتراضي للـ selector على Amazon حوالي 3 لـ 6 شهور قبل ما يحتاج تعديل.

متى لا تستخدم هذه الطريقة

لو بتراقب أكتر من 200 منتج، الحل ده هيبدأ يستهلك CPU كتير وممكن تتحظر من المتجر. في الحالة دي، استخدم خدمة scraping متخصصة زي Bright Data أو ScrapingBee (بـ 50 لـ 150 دولار شهريًا) بدل ما تحاول تعمل scaling لوحدك.

كمان لو الموقع المستهدف بيستخدم Cloudflare Bot Management أو DataDome أو PerimeterX، مش هتقدر تتجاوزه بـ Playwright لوحده — هتحتاج residential proxies + browser fingerprint randomization، وده بيخرج عن نطاق سكربت بسيط.

الخطوة التالية

هات منتج واحد بتراقبه دلوقتي. افتح صفحته في المتصفح، اضغط F12 لفتح DevTools، اعمل Inspect على السعر، كليك يمين على العنصر في الـ HTML واختار Copy → Copy selector. حط الـ selector ده مع الرابط في products.json، شغّل السكربت يدوي بـ python tracker.py، وشوف هل بيرجع رقم صحيح في الـ logs. لو رجع، حطه في cron وانسى الموضوع. لو ما رجعش، الـ selector غالبًا فيه id ديناميكي — جرّب selector أعم زي class بدل id.

المصادر

  • Playwright for Python — Official Documentation
  • Discord Webhooks API Reference
  • Crontab.guru — Cron Schedule Expression Editor
  • HTTPX — Async HTTP Client for Python

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة