Veri Kazıma: Sayfanın Makine Tarafından Okunması Nasıl Oluyor?

Veri kazıma, bir sayfanın insan için hazırlanmış görünümünün altındaki belge yapısına inip belirli alanları adresleyerek okuma işidir. Bu sayfa terimi tanıtmakla yetinmiyor; kazımanın hangi katmanda çalıştığını, bir alanın nasıl adreslendiğini, sayfa ilk yanıtta boş geldiğinde ne olduğunu ve kural setinin neden zamanla ömrünü doldurduğunu anlatıyor. Kavramla ilk kez karşılaşıyorsanız girişi işletme dilinde yapan veri çekme sayfamızdan başlamak daha rahat olur.

Sahibinden Pro — yıllık lisans ₺12.500 (KDV dahil). ₺300 karşılığı 1 günlük deneme lisansı alınabilir. Satın al: Sahibinden Pro

“Kazıma” terimi ne anlatıyor: ekrandan belgeye

Terim İngilizce scraping kelimesinden geliyor ve kökeni bugünküne benzemeyen bir yönteme dayanıyor: ekran kazıma. Eski sistemlerde çıktı alınacak tek yer terminal ekranıydı; program, karakter ızgarasının belli satır ve sütunlarındaki metni okuyup ayıklardı. Konum tamamen sabit varsayıldığı için bir satır kaydığında her şey bozulurdu. Web kazıma bunun daha dayanıklı hâlidir: artık piksel ya da karakter konumu değil, belgenin kendi yapısı okunur. Üçüncü bir kavram olan arayüz tüketimi ise bambaşkadır; orada karşı taraf size zaten yapılandırılmış bir veri sunar ve ayrıştırma diye bir sorun yoktur. Bu üçünü ayırmak pratikte önemlidir, çünkü kırılganlık sıralaması buradan çıkar: resmî arayüz en kararlıdır, belge yapısını okumak orta düzeydedir, görüntü üzerinden okumak en kırılganıdır ve yalnızca ilk ikisi mümkün olmadığında düşünülür. Türkçede “veri kazıma”, “web kazıma” ve “veri çekme” çoğu metinde aynı işi anlatır; bu sayfada kazıma derken kastedilen, ikinci katman yani belge yapısının okunmasıdır.

Sayfa makine gözüyle: düğüm, öznitelik, metin

Tarayıcı bir sayfayı aldığında onu bir metin yığını olarak bırakmaz; iç içe geçmiş kutulardan oluşan bir ağaç kurar. Bu ağaçta üç tür bilgi vardır. Birincisi düğümlerdir: başlık kutusu, liste kutusu, bağlantı kutusu gibi. İkincisi özniteliklerdir: bir kutunun kimliği, sınıf adı, bağlantı adresi, veri etiketi. Üçüncüsü metin içeriğidir: kullanıcının okuduğu yazının kendisi. Somutlaştıralım. Bir ilan listesinde her ilan tek bir kart kutusunun içindedir; kartın içinde başlık kutusu, fiyat kutusu, konum kutusu ve ilanın kendi sayfasına giden bağlantı bulunur. Kazıma programı önce “kart” seviyesindeki kutuların listesini alır, sonra her kartın içinde tek tek dolaşarak alanları okur. Bu iki aşamalı yaklaşım tesadüf değildir: doğrudan tüm fiyat kutularını toplarsanız hangi fiyatın hangi başlığa ait olduğunu kaybedersiniz. Kart sınırının doğru belirlenmesi, kazımanın en kritik ilk kararıdır. Kayıt kimliği de burada çıkar; genellikle karttaki bağlantının içindeki ilan numarası, sonraki turlarda aynı kaydı tanımak için kullanılan tek güvenilir çapadır.

Alanı adreslemek: CSS seçici, XPath ve metin ankrajı

Bir alanı okumak için önce onu adreslemeniz gerekir ve bunun üç yaygın yolu vardır. CSS seçici, tarayıcıların stil için kullandığı adresleme dilidir; kısa ve okunaklıdır, ağaçta aşağı doğru iner. XPath ise belge ağacında yukarı da çıkabilen, koşul yazmaya izin veren daha güçlü bir dildir; “içinde şu metin geçen kutunun bir üst kutusu” gibi ifadeler ancak burada kurulabilir. Üçüncüsü metin ve rol ankrajıdır: alanı sınıf adıyla değil, yanındaki görünen etikete göre bulmak. Kararlılık sıralaması genelde şöyledir: görünen etikete dayalı adres en dayanıklı, sabit bir kimliğe ya da veri etiketine dayalı adres ikinci, sınıf adına dayalı adres üçüncü, konuma dayalı adres en kırılgandır. Sınıf adının neden zayıf olduğu ayrıca önemli: modern arayüzlerin çoğunda sınıf adları elle yazılmaz, derleme sırasında üretilir. Site kod tarafında hiçbir görsel değişiklik yapmadan yeniden yayına aldığında bile bu adlar değişebilir. Bu yüzden kural yazarken sorulacak soru “bu adres bugün çalışıyor mu” değil, “bu adres site yeniden derlendiğinde de aynı kalır mı” olmalıdır.

