İçeriğe geç
ipkontrol.net

Proxy

Web Scraping’de Proxy Kullanımı

İstek sınırı, IP rotasyonu ve etik/yasal çerçeve.

Web kazıma (scraping) işinde proxy genellikle ilk düşünülen çözüm oluyor: site engelliyor, adresi değiştir. Oysa engellerin çoğu proxy gerektirmeyen bir sebepten geliyor: çok hızlı, çok paralel ve siteye kulak vermeden istek atmak. Aynı işi siteyi yormadan yapan bir kazıyıcı çoğu zaman tek adresle bitiriyor.

Adres döndürmenin nasıl çalıştığını ve nerede meşru olduğunu IP rotasyonu nedir yazısında anlattık. Bu yazı kazıyıcının kendi davranışına odaklanıyor: site ne zaman "yavaşla" diyor, bunu nasıl duyarsınız ve proxy ne zaman gerçekten gerekli.

Site ne diyor? Yanıt kodlarını dinlemek

Bir site sizi engellemeden önce genellikle uyarıyor. Uyarıyı duymayan kazıyıcı, uyarıyı engele çeviriyor:

YanıtAnlamıDoğru tepki
429 Too Many RequestsHız sınırını aştınızDurun; Retry-After başlığı varsa o kadar bekleyin
503 Service UnavailableSunucu yük altında ya da bakımdaArtan aralıklarla bekleyip yeniden deneyin
403 ForbiddenBu adres ya da istek biçimi reddedildiHızı düşürmek tek başına çözmez; neyin reddedildiğine bakın
200 ama doğrulama sayfasıSite sizi otomatik trafik olarak işaretlediİşi durdurun; hızı ve kalıbı gözden geçirin
200 ama içerik boş ya da farklıSite otomatik trafiğe başka sayfa gösteriyorİçeriği doğrulayan bir kontrol ekleyin

Son satır en sinsi olanı: durum kodu 200 olduğu için kazıyıcı başarılı sandığı boş sayfaları kaydetmeye devam ediyor. Her yanıtta beklenen bir öğenin (ör. ürün fiyatı alanı) gerçekten var olduğunu kontrol edin. Başlıkların nasıl okunduğunu HTTP başlık kontrol aracımızla tek bir adres için deneyebilirsiniz.

Hız bütçesi: adres başına değil site başına

En yaygın hata, sınırı adres başına düşünmek: "her adresten dakikada 30 istek" gibi. Bu, on adresle dakikada 300 istek demek ve sitenin sunucusu için adresin bir önemi yok; yük aynı yük. Hesabı siteden başlatın:

  1. Kaç sayfaya ihtiyacınız var? Örneğin 20.000 ürün sayfası.
  2. Ne kadar sürede? Günde bir kez güncelleme yetiyorsa 24 saat.
  3. Gereken hız: 20.000 / 86.400 saniye ≈ saniyede 0,23 istek; yani her 4-5 saniyede bir istek.

Bu hız tek bir adresten, tek bir bağlantıyla, çoğu site için fark edilmeyecek bir yük. İşin bir saatte bitmesi gerektiği için saniyede onlarca istek atmak, sorunu yaratan şey. Aciliyet yoksa yavaş gitmek hem ucuz hem de siteye karşı adil.

Eşzamanlılık ve bekleme

  • Aynı siteye paralel bağlantı sayısını düşük tutun. Tek ya da iki bağlantı çoğu iş için yeterli.
  • İstekler arasına sabit değil değişken bekleme koyun. 3 saniye yerine 2-5 saniye arası rastgele bir süre; kusursuz düzenli aralık insan davranışına benzemiyor ve sunucuda eşzamanlı yük dalgaları yaratıyor.
  • Yanıt süresini izleyin. Sitenin yanıtı yavaşlıyorsa sunucu zorlanıyor demektir; beklemeyi kendiliğinden uzatın.
  • Yoğun saatlerden kaçının. Hedef sitenin kitlesinin uyuduğu saatlerde çalıştırmak aynı işi daha az zararla yapıyor.

Üstel geri çekilme

