बहु-पृष्ठ क्रॉलिंग

25 मार्च 2025

स्थिर और गतिशील, दोनों प्रकार के content scraping की बुनियादी बातें समझ लेने के बाद अब समय है एक अधिक व्यापक चुनौती पर काम करने का: बहु-पृष्ठ क्रॉलिंग। यह अनुभाग कई परस्पर जुड़े पृष्ठों वाली वेबसाइटों में कुशलतापूर्वक नेविगेट करने और उनसे data निकालने पर केंद्रित है।

बहु-पृष्ठ वेबसाइटों को क्रॉल करने के दो मुख्य तरीके हैं:

  1. लिंक-आधारित क्रॉलिंग - पृष्ठों के बीच मौजूद लिंक का अनुसरण करना
  2. sitemap-आधारित क्रॉलिंग - sitemap.xml file का उपयोग करना

sitemap क्रॉलिंग के लिए, अधिकांश वेबसाइटें एक sitemap.xml file उपलब्ध कराती हैं जिसमें सभी महत्वपूर्ण URLs की सूची होती है। इस संरचित XML file में ये शामिल होते हैं:

  • पृष्ठ URLs
  • अंतिम संशोधन तिथियाँ
  • परिवर्तन की आवृत्ति
  • प्राथमिकता मान

sitemap का उपयोग link crawling की तुलना में अधिक कुशल हो सकता है क्योंकि यह:

  • शुरुआत में ही पृष्ठों की पूरी सूची दे देता है
  • पृष्ठों के महत्व और नवीनता के बारे में metadata शामिल करता है
  • अनावश्यक पृष्ठों को क्रॉल करने से बचाता है
  • server पर load कम करता है

लेकिन इस अध्याय में हम Crawlee का उपयोग करके एक बहु-पृष्ठ e-commerce site के लिए crawler बनाने हेतु link-based crawling पर ध्यान देंगे। Crawlee हमारे लिए web crawling की कई जटिलताओं को संभालता है, जिनमें शामिल हैं:

  • स्वचालित queue management और URL deduplication
  • अंतर्निहित rate limiting और retry logic
  • विन्यास योग्य request handling और routing
  • data storage और export

जिस site संरचना को हम क्रॉल करेंगे, वह कुछ इस प्रकार है:

Homepage
├── Category: Electronics
│   ├── Phones
│   ├── Laptops
│   └── Accessories
├── Category: Clothing
│   ├── Men's
│   └── Women's
└── Featured Products

श्रेणी के आधार पर प्रत्येक product page का layout अलग है, लेकिन हमें एकसमान जानकारी निकालनी है:

// Example data structure we want to build
interface ProductData {
  name: string;
  price: number;
  rating: { score: number, count: number };
  features: string[];
  status: string; // In Stock, Out of Stock, etc.
}

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. Request Queue Management

Crawlee queue को अपने-आप संभालता है, लेकिन हम इसे इस तरह configure करते हैं:

import { CheerioCrawler } from 'crawlee';

const crawler = new CheerioCrawler({
    // Handles each request
    async requestHandler({ $, request, enqueueLinks }) {
        // Process the page
        const data = extractPageData($);

        // Automatically queue new URLs found on the page
        await enqueueLinks({
            selector: 'a',
            baseUrl: request.loadedUrl,
        });
    },
    // Limit concurrent requests
    maxConcurrency: 10,
});
  1. URL Handling

Crawlee अंतर्निहित URL handling और normalization प्रदान करता है:

await crawler.run([startUrl]);

// Or with more configuration:
await crawler.addRequests([{
    url: startUrl,
    userData: {
        label: 'start',
    },
}]);
  1. Route Handling

अलग-अलग URLs को विशिष्ट handlers तक route करें:

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. Data Collection

Crawlee एकत्रित data के लिए अंतर्निहित storage प्रदान करता है:

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

Web Crawling की सर्वोत्तम प्रक्रियाएँ

हालाँकि Crawlee कई low-level चिंताओं को संभाल लेता है, फिर भी आपको इन बातों पर ध्यान देना चाहिए:

  1. Configuration

    • उपयुक्त rate limits सेट करें
    • retry strategies configure करें
    • सार्थक user-agent strings सेट करें
  2. Error Handling

    • Crawlee के built-in error handling का उपयोग करें
    • custom error callbacks लागू करें
    • उपयोगी diagnostic information log करें
  3. Data Organization

    • अपने data को एकसमान तरीके से संरचित करें
    • routing के लिए request labels का उपयोग करें
    • Crawlee की dataset features का लाभ उठाएँ
  4. Resource Management

    • maxConcurrency को उपयुक्त रूप से configure करें
    • आवश्यकता होने पर maxRequestsPerCrawl का उपयोग करें
    • memory usage पर नज़र रखें

चुनौती

आपका कार्य एक Crawlee-आधारित crawler बनाना है जो:

  1. homepage से शुरू करे और सभी product categories खोजे
  2. प्रत्येक category और subcategory page पर जाए
  3. प्रत्येक listing से product information निकाले
  4. data को एक संरचित प्रारूप में व्यवस्थित करे
  5. उन products को संभाले जो कई जगह दिखाई देते हैं (जैसे featured और category)

इस site में अलग-अलग categories में लगभग 25-30 products हैं, जिनके layout और information structure भिन्न-भिन्न हैं। आपका crawler ऐसा व्यापक dataset तैयार करे जो categories और products के बीच के पदानुक्रमिक संबंध को बनाए रखे।

अपने समाधान का परीक्षण

इन बातों के लिए परीक्षण करें:

  • पूर्णता: क्या आपने सभी products खोज लिए?
  • शुद्धता: क्या निकाला गया data सही है?
  • संरचना: क्या data ठीक से व्यवस्थित है?
  • दक्षता: आपने कितने requests किए?

exercises/chapter-06/solution/src/ में दिया गया reference solution, Crawlee का उपयोग करते हुए एक कार्यशील implementation प्रदान करता है। इसे पढ़कर समझें कि कुशल बहु-पृष्ठ क्रॉलिंग और data organization के लिए library की सुविधाओं का प्रभावी उपयोग कैसे किया जाए।

क्रॉलिंग शुभ हो!