İlk yanıtta olmayan veri: istemci tarafı render ve sanal liste

Bir sayfanın adresini indirip içine baktığınızda listenin hiç olmadığını görebilirsiniz. Bu bir hata değil, yaygın bir mimari tercihtir: sunucu yalnızca boş bir iskelet gönderir, içerik tarayıcıda çalışan kod tarafından ayrıca istenip yerleştirilir. Bu durumda sayfayı yalnızca indirip ayrıştıran basit yaklaşımlar boş döner; işin gerçek bir tarayıcı içinde yapılması gerekir. İkinci katman kaydırmayla yüklenen içeriktir: kartlar ekrana yaklaştıkça istenir, bu yüzden sayfanın sonuna inmeden liste tamamlanmaz. Üçüncüsü ve en çok yanıltanı sanal listedir: performans için yalnızca ekranda görünen satırlar ağaçta tutulur, yukarı kaydırdığınızda üstteki satırlar ağaçtan silinir. Böyle bir listede “önce sonuna kadar in, sonra hepsini oku” yaklaşımı çalışmaz; kaydırdıkça toplamak ve topladığını kayıt numarasına göre biriktirmek gerekir. Sayfalamanın kendisi de tek biçimli değildir: numaralı sayfalar, “daha fazla göster” düğmesi ve imleç tabanlı ilerleme farklı durum yönetimi ister. Kazımanın zor kısmı alanı okumak değil, listenin gerçekten bittiğini anlamaktır.

Kural setinin ömrü: kırılmayı fark edilir kılmak

Yazdığınız adresler hedef sayfanın bugünkü yapısına bağlıdır ve o yapı size haber verilmeden değişir. Beklenen sonuç programın durup hata vermesidir; can sıkıcı olan, bunun her zaman böyle olmamasıdır. Adres artık hiçbir şeye denk gelmediğinde birçok kütüphane boş değer döndürür, program da çalışmaya devam eder ve bir sütunu baştan sona boş yazar. Teknik tarafta bunu görünür kılmanın üç somut yolu var. Birincisi alan başına doluluk eşiğidir: her sütun için beklenen dolu oranını yazın, bu turun oranı eşiğin altına düşerse tarama başarısız sayılsın. İkincisi referans sayfadır: hedef sayfanın bilinen bir kopyasını diskte tutup kural setini ona karşı çalıştırın; siteye hiç gitmeden kuralların hâlâ doğru alanları bulduğunu doğrularsınız. Üçüncüsü kural setinin sürümlenmesidir: hangi tarihte hangi adresin geçerli olduğunu kayda geçirin, böylece geçmiş bir çıktının hangi kurala göre üretildiği belli olur. Bizim tarafımızda hedef sayfa değiştiğinde uyum yaması yayınlanır ve abonelik boyunca ek ücret alınmaz; ama değişimin fark edilmesiyle yamanın çıkması arasında kısa bir pencere olabileceğini de saklamıyoruz.

Tempo, oturum ve kimlik: yavaşlık bir özelliktir

Kazımada hız, çoğu zaman düşünüldüğü gibi bir kalite göstergesi değil, risk göstergesidir. Sunucular birim zamandaki istek sayısını izler; eşik aşıldığında önce yanıtlar yavaşlar, sonra hız sınırı yanıtı döner, ardından erişim tamamen kesilebilir. Doğru davranış eşiği zorlamak değil, sinyali okuyup geri çekilmektir: yanıt süresi uzamaya başladığında bekleme aralığını artırmak, hata alındığında üstel biçimde geri çekilip yeniden denemek. Eşzamanlılık da aynı çerçeveye girer; aynı anda beş sekme açmak beş kat hız değil, beş kat dikkat çekmek anlamına gelir. Oturum tarafında iki yaklaşım vardır. Birincisi programa kullanıcı adı ve parola vermektir; kolaydır ama kimlik bilgisi bir yerde saklanmak zorunda kalır. İkincisi, otomasyonun sizin zaten giriş yapmış olduğunuz gerçek tarayıcı profilinizi kullanmasıdır; parola hiç girilmez. Botlarımız ikinci modeli kullanır. Şunu da net yazalım: hız sınırını atlatmak, doğrulama ekranını geçmek ya da resmî arayüzü baypas etmek gibi bir yetenek yoktur. Kazıma, sizin hesabınızın görebildiğinden fazlasını göremez.

