E-ticaret siteleri, otomatik fiyat kazımını önlemek için ürün sayfalarını CAPTCHA'larla korur. CaptchaAI, bu zorlukların otomatik olarak üstesinden gelebilecek güvenilir fiyat izleme sistemleri oluşturmanıza olanak tanır.
Sorun
Fiyat izleme botları büyük platformlarda CAPTCHA'larla karşı karşıyadır:
| platformu | CAPTCHA Türü | Tetikleyici |
|---|---|---|
| Amazon | Resim CAPTCHA, reCAPTCHA | Yüksek talep hacmi |
| Walmart | Cloudflare Turnstile | Bot tespiti |
| eBay | reCAPTCHA v2 | Şüpheli desenler |
| En İyi Satın Alma | Cloudflare doğrulama akışı | Tüm otomatik trafik |
| Shopify mağazaları | reCAPTCHA v3 | Mağaza yapılandırmasına göre değişir |
CAPTCHA yönetimi olmadan izleme hattınız sessizce başarısız olur ve verilerinizde fiyatlandırma boşlukları kalır.
Mimarlık
Scheduler (every 30 min)
→ URL Queue
→ Scraper Workers (5-10 concurrent)
→ Fetch page
→ CAPTCHA detected?
→ Yes → CaptchaAI → Solve → Retry page
→ No → Parse prices
→ Store in database
→ Alert on price changes
Uygulama
Fiyat Monitörü (Python)
import requests
import time
import re
import json
import os
from datetime import datetime
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
BASE_URL = "https://ocr.captchaai.com"
def solve_captcha(method, params):
params["key"] = API_KEY
params["method"] = method
resp = requests.get(f"{BASE_URL}/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{BASE_URL}/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 failed: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
def fetch_with_captcha(url, session):
"""Fetch a page, solving CAPTCHAs if encountered."""
resp = session.get(url)
# Check for reCAPTCHA
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text)
if match:
site_key = match.group(1)
token = solve_captcha("userrecaptcha", {
"googlekey": site_key,
"pageurl": url,
})
resp = session.post(url, data={"g-recaptcha-response": token})
# Check for Turnstile
match = re.search(
r'class="cf-turnstile"[^>]*data-sitekey=["\']([^"\']+)', resp.text
)
if match:
site_key = match.group(1)
token = solve_captcha("turnstile", {
"sitekey": site_key,
"pageurl": url,
})
resp = session.post(url, data={"cf-turnstile-response": token})
return resp
def extract_price(html, selectors):
"""Extract price from HTML using regex patterns."""
for pattern in selectors:
match = re.search(pattern, html)
if match:
price_str = match.group(1).replace(",", "")
return float(price_str)
return None
def monitor_prices(products):
"""Monitor prices for a list of products."""
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
results = []
for product in products:
try:
resp = fetch_with_captcha(product["url"], session)
price = extract_price(resp.text, product["selectors"])
results.append({
"name": product["name"],
"url": product["url"],
"price": price,
"timestamp": datetime.utcnow().isoformat(),
"status": "ok",
})
print(f" {product['name']}: ${price}")
except Exception as e:
results.append({
"name": product["name"],
"url": product["url"],
"price": None,
"timestamp": datetime.utcnow().isoformat(),
"status": f"error: {e}",
})
print(f" {product['name']}: ERROR - {e}")
return results
# Define products to monitor
products = [
{
"name": "Wireless Headphones",
"url": "https://example.com/product/headphones",
"selectors": [
r'class="price"[^>]*>\$?([\d,]+\.?\d*)',
r'itemprop="price" content="([\d.]+)"',
],
},
{
"name": "Bluetooth Speaker",
"url": "https://example.com/product/speaker",
"selectors": [
r'class="price"[^>]*>\$?([\d,]+\.?\d*)',
],
},
]
print("Starting price check...")
results = monitor_prices(products)
# Save results
with open("prices.json", "w") as f:
json.dump(results, f, indent=2)
Node.js Uygulaması
const axios = require("axios");
const cheerio = require("cheerio");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveCaptcha(method, params) {
params.key = API_KEY;
params.method = method;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
const taskId = String(submit.data).split("|")[1];
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
const text = String(poll.data);
if (text === "CAPCHA_NOT_READY") continue;
if (text.startsWith("OK|")) return text.split("|").slice(1).join("|");
throw new Error(text);
}
throw new Error("Timeout");
}
async function monitorPrice(url) {
const resp = await axios.get(url);
const $ = cheerio.load(resp.data);
// Check for reCAPTCHA
const siteKey = $(".g-recaptcha").attr("data-sitekey");
if (siteKey) {
const token = await solveCaptcha("userrecaptcha", {
googlekey: siteKey,
pageurl: url,
});
// Re-fetch with token
const formResp = await axios.post(url, { "g-recaptcha-response": token });
return cheerio.load(formResp.data);
}
const price = $('[itemprop="price"]').attr("content") || $(".price").text();
return parseFloat(price.replace(/[^0-9.]/g, ""));
}
Planlama
Cron ile her 30 dakikada bir kontrol yapın:
# crontab -e
*/30 * * * * cd /opt/monitor && python price_monitor.py >> /var/log/prices.log 2>&1
Veya Python'un schedule kütüphanesini kullanın:
import schedule
schedule.every(30).minutes.do(lambda: monitor_prices(products))
while True:
schedule.run_pending()
time.sleep(60)
Maliyet Tahmini
| Hacim | CAPTCHA'lar/Day | Tahmini Günlük Maliyet |
|---|---|---|
| Her 30 dakikada bir 50 ürün | ~2.400 | ~2-5$ |
| Her 15 dakikada bir 200 ürün | ~19.200 | ~15-30$ |
| 1000 ürün, saatlik | ~24.000 | ~20-40$ |
Tüm sayfa yüklemeleri CAPTCHA'ları tetiklemez. Gerçek maliyetler %50-70 daha düşük olabilir.
SSS
Fiyat değişikliklerini nasıl tespit ederim?
Mevcut fiyatları kayıtlı değerlerle karşılaştırın. %5'in üzerindeki değişiklikler konusunda uyarı verilmesi, küçük dalgalanmalardan kaynaklanan gürültünün filtrelenmesine yardımcı olur.
CAPTCHA çözerken bile engellenir miyim?
Engellemeyi en aza indirmek için proxy'leri ve Kullanıcı Aracılarını dönüşümlü kullanın. Seri alım yerine zaman içinde alan talepleri.
Birden fazla para birimindeki fiyatları izleyebilir miyim?
Evet. Fiyatın yanındaki para birimi sembolünü ayrıştırın. CaptchaAI, hedef sitenin yerel ayarından bağımsız olarak küresel olarak çalışır.