Use Cases

CAPTCHA İşleme ile Pazar Araştırması Veri Toplama

Rakip fiyatlarını, ürün yorumlarını ve iş ilanlarını düzenli olarak toplayan bir pazar araştırması hattında darboğaz neredeyse her zaman aynıdır: veri kaynağının önündeki CAPTCHA duvarı. G2, Trustpilot, LinkedIn veya Crunchbase gibi kaynaklar reCAPTCHA, Cloudflare Turnstile ve resim CAPTCHA'sıyla korunur; bu doğrulamaları elle çözmek ölçeklenmez. CaptchaAI çözüm adımını API'ye devreder, böylece kod tarafında yalnızca veriyi ayrıştırmaya odaklanır ve toplama işini kesintisiz tutarsınız.

Bu rehber, CAPTCHA çözümünü hattın içine gömen çalışan bir Python toplayıcı, hangi kaynağın hangi doğrulamayı çıkardığını gösteren bir eşleme, ölçeklendirme ve maliyet notları ve KVKK açısından dikkat edilmesi gerekenleri bir arada verir.

Pazar araştırmasında en yaygın kullanım senaryoları

Bir pazar araştırması ekibinin CaptchaAI'yi devreye aldığı dört tipik iş vardır. Hepsi aynı toplama hattını paylaşır; yalnızca hedef kaynaklar ve ayrıştırma mantığı değişir.

Rakip fiyat ve stok takibi

E-ticaret platformlarındaki rakip fiyatlarını izleyin. Fiyat değişikliklerini, kampanyaları ve stok seviyelerini periyodik olarak kaydedip zaman serisi hâline getirin. Türkiye'nin e-ticaret yoğun pazarında bu, en çok istenen kullanım senaryosudur.

Marka ve ürün duyarlılığı analizi

İnceleme platformlarından yorumları ve puanları toplayın. Duygu (sentiment) verisini birden çok kaynaktan bir araya getirerek markanızın ve rakiplerinizin algısını ölçün.

İşe alım ve maaş trendleri

İş ilanlarını tarayarak sektörünüzdeki işe alım eğilimlerini, maaş aralıklarını ve talep edilen becerileri çıkarın. Freelance otomasyon işi yapan geliştiriciler için bu, sık gelen bir müşteri talebidir.

Patent ve Ar-Ge takibi

Kamuya açık veritabanlarından patent başvurularını toplayarak yenilik trendlerini ve rakiplerin Ar-Ge yönünü izleyin.

Hangi kaynak hangi CAPTCHA'yı çıkarır

Toplayıcınızı yazmadan önce hedef kaynakların hangi doğrulama türünü kullandığını bilmek işinizi kolaylaştırır. Aşağıdaki eşleme yaygın kaynak tiplerini kapsar:

Kaynak Türü Örnekler CAPTCHA Türü
İnceleme siteleri G2, Trustpilot, Yelp reCAPTCHA v2/v3
İş ilanı siteleri LinkedIn, Indeed Cloudflare doğrulama akışı
İşletme rehberleri YellowPages, Crunchbase Turnstile, reCAPTCHA
Sosyal medya Twitter/X, Reddit Çeşitli
Patent veritabanları USPTO, Google Patents reCAPTCHA v2
Kamu verileri SEC kayıtları, nüfus verileri Resim CAPTCHA'sı

CaptchaAI bu tabloda geçen reCAPTCHA v2/v3, Cloudflare Turnstile, Cloudflare doğrulama akışı ve resim/OCR türlerini çözer. hCaptcha ve FunCaptcha (Arkose Labs) desteklenmediği için hattınızı bu iki tür yerine desteklenen kaynaklar üzerinden kurgulayın.

Toplama hattını kurma

Aşağıdaki sınıf, sayfayı çeker, reCAPTCHA veya Turnstile tespit ederse sitekey'i çıkarır, çözümü CaptchaAI'ye gönderir ve dönen token'ı formla birlikte yeniden POST eder. Çözme mantığı tek bir yardımcı fonksiyonda toplandığı için toplayıcı kodu temiz kalır.

import requests
import time
import re
import csv
import os

API_KEY = os.environ["CAPTCHAAI_API_KEY"]


