الزحف متعدد الصفحات

Mar 25, 2025

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

هناك نهجان رئيسيان لزحف المواقع متعددة الصفحات:

  1. الزحف القائم على الروابط - متابعة الروابط بين الصفحات
  2. الزحف القائم على خريطة الموقع - استخدام ملف sitemap.xml

بالنسبة لزحف خريطة الموقع، تقدم معظم المواقع ملف sitemap.xml يدرج جميع عناوين URL المهمة. يتضمن هذا الملف XML المنظم:

  • عناوين URL للصفحات
  • تواريخ آخر تعديل
  • تردد التغيير
  • قيم الأولوية

استخدام خريطة الموقع يمكن أن يكون أكثر كفاءة من زحف الروابط لأنه:

  • يوفر قائمة كاملة بالصفحات مسبقاً
  • يتضمن بيانات وصفية حول أهمية الصفحة وحداثتها
  • يتجنب زحف الصفحات غير الضرورية
  • يقلل من حمل الخادم

ولكن لهذا الفصل، سنركز على الزحف القائم على الروابط باستخدام Crawlee لبناء زاحف لموقع تجارة إلكترونية متعدد الصفحات. يتعامل Crawlee مع العديد من تعقيدات زحف الويب بالنسبة لنا، بما في ذلك:

  • إدارة الطوابير التلقائية وإزالة تكرار URL
  • منطق تحديد المعدل وإعادة المحاولة المدمج
  • معالجة الطلبات والتوجيه القابل للتكوين
  • تخزين البيانات والتصدير

بنية الموقع التي سنزحفها تبدو مثل هذا:

الصفحة الرئيسية
├── الفئة: الإلكترونيات
   ├── الهواتف
   ├── أجهزة الحاسوب المحمولة
   └── الإكسسوارات
├── الفئة: الملابس
   ├── الرجال
   └── النساء
└── المنتجات المميزة

تحتوي كل صفحة منتج على تخطيطات مختلفة حسب الفئة، ولكن نحتاج لاستخراج معلومات ثابتة:

// مثال على بنية البيانات التي نريد بناءها
interface ProductData {
  name: string;
  price: number;
  rating: { score: number, count: number };
  features: string[];
  status: string; // متوفر، غير متوفر، إلخ
}

interface ResultData {
  categories: {
    electronics: {
      phones: ProductData[];
      laptops: ProductData[];
      accessories: ProductData[];
    };
    clothing: {
      mens: {
        shirts: ProductData[];
        pants: ProductData[];
      };
      womens: {
        dresses: ProductData[];
        tops: ProductData[];
      };
    };
  };
  featured_products: FeaturedProduct[];
}

المفاهيم الأساسية للزحف مع Crawlee

  1. إدارة طابور الطلبات

يتعامل Crawlee مع الطابور تلقائياً، ولكن إليك كيفية تكوينه:

import { CheerioCrawler } from 'crawlee';

const crawler = new CheerioCrawler({
    // يتعامل مع كل طلب
    async requestHandler({ $, request, enqueueLinks }) {
        // معالج الصفحة
        const data = extractPageData($);

        // إضافة عناوين URL الجديدة الموجودة في الصفحة إلى الطابور تلقائياً
        await enqueueLinks({
            selector: 'a',
            baseUrl: request.loadedUrl,
        });
    },
    // تحديد الطلبات المتزامنة
    maxConcurrency: 10,
});

الزحف السعيد!