خزیدگی چند صفحه‌ای

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,
});
  1. مدیریت URL

Crawlee مدیریت و عادی‌سازی URL داخلی فراهم می‌کند:

await crawler.run([startUrl]);

// یا با پیکربندی بیشتر:
await crawler.addRequests([{
    url: startUrl,
    userData: {
        label: 'start',
    },
}]);
  1. مدیریت مسیر

مسیریابی URL‌های مختلف به مدیریت‌کننده‌های مشخص:

const crawler = new CheerioCrawler({
    async requestHandler({ $, request }) {
        const { label } = request.userData;

        switch (label) {
            case 'category':
                return handleCategory($);
            case 'product':
                return handleProduct($);
            default:
                return handleHomepage($);
        }
    },
});
  1. جمع‌آوری داده

Crawlee ذخیره داخلی برای داده‌های جمع‌آوری شده فراهم می‌کند:

const crawler = new CheerioCrawler({
    async requestHandler({ $, pushData }) {
        const productData = extractProduct($);
        await pushData(productData);
    },
});

بهترین روش‌های خزیدگی وب

در حالی که Crawlee بسیاری از نگرانی‌های سطح پایین را مدیریت می‌کند، باید همچنان موارد زیر را در نظر بگیرید:

  1. پیکربندی

    • محدوده‌های نرخ مناسب تنظیم کنید
    • استراتژی‌های تلاش مجدد را پیکربندی کنید
    • رشته‌های user-agent معنادار تنظیم کنید
  2. مدیریت خطا

    • از مدیریت خطای داخلی Crawlee استفاده کنید
    • callback‌های خطای سفارشی پیاده‌سازی کنید
    • اطلاعات تشخیصی معنادار را ثبت کنید
  3. سازماندهی داده

    • داده‌های خود را به طور ثابت ساختار دهید
    • از برچسب‌های درخواست برای مسیریابی استفاده کنید
    • از ویژگی‌های dataset Crawlee استفاده کنید
  4. مدیریت منابع

    • maxConcurrency را به طور مناسب پیکربندی کنید
    • در صورت نیاز از maxRequestsPerCrawl استفاده کنید
    • استفاده از حافظه را نظارت کنید

چالش

وظیفه شما ساخت یک خزنده مبتنی بر Crawlee است که:

  1. از صفحه اصلی شروع کند و همه دسته‌بندی‌های محصول را کشف کند
  2. از هر صفحه دسته‌بندی و زیردسته‌بندی بازدید کند
  3. اطلاعات محصول را از هر فهرست استخراج کند
  4. داده‌ها را در قالبی ساختاریافته سازماندهی کند
  5. محصولاتی که در جاهای متعدد ظاهر می‌شوند (مثل ویژه و دسته‌بندی) را مدیریت کند

سایت شامل تقریباً 25-30 محصول در دسته‌بندی‌های مختلف، با طرح‌بندی‌ها و ساختار اطلاعات متنوع است. خزنده شما باید مجموعه داده‌ای جامع تولید کند که روابط سلسله‌مراتبی بین دسته‌بندی‌ها و محصولات را حفظ کند.

آزمایش راه‌حل شما

آزمایش برای:

  • کاملبودن: آیا همه محصولات را پیدا کردید؟
  • دقت: آیا داده‌های استخراج شده درست است؟
  • ساختار: آیا داده‌ها به درستی سازماندهی شده‌اند؟
  • کارایی: چه تعداد درخواست انجام دادید؟

مثال حل شده در _solved/chapter6/ پیاده‌سازی مرجع با استفاده از Crawlee فراهم می‌کند. آن را مطالعه کنید تا بفهمید چگونه از ویژگی‌های کتابخانه برای خزیدگی چند صفحه‌ای کارآمد و سازماندهی داده استفاده کنید.

خزیدگی خوشحال!