def solve_captcha(params):
    params["key"] = API_KEY
    resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
    if not resp.text.startswith("OK|"):
        raise Exception(f"Submit: {resp.text}")

    task_id = resp.text.split("|")[1]
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id,
        })
        if result.text == "CAPCHA_NOT_READY":
            continue
        if result.text.startswith("OK|"):
            return result.text.split("|", 1)[1]
        raise Exception(f"Solve: {result.text}")
    raise TimeoutError()


class MarketResearchCollector:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers["User-Agent"] = (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/120.0.0.0"
        )

    def fetch(self, url):
        """Fetch a page, solving CAPTCHAs as needed."""
        resp = self.session.get(url)

        # Detect reCAPTCHA
        match = re.search(
            r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text
        )
        if match:
            token = solve_captcha({
                "method": "userrecaptcha",
                "googlekey": match.group(1),
                "pageurl": url,
            })
            resp = self.session.post(url, data={
                "g-recaptcha-response": token,
            })

        # Detect Turnstile
        match = re.search(
            r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', resp.text
        )
        if match and "cf-turnstile" in resp.text:
            token = solve_captcha({
                "method": "turnstile",
                "sitekey": match.group(1),
                "pageurl": url,
            })
            resp = self.session.post(url, data={
                "cf-turnstile-response": token,
            })

        return resp.text

    def collect_reviews(self, urls):
        """Collect review data from multiple pages."""
        reviews = []
        for url in urls:
            try:
                html = self.fetch(url)
                page_reviews = self._parse_reviews(html)
                reviews.extend(page_reviews)
                print(f"  Collected {len(page_reviews)} reviews from {url}")
                time.sleep(2)  # Polite delay
            except Exception as e:
                print(f"  Error on {url}: {e}")
        return reviews

    def collect_company_profiles(self, urls):
        """Collect company profile data."""
        profiles = []
        for url in urls:
            try:
                html = self.fetch(url)
                profile = self._parse_profile(html)
                if profile:
                    profiles.append(profile)
                    print(f"  Collected: {profile.get('name', 'Unknown')}")
                time.sleep(2)
            except Exception as e:
                print(f"  Error on {url}: {e}")
        return profiles

    def _parse_reviews(self, html):
        """Extract review data from HTML."""
        reviews = []
        # Generic review extraction patterns
        for match in re.finditer(
            r'class="review-text"[^>]*>(.*?)</div>', html, re.DOTALL
        ):
            reviews.append({
                "text": match.group(1).strip()[:500],
            })
        return reviews

    def _parse_profile(self, html):
        """Extract company profile from HTML."""
        name = re.search(r'<h1[^>]*>(.*?)</h1>', html)
        desc = re.search(
            r'class="description"[^>]*>(.*?)</div>', html, re.DOTALL
        )
        return {
            "name": name.group(1).strip() if name else None,
            "description": desc.group(1).strip()[:300] if desc else None,
        }

    def export_csv(self, data, filename):
        """Export collected data to CSV."""
        if not data:
            return
        keys = data[0].keys()
        with open(filename, "w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=keys)
            writer.writeheader()
            writer.writerows(data)
        print(f"Exported {len(data)} records to {filename}")

Örnek kullanım

Toplayıcıyı çalıştırmak için hedef URL listelerini verip sonuçları CSV'ye aktarmanız yeterli. Aynı sınıf hem yorum hem de şirket profili toplama için kullanılabilir:

collector = MarketResearchCollector()

# Collect competitor reviews
review_urls = [
    "https://example-reviews.com/product/competitor-a",
    "https://example-reviews.com/product/competitor-b",
    "https://example-reviews.com/product/competitor-c",
]
reviews = collector.collect_reviews(review_urls)
collector.export_csv(reviews, "competitor_reviews.csv")

# Collect company profiles
profile_urls = [
    "https://example-directory.com/company/alpha-corp",
    "https://example-directory.com/company/beta-inc",
]
profiles = collector.collect_company_profiles(profile_urls)
collector.export_csv(profiles, "company_profiles.csv")

Ölçeklendirme ve maliyet

Tek sayfalık bir denemeden düzenli, yüksek hacimli bir hatta geçerken hız ve kararlılık dengesini kurmanız gerekir. Aşağıdaki başlangıç değerleri orta ölçekli bir toplama işi için makul bir temeldir:

Faktör Tavsiye
İstekler arası bekleme Sayfalar arasında 2–5 saniye
Eşzamanlı toplayıcı Orta ölçek için 5–10
Proxy yapılandırması Saatte 100+ sayfa için önerilir
Veri tekilleştirme Depolamadan önce hash tabanlı tekilleştirme
Planlama Trend verisi için günlük veya haftalık çalıştırın

CaptchaAI thread bazlı fiyatlandırır: her plan, faturalandırma ayı boyunca thread başına sınırsız çözüm içerir ve çözüm başına ayrı ücret yoktur. Küçük bir izleme işine BASIC ($15/ay, 5 thread) planıyla başlayabilir, eşzamanlılığı artırdıkça daha yüksek thread'li planlara geçebilirsiniz. Fiyatlar USD üzerinden sabittir; TL'nin oynaklığında öngörülebilir aylık maliyet, düzenli bütçe planlaması açısından gerçek bir avantajdır.

Sizi tamamen engelleyen kaynaklarda CaptchaAI'yi proxy yapılandırması ve gerçekçi istek desenleriyle birlikte kullanın; ayrıntılar için engellenmeden kazıma rehberimize bakın.

KVKK ve yasal uyum

Pazar araştırması verisi toplarken teknik tarafın yanında hukuki tarafı da netleştirin. Kamuya açık verilerin toplanmasına genellikle izin verilir; yine de her kaynağın hizmet şartlarını kontrol edin. Türkiye'de topladığınız veri kişisel veri içeriyorsa — örneğin bir yorumun altındaki isim, e-posta veya profil bilgisi — bu, KVKK (Kişisel Verilerin Korunması Kanunu) kapsamına girer. Uygulamada bu şu demektir: kişisel veriyi rıza olmadan işlemeyin, topladığınız veriyi yalnızca yetkili ve meşru bir amaç için kullanın ve mümkün olduğunca kişisel alanları ayrıştırma aşamasında ayıklayın. CaptchaAI'yi yetkili QA ve veri toplama iş akışları içinde konumlandırmak, hem hukuki hem operasyonel riski azaltır.

Sık sorulan sorular

Pazar araştırması için veri kazımak KVKK'ya uygun mu?

Kamuya açık verilerin toplanması genellikle mümkündür, ancak kişisel veri söz konusuysa KVKK devreye girer. Kaynağın hizmet şartlarını kontrol edin, kişisel veriyi rıza olmadan işlemeyin ve toplamayı meşru bir amaçla sınırlayın.

CaptchaAI hangi CAPTCHA türlerini çözer, hangilerini çözmez?

reCAPTCHA v2/v3, Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, resim/OCR ve BLS türlerini çözer. hCaptcha ve FunCaptcha (Arkose Labs) desteklenmez; hattınızı bu türler yerine desteklenen kaynaklar üzerinden kurgulayın.

1.000 sayfalık günlük bir tarama ne kadar tutar?

Tipik bir pazar araştırması taraması sayfaların yaklaşık %30'unda CAPTCHA tetikler. Thread bazlı modelde çözüm başına ücret olmadığı için maliyeti belirleyen, seçtiğiniz planın aylık ücreti ve thread sayısıdır — çözüm hacmi değil.

Kaç thread ile başlamalıyım?

Orta ölçekli, eşzamanlı 5–10 toplayıcı çalıştıran bir iş için BASIC ($15/ay, 5 thread) makul bir başlangıçtır. Kuyruğunuz büyüyüp thread'ler sürekli dolu kalıyorsa daha yüksek thread'li bir plana geçin.

reCAPTCHA v3 gibi dinamik doğrulamaları da çözer mi?

Evet. Toplayıcı sayfada data-sitekey tespit ettiğinde userrecaptcha yöntemiyle görevi gönderir; reCAPTCHA v2 ve v3 aynı yöntemi paylaşır. Dönen g-recaptcha-response token'ını formla birlikte POST etmeniz yeterlidir.

İlgili kılavuzlar

Bu makale için yorumlar devre dışı bırakılmıştır.