بناء عنكبوت 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- طلبات HTTP باستخدام requests وhttpx
- تحليل HTML باستخدام BeautifulSoup
- بناء عنكبوت Scrapy
- التعامل مع JavaScript وإجراءات مكافحة الكشط