Web scraping'de captcha'lar: neden çıkar ve ne yapmalı
Bir site bir isteğin otomatik göründüğüne karar verdiğinde, scraping sırasında captcha çıkar. Tipik tetikleyiciler kısa sürede çok fazla istek, kötü itibarlı bir IP adresi, eksik tarayıcı sinyalleri ya da sitenin diğerlerinden daha sıkı koruduğu bir sayfaya gelen istektir. Pratik yanıt üç adımdan oluşur ve bu sırayla yapılır: tetikleyicileri azaltın, captcha'yı kodda tespit edin ve kaçınamadığınız captcha'yı çözün. Bu rehber her adımı anlatır ve geri kalanı için ayrıntılı rehberlere yönlendirir.
Siteler scraper'lara neden captcha gösterir?
Bir site, bir sayfa istendiği anda bir insanla bir betiği ayırt etmenin çok az yoluna sahiptir, bu yüzden örüntülere bakar. Bir scraper çoğu zaman şunları yaptığı için fark edilir:
- Hiçbir insanın tıklayamayacağı kadar hızlı istek gönderir;
- Aynı yolu hiç duraksamadan tekrarlar;
- Ev ağı yerine bir veri merkezi adresinden gelir;
- Yaygın bir tarayıcıyla eşleşmeyen başlıklar gönderir; ya da
- İstekler arasında çerez ya da oturum durumu tutmaz.
Bunlardan herhangi biri yeterli olabilir. Captcha, sitenin daha fazla sayfa sunmadan önce insan benzeri bir adım istemesinin yoludur. Örüntüyü azaltmak genellikle captcha'ları da azaltır; bu da onları çözmekten daha ucuzdur.
Kodda captcha'yı tespit edin
Herhangi bir şey çözmeden önce, aldığınız sayfanın gerçekten captcha sayfası olup olmadığını kontrol edin. Basit bir test widget işaretlemesini arar ve sitekey'i okur:
import re
import requests
SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')
def fetch(url: str) -> dict:
resp = requests.get(
url,
timeout=30,
headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
)
html = resp.text
if "h-captcha" in html or "g-recaptcha" in html:
match = SITEKEY_RE.search(html)
return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
return {"captcha": False, "sitekey": None, "html": html}
page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
print("captcha bulundu, sitekey:", page["sitekey"])
h-captcha ve g-recaptcha dizeleri yalnızca bir sayfanın kullandığı işaretlemedir; bu yüzden bu bir garanti değil, bir sinyaldir. Sitekey yoksa, sitekey'i nasıl bulacağınıza bakın.
Kaçınamadığınızda çözün
Sayfada bir PopularCaptcha widget'ı varsa ve sitekey'ini biliyorsanız, Scarnox API'sinden tek bir POST isteğiyle bir token isteyebilir ve bunu h-captcha-response alanında gönderebilirsiniz. Hata yönetimi dahil tam fonksiyon tek istekle Python'dan captcha çözme sayfasındadır. Token'ı hemen kullanın, çünkü yaklaşık iki dakika sonra sona erer. Zamanlama ayrıntıları captcha token süresi sayfasındadır.
Scarnox'un bugünkü canlı desteği PopularCaptcha'dır; proxysiz ve kendi proxy'nizle. reCAPTCHA v2 ve v3, Cloudflare Turnstile, GeeTest, AWS WAF ve Arkose desteği yakında geliyor. Hedefiniz bunlardan birini kullanıyorsa, captcha rehberleri genel seçenekleri açıklar, ama canlı olmayan bir çözüm üzerine üretim akışı kurmayın.
Her engellenmiş sayfa için bir karar akışı
Scraper'ınız bir captcha ile karşılaştığında, basit bir karar sırası işi dürüst tutar ve istek hacmini düşük tutar:
- Yerine kullanabileceğiniz bir veri kaynağı var mı? Bir API, akış ya da dışa aktarma ihtiyacınız olan alanları kapsıyorsa, ona geçin ve o sayfayı istemeyi bırakın.
- **
robots.txtyolu izin veriyor mu?** Vermiyorsa atlayın. Sizden uzak durulması istenen bir sayfada captcha çözmeyin. - Çok fazla, çok hızlı mı gönderdiniz? Daha uzun bir süre duraklayın, hızınızı düşürün ve daha sonra tekrar kontrol edin. Birçok captcha daha yavaş bir hızla dağılır.
- Captcha canlı bir tip mi? PopularCaptcha ise, bu rehberdeki çözüm geçerlidir. Yakında gelecek bir tip ise, işi duraklatılmış tutun ve çıkışı izleyin.
- Sayfa, otomatize etmenize izin verilen bir sayfa mı? Cevap belirsizse, devam etmeden önce site sahibine sorun.
Dördüncü adım en sık atlanandır. Bir çözücü yalnızca captcha tipi destekleniyorsa işe yarar ve desteklenmeyen bir tipi yeniden deneyen bir iş, zaman ve istek harcar.
Captcha'yı döngüde değil, bir işte ele alın
Çözümü, token'a ihtiyaç duyan kod yolunun içine koyun; böylece iş her captcha'yı loglayabilir, bir sayfa sürekli başarısız olduğunda durabilir ve devam edebilir. Captcha sayfasını sürekli isteyen sınırsız bir döngü, bir sitenin güvenlik duvarının adresinizi kalıcı olarak engellemesinin en hızlı yoludur.
Başarısız olanları izleyin
Captcha döndüren sayfaların sayısını URL'ye ve günün saatine göre gruplayarak tutun. Captcha yalnızca bir site bölümünde ya da belirli sayıda istekten sonra çıkıyorsa, tetikleyicinin nerede olduğunu gösterir. Bu bilgi, daha hızlı bir çözücüden çok daha faydalıdır, çünkü neyi değiştireceğinizi gösterir.
Yapılmaması gerekenler
- Bir sitenin limitlerinden kaçmak için birçok IP adresi arasında dönmeyin. Bu bir kaçınma biçimidir ve yavaşlama isteğini bir kavgaya dönüştürür.
- Kullanmaya yetkili olmadığınız kimlik bilgileriyle giriş arkasındaki sayfaları taramayın.
- Hesap oluşturmak, spam yapmak ya da sınırlı ürünleri satın almak için captcha çözmeyin.
Sorumlu scraping
- Başlamadan önce sitenin
robots.txtdosyasını ve kullanım koşullarını okuyun. Yasaklanan yollara ve belirtilen gecikmelere uyun. - User-Agent'ta botunuzu dürüstçe tanıtın ve size ulaşılabilecek bir yol bırakın.
- İstek hızını düşük tutun. Captcha çoğu zaman sitenin sizden yavaşlamanızı istediğinin işaretidir.
- Site sizden durmanızı isterse durun ve size söylenen bir engeli aşmaya çalışmayın.
- Kişisel veriyi size uygulanan gizlilik kurallarına göre işleyin ve yalnızca ihtiyacınız olanı toplayın.