Uygulamalı web crawling eğitim serimizin son bölümüne hoş geldiniz. Geleneksel bir ders yerine bu kez farklı bir yaklaşım benimsiyoruz. Bu bölüm için ./apps/metascraper dizininde Housefly Metascraper’ı oluşturdum — gerçek bir senaryoda şimdiye kadar öğrendiğimiz her şeyi nasıl uygulayabileceğimizi gösteren bir crawler.
Metascraper, basit statik HTML’i scrape etmekten JavaScript ile render edilen içerikte gezinmeye, API’lerle etkileşime girmekten crawling savunmalarını aşmaya kadar adım adım ilerleyen yolculuğumuzun, ölçekli biçimde yapılandırılmamış, çeşitli ve kaotik web’i yönetebilen bir araçta nasıl birleştiğini gösteriyor.
Ne tür veri yapılarıyla karşılaşacağımızı önceden bilmeden, çok farklı türde web sitelerinde nasıl crawl yapılacağını inceleyeceğiz ve AI destekli ayrıştırma, dinamik şema tespiti ile binlerce (hatta milyonlarca) sayfaya ölçeklenmek için gereken teknikleri ele alacağız.
“Yapılandırılmamış” ve “Büyük Ölçekli” Gerçekte Ne Anlama Geliyor?
Önceki bölümlerde çoğu zaman şunları biliyorduk:
- Hangi siteleri hedeflediğimizi.
- Hangi veriyi istediğimizi (ör. tablolar, listeler, JSON yanıtları).
- Kaç sayfayı ziyaret etmemiz gerektiğini.
Ama büyük ölçekli yapılandırılmamış crawling’de:
- Web siteleri çok büyük farklılıklar gösterir: bazıları yapılandırılmıştır, bazılarıysa düzensiz biçimlendirmeye sahip bloglardır.
- Path’ler ve URL’ler öngörülemez.
- Şema tutarsızdır ya da hiç yoktur.
- Binlerce sayfayı crawl etmek isteriz; bu da potansiyel olarak birden fazla domain anlamına gelir.
Şöyle düşünün:
- Akademik web siteleri genelinde veri toplayan araştırma crawler’ları.
- Konuya özgü bilgi için blogları indeksleyen AI asistanları.
- Tüm herkese açık internet genelinde genelleme yapmak zorunda olan arama motorları.
Web crawling’in final boss’u budur.
Part 1: Büyük Ölçekli Crawling için Mimarinin Kurulması
Ayrıştırmayı düşünmeden önce crawler’ınızı nasıl ölçekleyeceğinizden bahsedelim.
Tasarım Kalıpları
Büyük ölçekli bir crawler oluşturmak için mimariniz şu özelliklere sahip olmalıdır:
- Queue-driven: Bekleyen URL’leri saklamak için bir message queue (Redis, RabbitMQ veya Kafka gibi) kullanın.
- Worker-based: Crawler’ları, queue’dan iş çeken ve görevleri bağımsız biçimde işleyen worker process’lere ayırın.
- Deduplicated: Aynı sayfayı iki kez işlememek için bir fingerprint index’i (ör. URL’nin veya HTML içeriğinin SHA1 değeri) tutun.
- Resumable: Çökme durumlarından kurtulabilmesi için crawl durumunu kalıcı olarak saklayın.
İşte minimal bir tasarım diyagramı:
Part 2: 2025 için Son Teknoloji Teknikler
Residential Proxy’ler
Büyük ölçekli scraping’de en önemli ilerlemelerden biri residential proxy kullanımıdır. Web sitelerinin kolayca tespit edip engelleyebildiği datacenter IP’lerinin aksine, residential proxy’ler isteklerinizi gerçek kullanıcı IP adresleri üzerinden yönlendirir; böylece scraper’ınız meşru bir kullanıcı gibi görünür.
AI Destekli Otonom Ajanlar
2025’teki en devrim niteliğindeki gelişme agentic scraping’dir. Her site formatı için scraper’ları elle kodlamak yerine:
- Vision yeteneklerine sahip LLM’ler daha önce görülmemiş düzenleri anlayıp içlerinden veri çıkarabilir
- AI ajanları, insan tarama kalıplarını taklit ederek karmaşık sitelerde otonom biçimde gezinebilir
- Adaptive parsing, kod güncellemesi gerektirmeden düzen değişikliklerine otomatik olarak uyum sağlar
Part 3: AI Destekli Ayrıştırma
Temiz JSON çıktısı üretmesi için bir modeli fine-tune edin ya da prompt-engineering uygulayın:
{
"name": "Dr. Maria Lopez",
"title": "Climate Scientist",
"organization": "Stanford",
"topic": "2023 UN Climate Summit, AI in climate modeling"
}
Part 4: Veriyi Saklama, İndeksleme ve Arama
Çok miktarda heterojen veri toplayacaksınız. Saklama çözümünüzü, hedeflerinize ve verinin ne kadar yapılandırılmış olduğuna göre seçin.
Saklama Stratejileri
- PostgreSQL veya SQLite: Şemasını bildiğiniz yapılandırılmış tablo verileri için en iyisidir (ör. makaleler, fiyatlar, timestamp’ler). Index’leri, foreign key’leri ve full-text search (FTS) kullanabilirsiniz.
- MongoDB veya Elasticsearch: Şemanın kayıtlar arasında değişebildiği JSON blob’ları gibi yarı yapılandırılmış veya esnek veri formatları için idealdir.
- S3 / IPFS / File System: Ham HTML snapshot’ları, görseller, PDF’ler ve büyük binary dosyalar için idealdir. Metadata’yı bir veritabanında saklayın ve dosya konumuna bağlantı verin.
Primary key olarak UUID’ler veya URL hash’leri kullanın; böylece duplicate kayıtları önleyebilir ve daha önce crawl edilmiş öğeleri takip edebilirsiniz.
Aranabilir Hale Getirmek
Veri saklandıktan sonra içerik üzerinde keşif yapmak ve sorgulamak isteyeceksiniz.
Seçenekler şunlardır:
- PostgreSQL FTS (Full-Text Search): Sıralamalı güçlü anahtar kelime arama yetenekleri oluşturmak için
tsvectorvetsquerykullanın. - Typesense veya Meilisearch: Hızlı indeksleme ve fuzzy search için mükemmel, hafif ve şema esnekliğine sahip full-text search motorları.
- Elasticsearch: Güçlü filtreleme ve analitik özellikleriyle, daha karmaşık arama senaryoları veya log’lar için en iyi seçenektir.
Şu alanları indekslemelisiniz:
- Başlık
- Yazar
- Yayın tarihi
- Anahtar kelimeler veya etiketler (çıkarıldıysa)
- Ana içerik
- Domain / kaynak
Embedding’lerle Semantik Arama
Daha derin anlama ve retrieval için (anahtar kelimelerin ötesinde) text embedding kullanın:
- OpenAI’ın
text-embedding-3-smallmodeli veyabge-small-engibi açık kaynak alternatiflerden birini kullanın. - Crawl ettiğiniz içeriği embedding vektörlerine dönüştürün.
- Bunları şu tür bir vector database içinde saklayın:
- Qdrant
- Weaviate
- Pinecone
- FAISS (local / in-memory kullanım için)
Bu, şu tür semantik sorguları mümkün kılar:
“Bana birinin soğuk iklimlerde bisiklet dostu kentsel gelişimden bahsettiği makaleleri göster.”
Sorgu embedding’ini kayıtlı embedding’lerle karşılaştırarak crawler’ınız bir bilgi motoruna dönüşür.
Metadata ve Zenginleştirme
Son olarak, verinizi ek metadata ile zenginleştirin:
- Language detection (ör.
langdetectveya fastText ile). - Zero-shot modeller ya da fine-tune edilmiş sınıflandırıcılar kullanarak içerik kategori sınıflandırması.
- Kişileri, kuruluşları ve yerleri çıkarmak için Named Entity Recognition (NER).
- İçeriğe veya kaynağa dayalı geotagging.
Bunları ana verinin yanında saklayın; böylece daha sonra bunlara göre filtreleme ve sıralama yapabilirsiniz.
Part 5: Arama Odaklı Keşif Crawler’ları
Büyük ölçekli crawling’e yönelik en gelişmiş yaklaşım URL’lerle bile başlamaz — bunun yerine arama sorgularıyla başlar.
SearchXNG ve Perplexity gibi araçlardan ilham alan Metascraper, crawler’ın şu şekilde çalıştığı search-first bir strateji gösterir:
- Bir seed URL listesi yerine bir konu veya soruyla başlar
- İlgili sayfaları gerçek zamanlı olarak keşfetmek için arama motoru API’lerini kullanır
- Search result’lara göre crawl queue’sunu dinamik olarak oluşturur
- Bilgiyi genişletmek için citation ve referansları akıllıca takip eder
Bu yaklaşım çeşitli avantajlar sunar:
- Hedefe Yönelik Keşif: Kapsamlı crawling yerine yalnızca ilgili bilgi içerme olasılığı yüksek sayfaları ziyaret edersiniz
- Güncel Sonuçlar: Her crawl, güncel search result’larla sıfırdan başlar
- Domain-agnostic: Önceden tanımlanmış siteler veya URL kalıplarıyla sınırlı değildir
- Niyet odaklı: İnsanların konuları gerçekte nasıl araştırdığıyla uyumludur
Metascraper’ın arama odaklı modu; search API’lerini, önceliklendirme algoritmalarını ve bağlam farkında extraction tekniklerini birleştirerek, hangi URL’leri ziyaret edeceğinizi önceden bilmeden dinamik olarak keşfedilen içerikten bilgi grafikleri oluşturmayı gösterir.
İyi scraping’ler