Çıktı tarafı: kodlama, ayraç ve yerel biçim

Kazımanın son adımı çoğu zaman en az konuşulan ama en çok zaman yiyen adımdır. Üç klasik tuzak var. Birincisi karakter kodlamasıdır: sayfa kodlaması ile yazdığınız dosyanın kodlaması uyuşmadığında Türkçe harfler bozulur. Tablo programlarının bir kısmı düz metin dosyasını açarken sistem varsayılanını kullandığı için, dosya doğru üretilmiş olsa bile ekranda bozuk görünebilir; bu yüzden elektronik tablo biçiminde çıktı almak ya da içe aktarırken kodlamayı elle seçmek daha güvenlidir. İkincisi ayraçtır: Türkçe yerel ayarlarda virgül ondalık ayracı olarak kullanıldığından, virgülle ayrılmış bir dosya sütunları yanlış bölebilir. Üçüncüsü sayı ve tarih ayrıştırmasıdır: sayfada “1.250.000 TL” yazan bir değerde nokta binlik ayracıdır ve bunu doğrudan sayıya çevirmeye kalkarsanız ya hata alırsınız ya da bin iki yüz elli gibi tamamen yanlış bir değer elde edersiniz. Aynı şekilde gün-ay-yıl sırası varsayılan olarak ay-gün-yıl gibi yorumlanırsa, ayın on ikinci gününe kadar olan tarihler sessizce yer değiştirir. Kazıma kurulumunun sağlamlığı, bu üç dönüşümün nerede ve hangi kurala göre yapıldığının yazılı olmasıyla ölçülür.

Sık sorulan sorular

Veri kazıma ile veri çekme arasında teknik bir fark var mı?

Terim olarak yok; ikisi de aynı işi anlatır. Fark dildedir: “kazıma” daha çok teknik metinlerde, “çekme” işletme dilinde kullanılır. Bu sayfada kazıma derken belge yapısının okunmasını kastediyoruz, yani görüntü üzerinden okumayı ya da resmî arayüz tüketimini değil.

Hedef site tasarımını değiştirirse kural seti ne kadar sürede bozulur?

Öngörülebilir bir süre yok. Görsel bir yenileme yapılıp yapı korunduğunda hiçbir şey olmaz; görünüm aynı kalıp sınıf adları yeniden üretildiğinde ise ertesi gün bozulabilir. Bu yüzden takvim tutmak yerine ölçüm kurmak gerekir: her turda satır sayısını ve alan doluluk oranlarını bir önceki turla karşılaştırın.

JavaScript ile gelen içerik kazınabilir mi?

Evet, ama sayfayı yalnızca indirip ayrıştıran yaklaşımlarla değil. İçerik tarayıcıda çalışan kod tarafından yerleştiriliyorsa işin gerçek bir tarayıcı içinde yürütülmesi gerekir. Botlarımız zaten bu modelle çalışır: gerçek tarayıcı açılır, sayfa sizin gördüğünüz gibi yüklenir, sonra okuma yapılır.

Sayfanın arka planda çektiği veriyi doğrudan okumak daha mı iyi?

Teknik olarak bazen daha temiz sonuç verir, çünkü veri zaten yapılandırılmış hâldedir. Ancak bu yollar resmî olarak yayımlanmadıkları için habersiz değişirler ve bir kısmı sitenin kullanım şartlarınca kısıtlanmış olabilir. Kararlılık kazancı, meşruiyet ve süreklilik riskiyle birlikte değerlendirilmelidir.

robots.txt dosyası bağlayıcı mı?

Teknik olarak bir izin mekanizması değil, bir beyandır; erişimi kendiliğinden engellemez. Buna karşılık site sahibinin otomatik erişim hakkındaki tercihini açıkça gösterdiği yerdir ve kullanım şartlarıyla birlikte okunması gerekir. Beyanı görmezden gelmek, teknik bir ihlal olmasa da sonrasında savunulması zor bir tercihtir.

Kazımayı hızlandırmak için eşzamanlı oturum sayısını artırabilir miyim?

Ürünlerimizde bu ayar bilinçli olarak dar tutulur. Eşzamanlılığı artırmak toplam süreyi kısaltmaktan çok hız sınırına takılma olasılığını artırır; takıldığınızda ise kaybettiğiniz süre kazandığınızdan fazla olur. Büyük listeleri hızlandırmanın sağlıklı yolu paralel gitmek değil, işi filtreyle daha küçük parçalara bölmektir.