0Pricing
Python Academy · درس

بناء عنكبوت Scrapy

أنشئ مشروع Scrapy واكتب عنكبوتاً واتبع الروابط تلقائياً

بناء عنكبوت Scrapy درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

ما هو Scrapy؟

Scrapy هو إطار متكامل لاستخراج بيانات الويب، ويضم زحفًا غير متزامن مدمجًا، ومسارات لمعالجة العناصر، وبرمجيات وسيطة، ومصدّرات.

# pip install scrapy

# Create a project:
# scrapy startproject myspider

# myspider/
#   scrapy.cfg
#   myspider/
#     settings.py
#     spiders/
#       quotes_spider.py

إنشاء Spider

أنشئ فئة فرعية من scrapy.Spider، واضبط name وstart_urls، ثم نفّذ parse().

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
            }

محدّدات CSS وXPath

استخدم response.css("selector") أو response.xpath("//xpath") لاستخراج البيانات. يعيد .get() المطابقة الأولى، بينما يعيد .getall() جميع المطابقات.

def parse(self, response):
    # CSS:
    titles = response.css("h2.title::text").getall()

    # XPath:
    links = response.xpath("//a/@href").getall()

    yield {"titles": titles, "links": links}

اتباع الروابط

استخدم yield مع scrapy.Request لاتباع رابط وتحليل الصفحة التالية.

import scrapy

class Spider(scrapy.Spider):
    name = "crawler"
    start_urls = ["https://quotes.toscrape.com"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {"text": quote.css("span.text::text").get()}

        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

العناصر وItemLoaders

عرّف فئات Item لتنظيم البيانات المستخرجة، واستخدم ItemLoader لتنظيف الحقول وتحويلها.

import scrapy

class ProductItem(scrapy.Item):
    name  = scrapy.Field()
    price = scrapy.Field()
    url   = scrapy.Field()

def parse(self, response):
    item = ProductItem()
    item["name"]  = response.css("h1::text").get(strip=True)
    item["price"] = response.css(".price::text").re_first(r"[\d.]+")
    item["url"]   = response.url
    yield item

تشغيل Spider

شغّله من مجلد المشروع. ويمكنك التصدير إلى JSON أو CSV أو مسار معالجة مخصص.

# Run and print to console:
# scrapy crawl quotes

# Save to JSON:
# scrapy crawl quotes -o quotes.json

# Save to CSV:
# scrapy crawl quotes -o quotes.csv

# Scrapy shell for interactive testing:
# scrapy shell "https://quotes.toscrape.com"

الإعدادات: DOWNLOAD_DELAY وCONCURRENT_REQUESTS

تحلَّ بالمسؤولية: أضف فواصل زمنية وحدّد عدد الطلبات المتزامنة لتجنب إرهاق الخوادم.

# settings.py
DOWNLOAD_DELAY = 1          # 1 second between requests
CONCURRENT_REQUESTS = 8     # max 8 at a time
CONCURRENT_REQUESTS_PER_DOMAIN = 2
ROBOTSTXT_OBEY = True       # respect robots.txt

البرمجيات الوسيطة

تعترض البرمجيات الوسيطة الطلبات والاستجابات. استخدم البرمجيات المدمجة لتدوير User-Agent وإعادة المحاولة والتعامل مع ملفات تعريف الارتباط.

# settings.py
DOWNLOADER_MIDDLEWARES = {
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
    "myspider.middlewares.RotateUserAgentMiddleware": 400,
}

مسارات معالجة العناصر

تعالج مسارات المعالجة العناصر بعد استخراجها: تنظّف البيانات وتتحقق منها وتزيل التكرارات وتحفظها في قاعدة بيانات.

# pipelines.py
class CleanPipeline:
    def process_item(self, item, spider):
        item["name"] = item["name"].strip()
        return item

class DBPipeline:
    def open_spider(self, spider):
        self.conn = connect_db()

    def process_item(self, item, spider):
        self.conn.insert(dict(item))
        return item

معالجة تسجيل الدخول

استخدم FormRequest في Scrapy لإرسال نموذج تسجيل الدخول والاحتفاظ بملف تعريف ارتباط الجلسة.

import scrapy

class AuthSpider(scrapy.Spider):
    name = "auth"
    login_url = "https://example.com/login"

    def start_requests(self):
        yield scrapy.Request(self.login_url, self.login)

    def login(self, response):
        yield scrapy.FormRequest.from_response(
            response,
            formdata={"user": "me", "pass": "secret"},
            callback=self.parse
        )

‏scrapy-playwright لصفحات JS

تدمج الإضافة scrapy-playwright مكتبة Playwright في Scrapy للتعامل مع الصفحات المعروضة باستخدام JavaScript.

# pip install scrapy-playwright
# playwright install

# settings.py:
# DOWNLOAD_HANDLERS = {
#     "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
#     "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
# }

# In spider:
# yield scrapy.Request(url, meta={"playwright": True})

تحقق سريع

ماذا تفعل response.follow(href, callback) في Spider الخاص بـ Scrapy؟

مراجعة

تنشئ Spiders في Scrapy فئات فرعية من scrapy.Spider، وتعلن start_urls، وتستخدم yield لإرجاع العناصر أو Requests إضافية من parse(). استخدم محدّدات CSS/XPath، وتحلَّ بالمسؤولية باستخدام DOWNLOAD_DELAY، واستخدم مسارات المعالجة لحفظ البيانات.

الأسئلة الشائعة

هل درس «بناء عنكبوت Scrapy» مجاني؟

نعم — نص درس «بناء عنكبوت Scrapy» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء عنكبوت Scrapy»؟

أنشئ مشروع Scrapy واكتب عنكبوتاً واتبع الروابط تلقائياً تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «بناء عنكبوت Scrapy»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. طلبات HTTP باستخدام requests وhttpx
  2. تحليل HTML باستخدام BeautifulSoup
  3. بناء عنكبوت Scrapy
  4. التعامل مع JavaScript وإجراءات مكافحة الكشط
← العودة إلى Python Academy