Scraping için rotating proxy: kurulum ve tuzaklar
Rotating proxy, trafiğinizin çıktığı IP adresini her istekte ya da belirli bir aralıktan sonra değiştirir. Web scraping'in en yaygın araçlarından biridir ve en çok yanlış kullanılanlardan biridir. Çok az döndürürseniz tek bir adres hız sınırına takılır. Çok fazla döndürürseniz trafiğiniz hiçbir ziyaretçiye benzemez. Bu rehber iki döndürme modelini açıklar, ölü proxy'ler için yeniden denemeli çalışan bir Python kurulumu gösterir ve bir proxy alanının captcha çözmeye nasıl uyduğunu anlatır.
Döndürme ve sabit oturumlar
Bir rotating proxy servisi adresleri iki şekilde verir:
- İstek başına döndürme. Her istek yeni bir çıkış adresi alır. Hiçbir sayfanın öncekine ihtiyaç duymadığı, çok sayıda birbiriyle ilgisiz sayfanın taranması için uygundur.
- Sabit oturumlar. Bir adres belirli bir süre, genellikle birkaç dakika ya da siz bırakana kadar tutulur. Bir giriş, bir alışveriş sepeti ya da çerezlerin önemli olduğu sayfalı bir liste gibi durum gerektiren her şey için uygundur.
Gerçek bir ziyaretçi bir ziyaret boyunca tek bir adres kullanır. Sabit oturumlar bu davranışı taklit eder, bu yüzden bir site çerez ya da oturum kullanıyorsa genellikle daha iyi varsayılandırlar. Durumsuz tarama için istek başına döndürmeyi kullanın.
Python'da temel bir rotating havuz
Aşağıdaki örnek bir proxy URL havuzu tutar, bunların arasında döner ve bir tanesi başarısız olduğunda sonrakine geçer. Kimlik bilgilerini kaynak kodda değil, ortam değişkenlerinde tutun:
import itertools
import os
import requests
# Proxy URL'leri ortam değişkeninden gelir, örneğin:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # proxy kimlik doğrulaması başarısız
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # ölü ya da yavaş proxy: sıradakini dene
raise RuntimeError(f"{url} için tüm denemeler başarısız: {last_error}")
Burada iki ayrıntı önemlidir. Birincisi, ölü bir proxy aynı adreste değil, farklı bir adreste yeniden denenmelidir. İkincisi, kimlik doğrulama hatasıyla başarısız olan bir istek durdurulmalı ve raporlanmalıdır; tüm havuzu tüketmemelidir.
Proxy sağlığını takip edin
Basit bir round robin, başarısızlık vermeye başlamış bir proxy'ye trafik göndermeye devam eder. Her adres için basit bir puan tutun: yakın zamandaki başarısızlıkları sayın ve bir eşiği aştığında adresi bir bekleme süresi için havuzdan çıkarın. Sonra geri getirin ve yeniden izleyin. Scraper'ınız isteklerini havuzun sağlıklı kısmına harcar.
Her sonuçla birlikte kullanılan proxy'yi loglayın. Bir site engellemeye başladığında, sorumlunun tek bir adres, tek bir bölge mi yoksa tüm havuz mu olduğunu bilmek isteyeceksiniz.
Havuzu hızlandırın
Döndürme yükü adreslere yayar, ama her adresin yine bir hızı vardır. Adres başına bir gecikme ve tüm havuz genelinde saniye başına bir üst sınır belirleyin. Döndürme, daha fazla trafik göndermek için bir izin değildir. Bir adresten gelen trafiği makul sınırlar içinde tutmanın bir yoludur.
Yaygın hatalar
Döndürme sorunlarının çoğu birkaç alışkanlıktan gelir. Bir giriş ya da ödeme akışının ortasında adresi döndürmek oturumu bozar ve siteyi şüpheli hale getirir. 429 yanıtı, sitenin bir hız sınırıdır, bozuk bir proxy değildir; bu yüzden hemen yeni bir adrese geçip yeniden denemek sorunu yalnızca yayar. Aynı çerezleri tutarken her istekte adresi değiştirmek de tutarsızdır, çünkü çerezler farklı bir ziyaretçiye verilmiştir. Son olarak, hiç kontrol edilmeyen bir havuz sessizce ölü adreslerle dolar ve hata oranınız belirgin bir neden olmadan yükselir. Havuzu bir zamanlamayla kontrol edin ve başarısız olanları çıkarın.
Proxy'ler ve captcha çözme
Bazı captcha görevleri, scraper'ınızın kullandığı proxy'yi kullanabilir. Bunu isteğe bağlı proxy alanında, http://user:pass@host:port biçiminde geçersiniz; çözüm sayfa isteğinizle aynı ağ yolundan yapılır. Proxysiz görevler bu alanı tamamen atlar. Hangisini seçeceğiniz, sitenin captcha'yı ağ adresine bağlayıp bağlamadığına bağlıdır; bu seçim proxy ile proxysiz captcha sayfasında açıklanır.
İki pratik nokta:
- Site adresi kontrol ediyorsa, sayfa isteği ile captcha çözümü için aynı proxy'yi kullanın. Adresleri karıştırmak token'ı başarısız kılabilir.
- Token'lar hızla sona erer. Formu göndermeden hemen önce isteyin, çok önce değil. Bkz. captcha token süresi dolması.
Bugün Scarnox'taki canlı captcha tipi PopularCaptcha'dır. PopularCaptcha Python rehberi isteği ve döndürülen token'ın nasıl gönderileceğini gösterir.
Proxy'lerinizi seçmek
Döndürdüğünüz adresin tipi, döndürmenin kendisi kadar önemlidir. Datacenter adresleri hızlı ve istek başına ucuzdur, ama genellikle düşük puan alır. Residential adresler daha iyi puan alır ve daha yavaştır. Residential ve datacenter proxy karşılaştırması bunları derinlemesine karşılaştırır ve oradaki tavsiye, burada kurduğunuz havuz için de geçerlidir.
Sorumlu scraping
- Scrape ettiğiniz sitelerin
robots.txtdosyasını ve kullanım koşullarını okuyun. - Proxy'leri meşru yükü dağıtmak için kullanın, sahibinin koyduğu bir kısıtlamayı aşmak için değil.
- Yalnızca adresleri rızayla temin edilen proxy servislerini kullanın. İnsanların onayı olmadan onların cihazları üzerinden trafik yönlendirmek kabul edilemez.
- Kimlik bilgilerini kod ve loglardan uzak tutun.
Sonraki adımlar
- Residential ve datacenter proxy karşılaştırması
- Engellenmeden web scraping yapmak
- Proxy ile proxysiz captcha
- Production'da dayanan retry ve hata yönetimi
Ücretsiz deneme kredisiyle başlayın, kart gerekmez: hesap oluşturun ve PopularCaptcha akışını kendi proxy'nizle test edin. Güncel fiyatlar için fiyatlandırma sayfasına bakın.