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.