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:
- Link tabanlı tarama - Sayfalar arasındaki linkleri takip etme
- Sitemap tabanlı tarama -
sitemap.xmldosyası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ı
- 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,
});
- 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',
},
}]);
- 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($);
}
},
});
- 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:
-
Yapılandırma
- Uygun rate limit değerleri belirleyin
- Retry stratejilerini yapılandırın
- Anlamlı user-agent string’leri ayarlayın
-
Hata Yönetimi
- Crawlee’nin yerleşik hata yönetimini kullanın
- Özel hata callback’leri uygulayın
- Anlamlı tanılama bilgilerini loglayın
-
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
-
Kaynak Yönetimi
maxConcurrencydeğerini uygun şekilde yapılandırın- Gerektiğinde
maxRequestsPerCrawlkullanın - Bellek kullanımını izleyin
Meydan Okuma
Göreviniz, Crawlee tabanlı bir crawler oluşturmak:
- Ana sayfadan başlayıp tüm ürün kategorilerini keşfetsin
- Her kategori ve alt kategori sayfasını ziyaret etsin
- Her listeden ürün bilgilerini çıkarsın
- Verileri yapılandırılmış bir formatta düzenlesin
- 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!