Scarnox · Blog

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:

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:

  1. 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.
  2. **robots.txt yolu izin veriyor mu?** Vermiyorsa atlayın. Sizden uzak durulması istenen bir sayfada captcha çözmeyin.
  3. Ç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.
  4. 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.
  5. 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

Sorumlu scraping

Sonraki adımlar