429 ya da 503 aldığınızda hemen yeniden denemek, sitenin sizi engellemesi için en hızlı yol. Doğru kalıp bekleme süresini her başarısızlıkta ikiye katlamak:

DenemeBekleme (yaklaşık)
1. hata5 sn + rastgele sapma
2. hata10 sn + sapma
3. hata20 sn + sapma
4. hata40 sn + sapma
5. hataİşi durdurun, kaydı inceleyin

Rastgele sapma, birden fazla işçinin aynı anda uyanıp aynı anda yeniden saldırmasını önlüyor. Bir üst sınır koyun: sonsuza kadar yeniden deneyen kazıyıcı, sorun sizde olduğunda bunu hiç fark etmiyor.

İstek sayısını azaltmak

En iyi istek atılmayan istek. Proxy düşünmeden önce şunlara bakın:

  • Resmî API ya da veri akışı. Çoğu büyük sitenin ürün, fiyat ya da ilan verisi için bir API'si var. Sayfa kazımaktan daha kararlı ve kullanım şartlarına uygun.
  • Site haritası. sitemap.xml hangi sayfanın ne zaman değiştiğini lastmod ile söylüyorsa yalnızca değişenleri çekin.
  • Koşullu istek. If-Modified-Since ya da ETag ile sorulan sayfa değişmemişse sunucu içeriksiz 304 döndürüyor; ikiniz de kazanıyorsunuz.
  • Gereksiz dosyalar. Görsel, yazı tipi ve betik indirmeyin; yalnızca HTML ya da veri.
  • robots.txt. Hangi yolların kapalı olduğunu ve varsa Crawl-delay değerini söylüyor. Uymak hem etik hem pratik: kapalı yollar genellikle en çok izlenen yollar.

Kendinizi tanıtın

User-Agent başlığına kim olduğunuzu ve bir iletişim adresi yazmak, site yöneticisine engellemek yerine size yazma seçeneği veriyor. Tarayıcı taklidi yapan ve adresini sürekli değiştiren bir kazıyıcı ise yönetici için saldırgandan ayırt edilemiyor; ona yapılacak tek şey engellemek.

Proxy ne zaman gerçekten gerekli?

Yukarıdakilerin hepsi yapıldığında proxy'ye kalan meşru iş azdır: içeriğin konuma göre değiştiği durumlar (farklı ülkelerdeki fiyat ya da arama sonucu) ve hedef sitenin sunucu adres bloklarını toptan reddettiği durumlar. Birincisi için her ülkeden birkaç adres yetiyor; bunun için hangi adres türünün gerektiğini residential proxy nedir yazısında anlattık. Hız sınırını aşmak için adres çoğaltmak ise sitenin koyduğu sınırı bilerek delmek demek; kullanım şartları ve hukuki çerçeve için IP değiştirmek yasal mı yazısına bakın.

Sıkça sorulan sorular

Web scraping için proxy şart mı?

Çoğu zaman değil. Engellerin büyük kısmı çok hızlı ve paralel istekten gelir. İsteği yavaşlatan, yanıt kodlarını dinleyen bir kazıyıcı çoğu işi tek adresle bitirir.

429 hatası ne demek, ne yapmalıyım?

Hız sınırını aştınız demektir. Durun, Retry-After başlığı varsa o kadar bekleyin, yoksa bekleme süresini her denemede ikiye katlayarak yeniden deneyin.

Scraping yaparken istekler arasında ne kadar beklemeliyim?

Gereken hızı sayfa sayısı ve süreden hesaplayın. Günlük güncelleme için çoğu zaman her birkaç saniyede bir istek yeter; sabit yerine rastgele bir aralık kullanın.

robots.txt’ye uymak zorunlu mu?

Teknik olarak bir istektir, ama uymamak kullanım şartlarına aykırı olabilir ve kapalı yollar genellikle en çok izlenen yollardır. Crawl-delay değeri de oradan okunur.

Durum kodu 200 ama veri boş geliyor, neden?

Site otomatik trafiğe farklı ya da boş bir sayfa gösteriyor olabilir. Her yanıtta beklenen bir öğenin gerçekten bulunduğunu kontrol eden bir doğrulama ekleyin.