Çok Sayfalı Tarama

25 Mar 2025

Statik ve dinamik içerik scraping’inin temellerini öğrendiğimize göre, şimdi daha kapsamlı bir meydan okumaya geçme zamanı: çok sayfalı tarama. Bu bölüm, birbiriyle bağlantılı birden fazla sayfaya sahip web sitelerinde verimli şekilde gezinmeye ve veri çıkarmaya odaklanır.

Çok sayfalı web sitelerini taramak için iki ana yaklaşım vardır:

  1. Link tabanlı tarama - Sayfalar arasındaki linkleri takip etme
  2. Sitemap tabanlı tarama - sitemap.xml dosyasını kullanma

Sitemap taraması için çoğu web sitesi, tüm önemli URL’leri listeleyen bir sitemap.xml dosyası sağlar. Bu yapılandırılmış XML dosyası şunları içerir:

  • Sayfa URL’leri
  • Son değiştirilme tarihleri
  • Değişim sıklığı
  • Öncelik değerleri

Sitemap kullanmak, link taramasına göre daha verimli olabilir çünkü:

  • Baştan tüm sayfaların tam bir listesini sunar
  • Sayfa önemi ve güncelliği hakkında metadata içerir
  • Gereksiz sayfaların taranmasını önler
  • Sunucu yükünü azaltır

Ama bu bölümde, çok sayfalı bir e-ticaret sitesi için Crawlee kullanarak bir crawler oluşturmak amacıyla link tabanlı taramaya odaklanacağız. Crawlee, web taramanın birçok karmaşıklığını bizim yerimize ele alır; bunlar arasında şunlar vardır:

  • Otomatik kuyruk yönetimi ve URL tekilleştirme
  • Yerleşik rate limiting ve retry mantığı
  • Yapılandırılabilir request işleme ve routing
  • Veri depolama ve dışa aktarma

Tarayacağımız site yapısı şu şekilde görünüyor:

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

Her ürün sayfası kategoriye bağlı olarak farklı layout’lara sahip, ancak bizim tutarlı bilgiler çıkarmamız gerekiyor:

// 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 ile Temel Tarama Kavramları

  1. Request Queue Yönetimi

Crawlee kuyruğu otomatik olarak yönetir, ancak bunu şu şekilde yapılandırıyoruz:

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 İşleme

Crawlee, yerleşik URL işleme ve normalizasyon sağlar:

await crawler.run([startUrl]);

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

Farklı URL’leri belirli handler’lara yönlendirin:

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. Veri Toplama

Crawlee, toplanan veriler için yerleşik depolama sağlar:

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

Web Tarama için En İyi Uygulamalar

Crawlee birçok düşük seviyeli konuyu ele alsa da, yine de şunları göz önünde bulundurmalısınız:

  1. Yapılandırma

    • Uygun rate limit değerleri belirleyin
    • Retry stratejilerini yapılandırın
    • Anlamlı user-agent string’leri ayarlayın
  2. Hata Yönetimi

    • Crawlee’nin yerleşik hata yönetimini kullanın
    • Özel hata callback’leri uygulayın
    • Anlamlı tanılama bilgilerini loglayın
  3. Veri Organizasyonu

    • Verilerinizi tutarlı bir şekilde yapılandırın
    • Routing için request label’larını kullanın
    • Crawlee’nin dataset özelliklerinden yararlanın
  4. Kaynak Yönetimi

    • maxConcurrency değerini uygun şekilde yapılandırın
    • Gerektiğinde maxRequestsPerCrawl kullanın
    • Bellek kullanımını izleyin

Meydan Okuma

Göreviniz, Crawlee tabanlı bir crawler oluşturmak:

  1. Ana sayfadan başlayıp tüm ürün kategorilerini keşfetsin
  2. Her kategori ve alt kategori sayfasını ziyaret etsin
  3. Her listeden ürün bilgilerini çıkarsın
  4. Verileri yapılandırılmış bir formatta düzenlesin
  5. Birden fazla yerde görünen ürünleri yönetsin (ör. featured ve kategori)

Site, farklı kategorilere dağılmış ve farklı layout’lar ile bilgi yapıları içeren yaklaşık 25-30 ürün barındırıyor. Crawler’ınız, kategoriler ile ürünler arasındaki hiyerarşik ilişkiyi koruyan kapsamlı bir dataset üretmelidir.

Çözümünüzü Test Etme

Şunları test edin:

  • Tamlık: Tüm ürünleri buldunuz mu?
  • Doğruluk: Çıkarılan veriler doğru mu?
  • Yapı: Veriler düzgün şekilde organize edildi mi?
  • Verimlilik: Kaç request yaptınız?

exercises/chapter-06/solution/src/ içindeki referans çözüm, Crawlee kullanan çalışan bir implementasyon sunar. Çok sayfalı verimli tarama ve veri organizasyonu için kütüphanenin özelliklerinden nasıl yararlanılacağını anlamak üzere onu inceleyin.

İyi taramalar!