المستوى المطلوب: مبتدئ. لو بتفتح موقع وتنقل أسعار المنتجات بإيدك كل يوم، المقال ده هيوفّرلك الساعة دي ويخلّي السكربت يعملها في ثواني. هتطلع منه بسكربت Python شغّال (أقل من 40 سطر) يسحب اسم وسعر كل منتج ويحفظهم في ملف products.csv تقدر تفتحه في Excel.
اعمل Web Scraper بـ Python يسحب أسعار المنتجات أوتوماتيك
المشكلة باختصار
أي صفحة منتجات على النت هي في الأصل ملف HTML: نص مليان وسوم زي <div> و<span>. عينك بتشوف جدول مرتب، لكن الكمبيوتر بيشوف فوضى وسوم. الـ Web Scraping هو إنك تكتب برنامج يقرأ الفوضى دي ويطلّع منها بيانات منظمة: اسم المنتج وسعره في صفوف. ده بيحل مشكلة حقيقية: متابعة الأسعار يدويًا بطيئة وبتغلط.
الفكرة بمثال بسيط قبل التعريف العلمي
تخيّل صاحبك قاعد قدامه جريدة فيها صفحة إعلانات مليانة منتجات وأسعار. انت طلبت منه يكتبلك في دفتر اسم كل منتج وسعره بس. هو بيعمل إيه؟ بيمشي بعينه سطر سطر، يلاقي اسم المنتج، يكتبه، يلاقي السعر جنبه، يكتبه، وينتقل للي بعده لحد ما يخلّص الصفحة.
السكربت بيعمل نفس الحركة بالظبط. الجريدة هي صفحة الـ HTML. وقلم صاحبك اللي بيعرف "ده اسم وده سعر" هو مكتبة بتفهم بنية الـ HTML. والدفتر هو ملف products.csv.
دلوقتي التعريف العلمي الدقيق: الـ HTML بيترتّب على شكل شجرة من العناصر المتداخلة (DOM tree). كل منتج بيبقى عنصر له اسم وسمات (attributes) وكلاس (class) بيميّزه. مكتبة زي Beautiful Soup بتحوّل النص ده لشجرة تقدر تتنقّل فيها، وتطلب منها مثلًا: "هاتلي كل عنصر كلاسه price". الكلام ده اسمه parsing، يعني تحويل نص خام لبنية ليها معنى.
الأدوات اللي هتستخدمها
هتحتاج أداتين بس:
- requests: بتجيب محتوى الصفحة (الـ HTML) من السيرفر. زي ما تكون فتحت الصفحة بس من غير متصفح.
- Beautiful Soup (bs4): بتفهم الـ HTML وتدوّر جواه على العناصر اللي عايزها.
التنصيب بأمر واحد:
pip install requests beautifulsoup4هنتدرّب على موقع books.toscrape.com، وهو موقع متعمّل مخصوص عشان الناس تتعلّم عليه الـ scraping بشكل قانوني وآمن. ده أحسن مكان تبدأ منه قبل ما تقرب من أي موقع حقيقي.
الخطوات: من صفر لملف CSV
- اجلب الصفحة بـ
requests.getوحط لها مهلة (timeout) عشان ميعلّقش برنامجك. - حوّل الـ HTML لشجرة بـ
BeautifulSoup. - اختار كل "كرت منتج" بالكلاس بتاعه، واسحب منه الاسم والسعر.
- كرّر على كل الصفحات، وحط تأخير بين الصفحة والتانية.
- اكتب النتيجة في ملف CSV.
import csv, time, requests
from bs4 import BeautifulSoup
BASE = "https://books.toscrape.com/catalogue/page-{}.html"
products = []
for page in range(1, 6): # 5 صفحات
url = BASE.format(page)
resp = requests.get(url, timeout=10,
headers={"User-Agent": "PriceBot/1.0 (تعلّم)"})
soup = BeautifulSoup(resp.text, "html.parser")
for card in soup.select("article.product_pod"):
name = card.h3.a["title"]
price = card.select_one(".price_color").text.strip()
products.append({"name": name, "price": price})
time.sleep(2) # تأخير مؤدّب بين الصفحات
with open("products.csv", "w", newline="", encoding="utf-8-sig") as f:
w = csv.DictWriter(f, fieldnames=["name", "price"])
w.writeheader()
w.writerows(products)
print(f"تم حفظ {len(products)} منتج في products.csv")السطر soup.select("article.product_pod") بيقول: "هاتلي كل عنصر article كلاسه product_pod". وكل واحد منهم بنسحب منه العنوان من h3 > a والسعر من الكلاس price_color. لاحظ encoding="utf-8-sig": ده بيخلّي Excel يفتح العربي صح من غير ما يبوّظ الحروف.
السحب المؤدّب: قواعد متعدّيهاش
السكربت السريع جدًا بيتحوّل لهجوم على السيرفر. قبل ما تسحب أي موقع حقيقي:
- اقرأ ملف robots.txt: افتح
الموقع/robots.txt. لو المسار اللي عايزه مكتوب جنبهDisallow، متسحبهوش. ده معيار رسمي اسمه RFC 9309. - حط تأخير: سطر
time.sleep(2)بيقلّل الضغط على السيرفر بشكل كبير. الـ trade-off هنا: بتكسب إنك مؤدّب ومش هتتحظر، بتخسر سرعة (5 صفحات بتاخد ~10 ثواني بدل أقل من ثانية). - دوّر على API رسمي الأول: لو الموقع بيوفّر API، استخدمه بدل الـ scraping من الأساس. أنضف وأثبت.
رقم حقيقي وسيناريو
الافتراض إن صفحاتك HTML ثابت (مش مبني بـ JavaScript بعد التحميل). على فرض إنك بتتابع كتالوج فيه 1000 منتج موزّعين على 50 صفحة: Beautiful Soup بتحلّل صفحة فيها 20 منتج في حوالي 30 إلى 50 ميلي ثانية، والوقت الأكبر بيروح في تحميل الصفحات نفسها ومعاه تأخير الـ 2 ثانية. يعني الـ 50 صفحة هتاخد حوالي دقيقة ونص بأمان، مقابل ساعة كاملة لو بتنقلهم بإيدك. المكسب: تحويل مهمة يومية تقيلة لسكربت بيشتغل لوحده.
متى لا تستخدم هذه الطريقة
الطريقة دي مش الحل في الحالات دي:
- الموقع بيبني المحتوى بـ JavaScript بعد التحميل (زي كتير من المتاجر الحديثة). وقتها
requestsهترجّع صفحة فاضية، وهتحتاج أداة زي Playwright بتشغّل متصفح حقيقي. - شروط استخدام الموقع بتمنع السحب صراحةً. احترمها.
- الموقع بيوفّر API رسمي. استخدمه، أوفرلك تعب وأثبت على المدى الطويل.
الخطوة التالية
انسخ الكود فوق، شغّله بـ python scraper.py، وافتح products.csv اللي هيتكوّن جنبه. بعد ما يشتغل، جرّب تغيّر الـ selector عشان تسحب تقييم كل كتاب كمان. لو طلعلك ملف فاضي، غالبًا الكلاس اللي اخترته غلط؛ افتح الصفحة في المتصفح، كليك يمين على المنتج ثم Inspect، وشوف اسم الكلاس الصح.
المصادر
- توثيق مكتبة requests الرسمي: requests.readthedocs.io
- توثيق Beautiful Soup الرسمي: crummy.com/software/BeautifulSoup/bs4/doc
- معيار Robots Exclusion Protocol (RFC 9309): rfc-editor.org/rfc/rfc9309
- موقع التدريب المخصّص للـ scraping: books.toscrape.com
- توثيق وحدة csv في Python: docs.python.org/3/library/csv