Kullanım Senaryoları

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

Pazar araştırması, çoğu CAPTCHA korumalı olan rakip web sitelerinden, inceleme platformlarından, iş kurullarından ve endüstri dizinlerinden veri gerektirir. CaptchaAI, veri hattınızın kesintisiz kalması için çözümü otomatikleştirir.

Ortak Veri Kaynakları ve CAPTCHA'ları

Kaynak Türü Örnekler CAPTCHA Türü
Siteleri inceleyin G2, Trustpilot, Yelp reCAPTCHA v2/v3
İş panoları LinkedIn, Gerçekten Cloudflare doğrulama akışı
İş rehberleri YellowPages, Crunchbase Turnstile, reCAPTCHA
Sosyal medya Twitter/X, Reddit Çeşitli
Patent veritabanları USPTO, Google Patentleri reCAPTCHA v2
Hükümet verileri SEC kayıtları, nüfus sayımı Resim CAPTCHA'sı

Veri Toplama Hattı

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}")

Kullanım

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")

Kullanım Durumları

Rekabetçi Fiyatlandırma İstihbaratı

E-ticaret platformlarındaki rakip fiyatlarını izleyin. Fiyat değişikliklerini, promosyonları ve stok seviyelerini takip edin.

Marka Duyarlılığı Analizi

İnceleme platformlarından incelemeleri ve derecelendirmeleri toplayın. Duygu verilerini birden fazla kaynaktan toplayın.

İş Piyasası Analizi

Sektörünüzdeki işe alım eğilimlerini, maaş aralıklarını ve beceri talebini anlamak için iş ilanlarını inceleyin.

Patent Ortamı Araştırması

Yenilik trendlerini ve rakiplerin Ar-Ge faaliyetlerini takip etmek için kamuya açık veritabanlarından patent başvurularını toplayın.

Ölçeklendirme İpuçları

Faktör Tavsiye
Boşluk isteme Sayfalar arasında 2-5 saniye
Eşzamanlı toplayıcılar Orta ölçek için 5-10
Vekil rotasyonu 100'den fazla sayfa için gereklidir/hour
Veri tekilleştirme Depolamadan önce karma tabanlı tekilleştirme
Planlama Trend verileri için günlük veya haftalık olarak çalıştırın

SSS

Piyasa verilerini kazımak yasal mı?

Kamuya açık verilerin kazınmasına genellikle izin verilir. Her zaman sitenin hizmet şartlarını kontrol edin ve yerel düzenlemelere uyun. Kişisel verileri rızanız olmadan kazımayın.

CaptchaAI ile bunun maliyeti ne kadar?

Tipik pazar araştırması kazımaları, sayfaların ~%30'unda CAPTCHA'ları tetikler. 1.000 sayfa/day için toplamda 0,5-3 USD karşılığında ~300 çözüm bekleyin.

Kazıyıcıları tamamen engelleyen siteleri nasıl halledebilirim?

CaptchaAI'yi proxy rotasyonu ve gerçekçi istek modelleriyle birleştirin. Bizimkilere bakınEngellenmeden Kazımarehber.

İlgili Kılavuzlar

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