Hisse senedi tarayıcıları, SEC EDGAR ve ticaret platformları gibi finansal platformlar, otomatik çıkarmayı önlemek için verileri CAPTCHA'larla korur. CaptchaAI bu zorlukları programlı bir şekilde ele alarak pazar verilerini geniş ölçekte toplayabilmenizi sağlar.
CAPTCHA'ların Finansta Nerede Göründüğü
| Kaynak | CAPTCHA Türü | Tetikleyici | Veri Değeri |
|---|---|---|---|
| SEC EDGAR | reCAPTCHA v2 | Yüksek hacimli istekler | Şirket başvuruları |
| Yahoo Finans | reCAPTCHA v2 | Kazıma tespiti | Hisse senedi fiyatları, tarih |
| Bloomberg | Cloudflare Turnstile | Tüm otomatik erişim | Piyasa verileri |
| Finviz | reCAPTCHA v2 | Stok ayırıcı erişimi | Tarama sonuçları |
| Ticaret Görünümü | Cloudflare doğrulama akışı | Hız sınırlaması | Grafikler, göstergeler |
| Sabah Yıldızı | reCAPTCHA v3 | Veri dışa aktarma sayfaları | Fon analitiği |
Stok Eleyici Kazıma
import requests
import time
from bs4 import BeautifulSoup
import re
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_captcha(method, sitekey, pageurl, **kwargs):
data = {
"key": CAPTCHAAI_KEY,
"method": method,
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
}
data.update(kwargs)
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data=data)
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
r = result.json()
if r["request"] != "CAPCHA_NOT_READY":
return r["request"]
raise TimeoutError("Solve timeout")
class FinancialScraper:
def __init__(self, proxy=None):
self.session = requests.Session()
if proxy:
self.session.proxies = {"http": proxy, "https": proxy}
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
})
def scrape_screener(self, url):
"""Scrape stock screener, handling CAPTCHA if triggered."""
resp = self.session.get(url, timeout=30)
# Check for CAPTCHA
sitekey_match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if sitekey_match:
sitekey = sitekey_match.group(1)
token = solve_captcha("userrecaptcha", sitekey, url)
# Resubmit with token
resp = self.session.post(url, data={
"g-recaptcha-response": token,
})
return self._parse_stocks(resp.text)
def _parse_stocks(self, html):
soup = BeautifulSoup(html, "html.parser")
stocks = []
for row in soup.select("table.screener-table tr")[1:]:
cols = row.select("td")
if len(cols) >= 8:
stocks.append({
"ticker": cols[1].get_text(strip=True),
"company": cols[2].get_text(strip=True),
"sector": cols[3].get_text(strip=True),
"price": cols[6].get_text(strip=True),
"change": cols[7].get_text(strip=True),
})
return stocks
# Usage
scraper = FinancialScraper(
proxy="http://user:pass@residential.proxy.com:5000"
)
stocks = scraper.scrape_screener("https://screener.example.com/screener.ashx?v=111")
for stock in stocks[:5]:
print(f"{stock['ticker']}: {stock['price']} ({stock['change']})")
SEC EDGAR Dosya Çıkarma
SEC EDGAR, yüksek hacimli erişim için hız sınırlaması ve CAPTCHA'lar uygular:
import json
class SECFilingScraper:
BASE_URL = "https://efts.sec.gov/LATEST"
def __init__(self, user_agent_email, proxy=None):
self.session = requests.Session()
if proxy:
self.session.proxies = {"http": proxy, "https": proxy}
# SEC requires identifying User-Agent
self.session.headers.update({
"User-Agent": f"CompanyName admin@{user_agent_email}",
"Accept": "application/json",
})
def search_filings(self, company, filing_type="10-K"):
"""Search EDGAR for specific filing types."""
url = f"{self.BASE_URL}/search-index"
params = {
"q": company,
"dateRange": "custom",
"forms": filing_type,
}
resp = self.session.get(url, params=params, timeout=30)
# Handle CAPTCHA if triggered
if "captcha" in resp.text.lower() or resp.status_code == 403:
sitekey = self._extract_sitekey(resp.text)
if sitekey:
token = solve_captcha("userrecaptcha", sitekey, url)
resp = self.session.post(url, data={
**params,
"g-recaptcha-response": token,
})
return resp.json() if resp.status_code == 200 else {}
def download_filing(self, filing_url):
"""Download individual filing document."""
resp = self.session.get(filing_url, timeout=60)
if resp.status_code == 200:
return resp.text
return None
def _extract_sitekey(self, html):
match = re.search(r'data-sitekey="([^"]+)"', html)
return match.group(1) if match else None
# Usage
sec = SECFilingScraper(
user_agent_email="example.com",
proxy="http://user:pass@proxy.example.com:5000",
)
filings = sec.search_filings("Apple Inc", "10-K")
Turnstile Korumalı Piyasa Verileri
def scrape_turnstile_market_data(url, sitekey):
"""Handle Cloudflare Turnstile on financial data sites."""
token = solve_captcha("turnstile", sitekey, url)
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})
resp = session.post(url, data={
"cf-turnstile-response": token,
}, timeout=30)
return resp.json() if resp.status_code == 200 else None
Planlanmış Veri Toplama
import csv
from datetime import datetime
def daily_market_snapshot(tickers, output_dir="data"):
"""Collect daily stock data, handling CAPTCHAs automatically."""
scraper = FinancialScraper(
proxy="http://user:pass@residential.proxy.com:5000"
)
date_str = datetime.now().strftime("%Y-%m-%d")
results = []
for ticker in tickers:
url = f"https://screener.example.com/quote.ashx?t={ticker}"
try:
data = scraper.scrape_screener(url)
if data:
results.extend(data)
time.sleep(2) # Rate limit
except Exception as e:
print(f"Error on {ticker}: {e}")
# Save to CSV
filepath = f"{output_dir}/market_{date_str}.csv"
with open(filepath, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["ticker", "company", "sector", "price", "change"])
writer.writeheader()
writer.writerows(results)
print(f"Saved {len(results)} records to {filepath}")
return results
# Run daily
tickers = ["AAPL", "GOOGL", "MSFT", "AMZN", "TSLA"]
daily_market_snapshot(tickers)
Hız Sınırlamayla İlgili En İyi Uygulamalar
Finansal siteler otomatik erişim konusunda daha katıdır:
| Alıştırma | Tavsiye |
|---|---|
| Gecikme isteği | Sayfalar arasında 2-5 saniye |
| Eşzamanlı bağlantılar | Alan başına maksimum 3-5 |
| Vekil türü | Konut veya ISP |
| Oturum uzunluğu | 5-10 dakikalık yapışkan seanslar |
| Kullanıcı Aracısı | Gerçekçi, oturum başına tutarlı |
| SEC EDGAR | UA'ya iletişim e-postasını ekleyin (gerekli) |
| Pazar saatleri | Mümkün olduğunda yoğun olmayan saatlerde kazıyın |
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| SEC EDGAR'da 403 | E-postayla birlikte Kullanıcı Aracısı eksik | CompanyName email@domain başlığını ekle |
| Her istekte CAPTCHA | Oran sınırı aşıldı | İstekler arasına 3-5 saniyelik gecikmeler ekleyin |
| Eski fiyat verileri | Önbelleğe alınmış yanıt | Önbellek bozma sorgu parametresi ekle |
| JSON ayrıştırma hatası | Bunun yerine CAPTCHA sayfası geri döndü | Ayrıştırmadan önce CAPTCHA'yı kontrol edin |
| IP engellendi | Aynı IP'den çok fazla istek var | Dönüşümlü kendi sunucu altyapınız'sine geçin |
SSS
Finansal verileri kazımak yasal mı?
Kamu mali verilerine (SEC kayıtları, hisse senedi fiyatları) genellikle izin verilir. Her zaman hizmet şartlarına ve ücret sınırlarına saygı gösterin. SEC EDGAR, araştırma amacıyla açıkça EDGAR erişimi sağlar.
Finansal siteler neden CAPTCHA kullanıyor?
Piyasa manipülasyonuna, rekabetçi istihbarat toplanmasına veya aşırı sunucu yüküne neden olabilecek yüksek hacimli otomatik veri aktarımını önlemek.
Piyasa verilerini ne sıklıkla kazımalıyım?
Hisse senedi fiyatları için: maksimum piyasa saatlerinde dakikada bir kez. Başvurular için: Günde bir kez normaldir. Aşırı kazıma CAPTCHA'ları daha hızlı tetikler.
İlgili Kılavuzlar
CAPTCHA kesintisi olmadan finansal verileri toplayın —CaptchaAI anahtarınızı alınve pazar araştırmasını otomatikleştirin.