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ıt | Anlamı | Doğru tepki |
|---|---|---|
| 429 Too Many Requests | Hız sınırını aştınız | Durun; Retry-After başlığı varsa o kadar bekleyin |
| 503 Service Unavailable | Sunucu yük altında ya da bakımda | Artan aralıklarla bekleyip yeniden deneyin |
| 403 Forbidden | Bu adres ya da istek biçimi reddedildi | Hı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:
- Kaç sayfaya ihtiyacınız var? Örneğin 20.000 ürün sayfası.
- Ne kadar sürede? Günde bir kez güncelleme yetiyorsa 24 saat.
- 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:
| Deneme | Bekleme (yaklaşık) |
|---|---|
| 1. hata | 5 sn + rastgele sapma |
| 2. hata | 10 sn + sapma |
| 3. hata | 20 sn + sapma |
| 4. hata | 40 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.xmlhangi sayfanın ne zaman değiştiğinilastmodile söylüyorsa yalnızca değişenleri çekin. - Koşullu istek.
If-Modified-Sinceya daETagile 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-delaydeğ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.