Bizim durumumuz: Biz Geonode olarak, tarama işlemi için gerekli olan ancak liste yönetimi için kullanılmayan proxy’ler satıyoruz. Dürüstçe söylemek gerekirse, kötü yönetilen bir tarama listesi, kötü seçilmiş bir proxy planından çok daha pahalıya mal olur. URL normalizasyonu yapılmamış bir tarayıcı, farklı sorgu parametresi sıralamalarıyla aynı sayfayı onlarca kez ziyaret eder ve gigabayt başına fiyatlandırma sisteminde bunların her biri için ödeme yaparsınız. Bütçesi olmayan bir tarayıcı, takvimi sonsuza kadar takip eder ve bunun için size fatura keser. Listeyi düzeltmek ücretsizdir; fatura kesildikten sonra düzeltmek ise değildir. Bu bölüm aşağıdadır ve ilk olarak okunması gereken bölüm budur.
Tarama Listesi Aslında Nedir?
Sık sık birbiriyle karıştırılan üç unsur.
Tohum listesi — başlangıç noktası. Birkaç URL ya da tam bir site haritası.
Sınır — Keşfedilmiş ve kuyruğa alınmış ancak henüz alınmamış URL'ler. Bu, çalışma veri yapısıdır ve tüm tasarım kararlarının yer aldığı yerdir.
Ziyaret Edilenler kümesi — Zaten alınmış olan URL'ler; tekrar almamanız için saklanır.
Yaşam döngüsü bir döngüdür: sınırdan bir URL alın, indirin, bağlantıları çıkarın, normalize edin, ziyaret edilenler kümesinde veya kuyrukta bulunanları eleyin, geri kalanını sınıra ekleyin, URL'yi ziyaret edilmiş olarak işaretleyin. Sınır boşalana veya bütçe tükenene kadar tekrarlayın.
Ana hatlarıyla basit. Ancak her adımda, yanlış yaparsanız size bir gününüze mal olacak bir ayrıntı vardır.
Tohumlama: İlk URL’lerin Kaynağı
Her birinin ne kadar işten tasarruf sağladığına göre sıralanmıştır.
Site haritası. Mevcut en iyi tohum kaynağıdır; çünkü sitenin kendi envanteridir ve nelerin değiştiğini gösteren lastmod zaman damgalarını içerir. Bunu robots.txt dosyasındaki Sitemap: yönergesi aracılığıyla bulun ve site haritası dizin dosyalarını özyinelemeli olarak takip edin.
Bir iş ortağı beslemesi veya API. Eğer varsa, taramaya hiç gerek kalmayabilir.
Web arşivleri. Internet Archive’ın CDX API’si, artık hiçbir yerden bağlantı verilmeyen sayfalar da dahil olmak üzere bir alan adı için geçmiş URL’leri döndürür. Hedefe hiçbir maliyeti yoktur ve tarama ile bulunamayan “yetim” sayfaları bulur.
Arama operatörleri. site: sorguları, indekslenmiş sayfaları ve daha da yararlı olarak, varlığından haberdar olmadığınız alt etki alanlarını ortaya çıkarır.
Kategori ve dizin sayfaları. Hedefli bir tarama için, ilgilendiğiniz belirli liste sayfalarından başlangıç yapmak, ana sayfadan başlayıp şansınızı denemekten çok daha verimlidir.
Ana sayfa. Son çare ve insanların ilk olarak başvurduğu varsayılan yöntemdir. Tek bir URL’den başlayıp bağlantı izleme yoluyla her şeyi keşfetmek, en kötü kapsama alanına ulaşmanın en yavaş yoludur.
Bir web sitesindeki tüm sayfaları nasıl bulurum başlıklı yazımızda kaynak hiyerarşisinin tamamını inceledik. Kısaca özetlemek gerekirse: iyi bir başlangıç listesi, taramayı bir getirme işlemine dönüştürür.
URL Normalleştirme: Herkesin Atladığı Adım
Bir tarayıcıdaki en değerli mühendislik unsuru ve en sık göz ardı edilenidir.
Bu işlem yapılmadığında, ziyaret edilen sayfalar kümenize ait beş farklı URL ve sunucuya gönderilen tek bir sayfa ortaya çıkar:
http://Example.com/Products
http://example.com/products
http://example.com/products/
http://example.com:80/products
http://example.com/products?utm_source=email
RFC 3986, her zaman güvenli olan normalleştirme yöntemlerini tanımlar.
Büyük/küçük harf normalizasyonu. "Şema ve ana bilgisayar büyük/küçük harfe duyarlı değildir ve bu nedenle küçük harfe normalize edilmelidir. Örneğin, <HTTP://www.EXAMPLE.com/>
URI'si <http://www.example.com/>."
ile eşdeğerdir. Sınıra dikkat edin: "Diğer genel sözdizimi bileşenlerinin, şema tarafından aksi özellikle belirtilmedikçe büyük/küçük harfe duyarlı olduğu varsayılır." Yollar büyük/küçük harfe duyarlıdır — bunları küçük harfe dönüştürmeyin.
Ayrıca: "Yüzde kodlamalı üçlü içindeki onaltılık rakamlar (ör. %3a
ile %3A
arasındaki fark) büyük/küçük harfe duyarlı değildir ve bu nedenle büyük harfler kullanılacak şekilde normalleştirilmelidir".
Yüzde kodlamalı normalleştirme. RFC, bunu "aksi takdirde aynı olan URI'ler arasında sıkça görülen bir farklılık kaynağı" olarak nitelendirir; zira "bazı URI üreticileri, yüzde kodlamasına gerek olmayan oktetleri yüzde kodlamasına tabi tutar". Bunlar, "ayrılmamış bir karaktere karşılık gelen yüzde kodlamalı oktetleri kodunu çözerek normalleştirilmelidir".
Yol bölümü normalleştirme. remove_dot_segments
algoritmasını uygulayarak .
ve ..
bölümlerini kaldırın; çünkü "bazı kullanıma sunulan uygulamalar, referans zaten bir URI olduğunda referans çözümlemesinin gerekli olmadığını yanlış bir şekilde varsayar".
Şema tabanlı normalleştirme. RFC, kanonik bir örnek vermektedir — şu dördü birbirine eşdeğerdir:
http://example.com
http://example.com/
http://example.com:/
http://example.com:80/
Dolayısıyla boş bir yol “/
” yoluna normalleştirilmelidir ve varsayılan veya boş bir bağlantı noktası “şema tabanlı normalleştirme yoluyla kaldırılmalıdır”.
Spesifikasyonun ötesinde, üç normalleştirme yöntemi katı bir güvenlik garantisi sunmaktan ziyade pratik amaçlıdır ve dikkatli bir şekilde uygulanması gerekir:
İzleme parametrelerini kaldırın. utm_*
, fbclid
, gclid
, oturum tanımlayıcıları. Bunlar içeriği neredeyse hiç değiştirmez ve URL sayınızı muazzam ölçüde artırır. Tahminde bulunmak yerine bir liste tutun.
Kalan sorgu parametrelerini sıralayın. ?a=1&b=2
ve ?b=2&a=1
genellikle aynı sayfaya yönlendirir. Genellikle — bazı uygulamalar sıraya duyarlıdır, bu nedenle bir örnek üzerinde test edin.
Parçaları kaldırın. #section
istemci tarafındadır ve sunucuya asla ulaşmaz. Tarama amacıyla bunları kaldırmak her zaman güvenlidir.
**Ve rel="canonical"
adresini dikkate alın.** Bir sayfa kanonik bir URL bildiriyorsa, bu, sitenin size birkaç adres arasından hangisinin gerçek olduğunu söylediği anlamına gelir. Bunu dikkate almak, sitenin kendi otoritesinin desteğiyle ücretsiz bir şekilde yinelenen içeriklerin ortadan kaldırılması anlamına gelir.
The Frontier: Kuyruk Tasarımı
Tarayıcınızın ölçeklenebilir olup olmadığına üç özellik karar verir.
Tekilleştirme işlemi düşük maliyetli olmalıdır. Bir URL’yi eklemeden önce, bu URL’nin halihazırda biliniyor olup olmadığını kontrol edersiniz. Bir milyon URL söz konusu olduğunda, doğrusal tarama kullanılamaz hale gelir. Bir hash kümesi belirli bir noktaya kadar işe yarar; bunun ötesinde, bir Bloom filtresi size çok daha az bellek kullanımıyla sabit zamanlı üyelik sağlar ve yanlış pozitif oranı düşüktür — yani, zaman zaman daha önce görmediğiniz bir URL'yi atlarsınız. Çoğu tarama için bu takas uygundur; eksiksizliğin önemli olduğu durumlarda ise, filtreyi tam bir depolama ile destekleyin.
Sıralama kontrol edilebilir olmalıdır. Düz bir FIFO kuyruğu genişlik öncelikli tarama sağlar; bu genellikle istediğiniz şeydir — erken aşamada geniş bir kapsama ulaşır ve yüzeysel kalır. Bir LIFO yığını ise derinlik öncelikli tarama sağlar; bu, bir dalın derinliklerine iner ve site taraması için nadiren yararlıdır. Öncelik kuyruğu, istediğiniz herhangi bir kritere göre sıralama yapmanıza olanak tanır; bu konu bir sonraki bölümde ele alınacaktır.
Her ana bilgisayar için durum izlenmelidir. Uygulamada sınır, tek bir kuyruk değildir; her ana bilgisayar için ayrı bir kuyruktur, böylece nezaket sınırlamaları her birine bağımsız olarak uygulanır. Küresel bir hız sınırına sahip tek bir küresel kuyruk, büyük bir sitenin diğerlerini aç bırakması anlamına gelir.
Ölçeklenebilir yapı, ana bilgisayar başına kuyruklar kümesinden ve bir sonraki veri alınabilecek uygun ana bilgisayarı seçen bir zamanlayıcıdan oluşur; burada “uygun” terimi, o ana bilgisayara yapılan son istekten bu yana yeterli sürenin geçmiş olması anlamına gelir.
Önceliklendirme
Hepsini alamadığınızda, bir sonraki olarak hangi URL’yi alacağınız.
Derinliğe göre. Daha yüzeysel sayfalar genellikle daha önemlidir. Basit ve etkili bir varsayılan ayar.
Yol desenine göre. Ürün sayfalarını istiyorsanız, /product/ ile eşleşen URL'lere öncelik verin. Bu, hedefli taramalar için en yüksek getirili sezgisel yöntemdir ve maliyeti çok düşüktür.
lastmod'e göre. Site haritasından. Değişenleri alın.
Değişiklik geçmişine göre. Tekrarlanan taramalar için, daha önce sık sık değişen sayfalar yine sık sık değişecektir.
Gelen bağlantı sayısına göre. Birçok yerden bağlantı verilen sayfalar genellikle daha önemlidir. Tarama sırasında hesaplanması maliyetlidir, ancak büyük işler için buna değer.
Tahmini değere göre. Gerçek hedefiniz ne olursa olsun. Fiyat bilgisi istiyorsanız, bunları içermesi muhtemel sayfalara öncelik verin.
Pratik olarak, kuyruğa ekleme sırasında bu sinyallerden birkaçı kullanılarak hesaplanan küçük bir tamsayı puanı, öncelik kuyruğunda anahtar olarak kullanılır. Ayrıntılı şemalar, karmaşıklıklarını nadiren haklı çıkarır; derinlik artı yol-desen bonusu çoğu ihtiyacı karşılar.
Sınırlama: Bütçeler ve Tuzaklar
Sınırlama olmadan bazı taramalar hiç sona ermez. Bu, istisnai bir durum değildir.
Maksimum derinlik. Bağlantılardan gelen bağlantılar. Beş veya altı derinlik sınırı, neredeyse tüm gerçek site yapılarını kapsar.
Host başına maksimum sayfa sayısı. Sabit bir rakam. Bu sınıra ulaşıldığında, devam etmek yerine durun ve raporlayın.
Toplam maksimum sayfa sayısı. Tüm iş için.
Maksimum bant genişliği. Özellikle ölçümlenen proxy trafiğinde, sınırsız tarama sınırsız fatura anlamına gelir.
Desen hariç tutmaları. Takvimler klasik bir sonsuz alandır — next month
bağlantısı sonsuza kadar URL üretir. Büyük bir katalogdaki yönlendirmeli gezinme, kombinasyonel patlamalara yol açar. Bunları desene göre hariç tutun:
/calendar/
/?filter=
/*?sort=
Yinelenen içerik algılama. İçeriği hashleyin. Yüz URL aynı içeriği döndürüyorsa, yüz sayfa değil, otomatik olarak üretilen bir alanla karşı karşıyasınız demektir.
Ve keşif oranını izleyin. En yararlı tek uyarı: Alınan her sayfa başına yeni keşfedilen URL’leri takip edin. Sınırlı bir sitede bu oran istikrarlı bir şekilde sıfıra doğru düşer. Eğer sabit kalırsa veya yükselirse, bir şey URL’leri tüketebileceğinizden daha hızlı bir şekilde oluşturuyor demektir — bir tuzak, bir takvim veya bir fasetli patlama. Kasıtlı versiyonları honeypot tuzakları başlığında ele aldık.
Yeniden Tarama Zamanlaması
Birden fazla kez çalıştırılan her şey için liste, bir zamanlama haline gelir.
Değişkenliğe göre sınıflandırın. Saat başı değişen sayfalar saatlik kontroller gerektirir; yılda bir kez değişen sayfalar ise gerektirmez. En değişken öğenin gerektirdiği sıklıkta her şeyi taramak, bütçeyi aşmanın en yaygın yoludur.
Koşullu istekler kullanın. If-Modified-Since ve If-None-Match, yeniden taramayı her biri birkaç yüz baytlık bir dizi 304 Not Modified yanıtına dönüştürür. Çoğu sayfanın değişmediği bir yeniden taramada bu, hem faturanızı hem de hedefin yükünü bir mertebe azaltır.
Gözlemlere göre uyum sağlayın. Bir sayfa on kontrol boyunca değişmediyse, daha seyrek kontrol edin. Son üç kontrolde değiştiyse, daha sık kontrol edin. Basit bir çarpımsal geri çekilme yeterlidir.
Sayfanın kaldırıldığını açıkça tespit edin. Sayfalar ortadan kaybolur ve siteler bunu nadiren duyurur. Ya 404 hatalarını takip edin ya da bir kural uygulayın — arka arkaya üç taramada görülmeyen bir URL, etkin olmayan olarak işaretlenir. Aksi takdirde, veri kümeniz artık mevcut olmayan girdilerle dolar ve bu durum, eksik girdilerden daha hızlı bir şekilde güvenilirliği zedeler.
Depolama ve Ölçek
Bellek içi yaklaşımın ne zaman işe yaramaz hale geldiğine dair bir not.
Yaklaşık yüz bin URL’ye kadar, Python kümeleri ve listeleri yeterlidir. Gereğinden fazla karmaşıklaştırmayın.
Birkaç milyona kadar, URL hash'i ve getirme durumuna ilişkin dizinler içeren yerel bir veritabanı (SQLite iyi sonuç verir) kullanın. Kalıcılık, çöken bir taramanın yeniden başlatılmak yerine devam ettirilmesi anlamına gelir; bu, performanstan daha önemlidir.
Bunun ötesinde, uygun bir kuyruk ve bir anahtar-değer deposu kullanın; sınır, işleyicilere bütün ana bilgisayarlar atanabilmesi ve koordinasyona gerek kalmadan nezaket kurallarının doğru bir şekilde korunabilmesi için ana bilgisayara göre bölümlere ayrılmalıdır.
Her ölçekte fayda sağlayan iki tasarım kararı:
Sadece URL’yi değil, URL hash’ini de depolayın. Sabit uzunluktaki bir hash üzerinde yapılan karşılaştırmalar ve indekslemeler daha ucuzdur ve depolama alanı daha az yer kaplar.
Sadece ayrıştırılmış sonucu değil, ham yanıtı da depolayın. Bir ayrıştırıcı arızalandığında — ki bu kaçınılmazdır — elinizdeki veriyi yeniden ayrıştırmak ücretsizdir; oysa yeniden getirme işlemi bant genişliği ve itibar kaybına mal olur.
Minimal Bir Uygulama
Hareketli parçaları somutlaştırmak için, tüm kod yaklaşık kırk satırda yer alıyor.
import time
from collections import deque, defaultdict
from urllib.parse import urlsplit, urlunsplit, parse_qsl, urlencode
TRACKING = {"utm_source", "utm_medium", "utm_campaign", "fbclid", "gclid"}
def normalise(url):
p = urlsplit(url)
host = p.hostname or ""
port = "" if p.port in (None, 80, 443) else f":{p.port}"
query = urlencode(sorted(
(k, v) for k, v in parse_qsl(p.query, keep_blank_values=True)
if k.lower() not in TRACKING
))
return urlunsplit((p.scheme.lower(), host + port, p.path or "/", query, ""))
class Frontier:
def __init__(self, delay=1.5, max_per_host=5000):
self.queues = defaultdict(deque)
self.seen = set()
self.next_ok = defaultdict(float)
self.counts = defaultdict(int)
self.delay, self.max_per_host = delay, max_per_host
def add(self, url, depth=0):
url = normalise(url)
if url in self.seen or depth > 5:
return False
host = urlsplit(url).hostname
if self.counts[host] >= self.max_per_host:
return False
self.seen.add(url)
self.counts[host] += 1
self.queues[host].append((url, depth))
return True
def next(self):
now = time.monotonic()
for host, q in self.queues.items():
if q and self.next_ok[host] <= now:
self.next_ok[host] = now + self.delay
return q.popleft()
return None
Burada beş tasarım kararı göze çarpıyor ve her biri yukarıdaki bölümlerden birine karşılık geliyor.
Normalleştirme, veri alınma anında değil, add() adresinde gerçekleşir. Tekilleştirme, yalnızca kanonik biçim ziyaret edilen kümeye girerse doğru olur; dolayısıyla daha sonra normalleştirme yapmak, yinelenenleri zaten depolamış olduğunuz anlamına gelir.
Ziyaret edilen küme, işlem tamamlandığında değil, kuyruğa eklendiğinde doldurulur. Aksi takdirde, yirmi sayfada keşfedilen bir URL, ilk veri alma işlemi tamamlanmadan yirmi kez kuyruğa alınır.
Kuyruklar ana bilgisayar bazında, nezaket kuralı ise ana bilgisayar bazındadır. next_ok, her bir ana bilgisayara bir sonraki sefer ne zaman bağlanılabileceğini kaydeder; böylece büyük bir site diğerlerini kaynak sıkıntısına uğratamaz ve gecikme gerektiği yerlerde uygulanır.
Bütçeler, giriş noktasında uygulanır. Derinlik ve ana bilgisayar başına sınırlar, URL'leri belleği tüketmeden önce reddeder; bu, sınırlı bir tarama ile RAM'i tüketerek sınırını keşfeden bir tarama arasındaki farktır.
next(), engelleme yerine None değerini döndürür. Bu, çağıran tarafın bekleyip beklememeyi, başka işler yapmayı veya işlemi bitirmeyi serbestçe karar vermesini sağlar — veri yapısı içinde uyku moduna geçen bir zamanlayıcı, izleme araçlarıyla izlenemez.
Burada kasıtlı olarak eksik bırakılan şey kalıcılıktır ve gerçek bir uygulama için eklenmesi gereken ilk şey budur. Tohum listesinden yeniden başlatılması gereken çökmüş bir tarama, sadece zaman kaybetmekle kalmaz; her şeyi yeniden alır ve bu da bant genişliği ve itibar kaybına neden olur.
Listenin Ölçümlenmesi
Neyi ölçmeliyiz? Çünkü yalnızca “alınan sayfalar” sayısını bildiren bir tarama, size neredeyse hiçbir şey söylemez.
Zaman içindeki sınır boyutu. Sıfıra doğru düşmelidir. Artması, sınırsız keşif anlamına gelir.
Keşif oranı. Yukarıdaki gibi, alınan sayfa başına yeni URL sayısı.
Duruma göre, ana bilgisayar başına alınma sonuçları. Toplam rakamlar, bir ana bilgisayarın tamamen arızalı olduğunu gizler.
Yinelenme oranı. Keşfedilen URL'lerin kaçı zaten biliniyordu? Normalleştirme işleminden sonra yüksek bir oran, normalleştirme işleminizde bir şeyin eksik olduğu anlamına gelir.
Kullanışlı sayfa başına bayt sayısı. Taramayı faturayla ilişkilendiren ve ihtiyacınız olmayan megabaytlarca görüntüyü alan başsız bir tarayıcıyı ortaya çıkaran rakamdır.
İçerik doğrulamaları. Sayfaların beklediğiniz işaretçileri içerip içermediği. Yumuşak engellenmiş sayfalar döndürürken %100 başarı bildiren bir tarayıcı, maliyetli bir hatadır ve bunu yalnızca içerik doğrulamaları yakalayabilir.
İnsanlar Ayrıca Şunları Soruyor
Tarama listesi nedir?
Bir tarayıcının ziyaret etmeyi planladığı URL'lerin kümesidir; genellikle bir başlangıç listesi, keşfedilmiş ancak henüz alınmamış URL'lerden oluşan bir sınır kümesi ve ziyaret edilmiş URL'lerden oluşan bir kümeden oluşur. Sınır kümesinin yönetimi — sıra, tekilleştirme ve bütçeler — taramanın tamamlanıp tamamlanmayacağını belirleyen en önemli faktördür.
Tarama için URL'leri nasıl normalleştirebilirim?
Şema ve ana bilgisayarı küçük harfe çevirin, ancak yolu küçük harfe çevirmeyin; yüzde kodlamalı onaltılık rakamları büyük harfe çevirin; gereksiz yüzde kodlamalarını çözün; nokta segmentlerini kaldırın; varsayılan bağlantı noktalarını atın; boş yolu / olarak normalize edin; parçaları kaldırın ve bilinen izleme parametrelerini ayıklayın. RFC 3986, son ikisi hariç tüm bunları tanımlar.
Tarama sınırı nedir?
Henüz alınmamış, keşfedilmiş URL’lerin kuyruğudur. Uygulamada bu, ana bilgisayar başına kuyruklar kümesinden ve nezaket sınırları dahilinde uygun olan bir sonraki ana bilgisayarı seçen bir zamanlayıcıdan oluşur; çünkü tek bir genel kuyruk, büyük bir sitenin diğer tüm siteleri bekletmesine neden olur.
Tarayıcımın sonsuza kadar çalışmasını nasıl engelleyebilirim?
Sıkı bütçeler: maksimum derinlik, ana bilgisayar başına ve toplamda maksimum sayfa sayısı ile bant genişliği sınırı. Takvimler ve yönlendirmeli gezinme için desen hariç tutmaları ekleyin ve yeni keşfedilen URL'lerin, alınan sayfalara oranının azalması durduğunda uyarı verin.
Aynı sayfayı iki kez taramaktan nasıl kaçınabilirim?
Aynı sayfanın birçok geçerli adresi olabileceğinden, tekilleştirme işleminden önce URL’leri normalleştirin. Ardından, ziyaret edilenler kümesindeki üyeliği kontrol edin — küçük ölçekte bir hash kümesi, büyük ölçekte ise bir Bloom filtresi veya veritabanı kullanabilirsiniz. Sayfaların belirttiği durumlarda rel="canonical" etiketini dikkate alın.
Ne sıklıkla yeniden tarama yapmalıyım?
Gereksinimlerinizin izin verdiği ölçüde en az sıklıkta, her sayfanın gerçekte ne sıklıkla değiştiğine göre kademelendirin. Site haritasından lastmod adresini ve koşullu istekleri kullanın; böylece değişmemiş sayfalar tam bir getirme işlemi yerine bir 304 ile karşılanır. Her şeyi değişken sayfaların sıklığında taramak, en yaygın israf kaynağıdır.
Bloom filtresi nedir ve buna ihtiyacım var mı?
Çok az bellek kullanarak sabit sürede üyeliği belirleyen, yanlış pozitif olasılığı düşük olan olasılıksal bir kümedir — yani, zaman zaman aslında görmediğiniz bir URL’yi atlayabilirsiniz. Birkaç milyon URL’nin üzerinde kullanmaya değer; bunun altında gereksizdir, çünkü bu durumda basit bir küme daha basit ve kesindir.
Sayfaların kaldırıldığını nasıl tespit edebilirim?
404 hatalarını takip edin ve artık görünmeyen sayfalar için bir politika uygulayın — örneğin, bir URL üç ardışık taramada görülmediyse onu etkin olmayan olarak işaretleyin. Aksi takdirde, veri kümesinde artık mevcut olmayan girdiler birikir ve bu durum, eksikliklerden daha hızlı bir şekilde güvenilirliği zedeler.
Sonuç
İndirme işlemi büyük ölçüde kayıt tutma işidir. Verilerin alınması, kütüphaneler sayesinde çözülmüş bir sorundur; neyin alınacağına karar vermek, onu daha önce aldığınızı fark etmek ve ne zaman durmanız gerektiğini bilmek ise mühendisliğin devreye girdiği noktalardır.
Zorluk derecesine oranla dikkat edilmesi gereken üç husus vardır. Normalleştirme; çünkü bu yapılmazsa aynı sayfayı bir düzine farklı adres üzerinden ziyaret edersiniz ve her biri için ödeme yaparsınız — RFC 3986 ise hangi dönüşümlerin güvenli olduğunu tam olarak belirtir. Bütçeler, çünkü bazı URL alanları gerçekten sonsuzdur ve katı sınırları olmayan bir tarayıcı bunlardan birine rastlayacaktır. Ve keşif oranı, çünkü bu, fatura gelmeden çok önce bir tuzağı, bir takvimi veya yönlü bir patlamayı ortaya çıkaran tek bir sayıdır.
Ardından iyi bir başlangıç yapın. Bir site haritası, taramayı neyin değiştiğinin alınmasına dönüştürür; bir arşiv sorgusu ise bağlantı izleme yoluyla asla ulaşılamayacak sayfaları ortaya çıkarır ve her ikisi de hedef için hiçbir maliyet oluşturmaz. Ana sayfadan başlayıp umuda bel bağlamak, en az eksiksiz sonuca giden en yavaş yoldur ve bu hâlâ varsayılan yöntemdir.
