Web tarama botu (crawler), web sayfalarını ziyaret eden, bulduğunu kaydeden, sayfalardaki bağlantıları izleyen ve neyin değiştiğini görmek için daha sonra geri dönen bir programdır. Arama motorları, web arşivleri, SEO araçları, fiyat takip servisleri ve yapay zekâ eğitim verisi derleyen süreçler bu botları çalıştırır. Ajan ya da yapay zekâ özelliği geliştiriyorsanız crawler'lar sizi üç açıdan ilgilendirir: ajanınızın dayandığı arama sonuçları ve veri setleri büyük olasılıkla bir crawler tarafından toplandı; bir gün kendiniz yazmaya heveslenebilirsiniz; ve kendi başına sayfa çeken bir ajan, o siteleri işleten kişilerin gözünde bir crawler'a çok benzer.
Tek ekranda tarama döngüsü
Ölçeği bir kenara bırakırsanız her crawler dört iş yapar: ziyaret edilecek URL'lerin kuyruğunu tutar, bu URL'leri çeker, çektiği içerikten metni ve yeni bağlantıları ayıklar, ne zaman geri döneceğine karar verir. Bu kuyruğa genellikle frontier (tarama sınırı) denir. En sade hâli şöyle görünür:
frontier = load_seeds()
while frontier.has_due_urls() and budget.remaining():
url = frontier.next_due() # host başına bekleme aralığına uyar
if not robots_allows(url, agent=UA):
frontier.mark_skipped(url, reason="robots")
continue
resp = fetch(url, user_agent=UA, timeout=20)
log(url, resp.status, resp.headers, fetched_at=now())
if resp.is_html() and resp.is_indexable():
store(url, extract_text(resp), content_hash(resp))
for link in extract_links(resp):
frontier.add(normalize(link))
frontier.schedule_revisit(url, based_on=change_history(url))
Gerçek mühendisliğin neredeyse tamamı bu fonksiyon adlarının içinde saklıdır. Nezaket kuralları next_due içinde yaşar. İki URL'nin aynı sayfa olup olmadığına normalize karar verir. Web'in sizdeki kopyasının ne kadar taze kalacağını schedule_revisit belirler. Yazının geri kalanı bunları tek tek ele alıyor.
Keşif: URL'ler nereden gelir
Bir crawler hiç duymadığı bir sayfayı çekemez. URL'ler kuyruğa birkaç kaynaktan girer:
- Başlangıç listeleri. Elle seçilmiş bir başlangıç kümesi: ilgilendiğiniz siteler, bir alan adı listesi, bir dizin.
- Çekilen sayfalardaki bağlantılar. Klasik yöntem budur. Çekilen her sayfa, dışarıya verdiği bağlantıları kuyruğa ekler; tarama böyle yayılır.
- Site haritaları. Bir sitenin kendi URL'lerini, çoğu zaman son değişiklik ipucuyla birlikte listelediği XML dosyaları; biçimleri sitemaps.org adresinde tanımlıdır. Hiçbir yerden bağlantı verilmeyen sayfaları bulmanın en ucuz yoludur.
- Akışlar. RSS ve Atom akışları yeni öğeleri duyurur; haberler, bloglar ve sürüm notları için kullanışlıdır.
Keşif hemen ikinci bir sorun doğurur: aynı sayfa çoğu zaman pek çok adreste yaşar. İzleme parametreleri, oturum kimlikleri, sondaki eğik çizgi, büyük-küçük harf farkı, http ile https; hepsi tek bir belge için farklı dizgeler üretir. Crawler, URL'leri açık kurallarla normalleştirir (bilinen izleme parametrelerini atmak, alan adını küçük harfe çevirmek, parça tanımlayıcılarını kaldırmak) ve sitenin tercih ettiği adresi bildirdiği yerde rel="canonical" ipucuna uyar. Bu adım olmadan bütçenin büyük kısmı kopyaları çekmeye gider.
Bazı sitelerde crawler tuzakları da bulunur: bir sonraki aya sonsuza dek bağlantı veren takvimler, filtreleri birleştirerek bitmeyen URL varyasyonları üreten faset arama sayfaları ya da her istekte yeni bağlantılar oluşturan sayfalar. Host başına URL sınırı, derinlik sınırı ve kalıp kuralları, taramanın bunlardan birinde kaybolmasını önler.
Siteyi yormadan çekmek
Nezaket, site sahibinin sizi neredeyse hiç fark etmemesi demektir. Pratikte birkaç alışkanlığa dayanır: host başına az sayıda eşzamanlı bağlantı, aynı hosta giden istekler arasında bekleme, büyük siteleri daha sakin saatlerde tarama ve sıkıştırılmış yanıt isteme. Koşullu istekler iki taraf için de iyidir: daha önce gördüğünüz ETag değerini ya da son değişiklik zamanını gönderirseniz, değişmemiş bir sayfa belgenin tamamı yerine kısa bir 304 yanıtıyla döner.
Yanıt kodu, kibar bir crawler'a sıradaki adımı söyler:
| Yanıt | Kibar bir crawler ne yapar |
|---|---|
| 200 OK | İçeriği saklar ve ne zaman çekildiğini kaydeder; yeniden ziyaret planlar. |
| 301 / 308 yönlendirme | Yönlendirmeyi izler ve saklanan adresi yeni konumla günceller. |
| 304 Not Modified | Mevcut kopyayı korur, son kontrol zamanını yeniler. |
| 404 / 410 | Sayfayı kalkmış olarak işaretler; 410 yanıtını bilinçli bir kaldırma sayar. |
| 429 / 503 | O hosta karşı yavaşlar; gönderilmişse Retry-After başlığına uyar. |
| 401 / 403 | Durur. Site hayır demiştir; bunu aşmaya çalışmaz. |
Robots kuralları ve diğer sinyaller
İyi huylu bir crawler, bir hostta herhangi bir şey çekmeden önce /robots.txt dosyasını okur. Robots Exclusion Protocol olarak bilinen ve RFC 9309 ile yayımlanan bu biçim, kuralları user-agent'a göre gruplar ve izin verilen ya da yasaklanan yolları listeler. En özgül eşleşen kural geçerli olur.
User-agent: * Disallow: /cart/ Disallow: /search Allow: /search/help User-agent: ExampleResearchBot Disallow: / Sitemap: https://www.example.com/sitemap.xml
Bu örnekte sepet ve site içi arama sonuçları dışında her crawler siteyi çekebilir; adı verilen bir bot ise siteden tamamen uzak durmaya davet ediliyor. İki yanlış anlama yaygındır. Birincisi, robots.txt bir erişim denetimi değil, bir ricadır: teknik olarak hiçbir şey bir crawler'ın onu yok saymasını engellemez; ona uymanın iyi davranışın asgari şartı sayılmasının nedeni de tam olarak budur. İkincisi, bir güvenlik mekanizması değildir: yasaklanan bir yol gizli değildir, hassas içerik gerçek kimlik doğrulama ister.
Diğer sinyaller sayfa düzeyinde çalışır. noindex robots meta etiketi ya da X-Robots-Tag başlığı arama motorlarından sayfayı dizine eklememelerini, nofollow ise bağlantılarını izlememelerini ister; bunlar çekme işleminin kendisini değil, sonrasını yönetir. Bazı site sahipleri artık yapay zekâ eğitim verisi toplayan crawler'lar için ayrı kurallar yayımlıyor; bu yüzden tek bir kuralın her amacı kapsadığını varsaymak yerine sitenin hangi user-agent adlarına seslendiğine bakın. llms.txt gibi öneriler, dil modelleri için bir sitenin derlenmiş bir özetini sunar; faydalı bir bağlamdır ama bir izin sistemi değildir. Giriş ekranının ya da ödeme duvarının arkasındaki içerik ise zaten bir crawler'ın alanı dışındadır.
Kimlik: kim olduğunuzu söyleyin
Bir crawler kolayca tanınabilmeli ve kolayca ulaşılabilmelidir. Bu, ürün adını ve botun ne yaptığını, hangi kurallara uyduğunu, işletenlere nasıl ulaşılacağını anlatan bir URL'yi içeren sabit bir user-agent dizgesi demektir:
User-Agent: ExampleResearchBot/1.2 (+https://example.com/bot)
Sorumlu işletmeciler bir adım daha ileri gider. Crawler'larının kullandığı IP aralıklarını yayımlar ya da ters DNS doğrulamasını desteklerler; böylece site sahibi bir isteğin gerçekten onlardan geldiğini teyit edebilir. Farklı amaçlar için farklı adlar kullanırlar: arama dizini oluşturmak, eğitim verisi toplamak ya da bir kullanıcı istediği için tek bir sayfayı çekmek gibi. Böylece site sahipleri birine izin verip diğerini reddedebilir. Ve botlar için yazılmış kuralları atlatmak amacıyla bir crawler'ı asla sıradan bir tarayıcı gibi göstermezler.
Aynı ilke ajanlar için de geçerli. Bir kullanıcının isteği üzerine tek bir sayfa çeken ajan, toplu tarama yapan bir crawler'dan farklı türde bir ziyaretçidir ve pek çok işletmeci bu ikisini ayrı adlarla etiketler. Hangisi olursa olsun dürüst tercih, trafiği tanıtmak ve sitenin istediğine uymaktır.
Toplanan veriye ne olur
Her çekme işlemi genellikle bir kayıt üretir: istenen URL, yönlendirmelerden sonraki nihai URL, durum kodu, yanıt başlıkları, çekme zamanı, içeriğin özeti (hash) ve içeriğin kendisi. Bu içerik ham HTML olabilir ya da sayfasını JavaScript ile oluşturan siteler için işlenmiş (render edilmiş) bir sayfa; işleme bir headless tarayıcı gerektirir ve düz bir çekmeden çok daha pahalıdır. Sonraki adımlar menü ve alt bilgi gibi kalıp metni ayıklar, dili tespit eder, birbirine çok benzeyen kopyaları birleştirir ve metni pasajlara böler.
Veri oradan çok farklı kullanımlara gider: bir arama dizini, bir arşiv, bir eğitim derlemi, bir değişiklik izleme servisi, bir fiyat karşılaştırma tablosu ya da bir araştırma veri seti. Hepsinde geçerli iki kural var. URL ve çekme zamanı içerikle birlikte taşınmalıdır; çünkü ne zaman alındığı bilinmeyen bir bilginin güncelliği değerlendirilemez. Ve bir sayfayı taramak size o sayfa üzerinde hiçbir hak vermez: sakladığınız ve yeniden yayımladığınız şeye telif hakkı, kullanım koşulları ve kişisel veri kuralları uygulanmaya devam eder. Bu sınırları web kazıma yazısı daha ayrıntılı ele alıyor.
Ajanınızın bir crawler'a ihtiyacı var mı?
Çoğu zaman yok. Ajan özelliklerinin çoğu bir web sitesinin kopyasına değil, bir sorunun yanıtına ihtiyaç duyar. Bir web arama API'si, ajanınıza başkasının bakımını yaptığı bir dizine erişim verir. Bilinen birkaç URL'yi gerektiğinde çekmek, birçok izleme ve araştırma işini karşılar. Bir sitenin kendi API'si ya da veri dışa aktarımı, sayfalarını ayrıştırmaktan daha istikrarlıdır. Büyük ölçekli araştırma için Common Crawl gibi açık tarama veri setleri de mevcut. Kendi crawler'ınızı yazmak; belirli siteleri bilinen bir sıklıkla ve tanımlı bir kapsamda taramanız gerektiğinde ve bununla gelen nezaket, kimlik ve saklama sorumluluklarını üstlenmeye hazır olduğunuzda anlamlıdır.
GoCux'ın yeri
GoCux bir crawler değildir ve açık web'i okumaz. Bilgi arama, bir projenin içeri aktardığı dokümanlar üzerinde çalışır. Web'den malzeme gerektiğinde bu malzeme, birinin yetkilendirdiği bir tarayıcı oturumu ya da dışa aktarma adımıyla içeri girer ve geldiği sayfanın referansı ile alındığı tarihle birlikte saklanır; böylece gözden geçiren kişi hem kaynağını hem de yaşını değerlendirebilir. Browser Link yalnızca açıkça izin verilmiş bir tarayıcı görevini yürütür; bir URL'yi bilmek, bir girişi aşmak için izin anlamına gelmez. Veri dışa aktarmak, ekipten birinin kararını bekleyen eylemlerden biridir. Bu sınırı web kaynakları ve sorumlu ajan erişimi notu ile crawler dokümantasyonu anlatıyor.
Bir crawler ya da sayfa çeken bir ajan çalıştırmadan önce
- Tarama gerçekten gerekli mi, yoksa bir arama API'si, sitenin kendi API'si, bir dışa aktarım ya da bir akış soruyu yanıtlar mı?
- User-agent dizgeniz botu adlandırıyor ve onu ve size nasıl ulaşılacağını anlatan bir sayfaya işaret ediyor mu?
- robots.txt dosyasını host başına okuyup önbelleğe alıyor ve adınızla eşleşen gruba uyuyor musunuz?
- Host başına eşzamanlılık, istek aralığı ve 429 ya da 503 sonrası geri çekilme kodda zorunlu tutuluyor mu?
- Kopyalardan ve tuzaklardan kaçınmak için URL'leri normalleştiriyor ve host başına URL sayısını sınırlıyor musunuz?
- Saklanan her kayıt nihai URL'sini, durum kodunu ve çekme zamanını koruyor mu?
- 401 ve 403 yanıtlarında etrafından dolaşmanın yolunu aramak yerine duruyor musunuz?
- Saklamayı planladığınız şey için kullanım koşullarını ve kişisel veri kurallarını kontrol ettiniz mi?
Bu iş akışını çalışma alanınıza taşıyın.
Kapsamı belirleyin. Kanıtları inceleyin. Gereken adımları onaylayın.