Plataformas financeiras como avaliadores de ações, SEC EDGAR e plataformas de negociação protegem os dados com CAPTCHAs para evitar a extração automatizada. CaptchaAI lida com esses desafios de forma programática para que você possa coletar dados de mercado em grande escala.
Onde os CAPTCHAs aparecem nas finanças
| Fonte | Tipo CAPTCHA | Gatilho | Valor dos dados |
|---|---|---|---|
| SEG EDGAR | reCAPTCHA v2 | Solicitações de alto volume | Arquivos da empresa |
| Yahoo Finanças | reCAPTCHA v2 | Detecção de raspagem | Cotações de ações, história |
| Bloomberg | Cloudflare Turnstile | Todo o acesso automatizado | Dados de mercado |
| Finviz | reCAPTCHA v2 | Acesso ao analisador de estoque | Resultados da triagem |
| Visualização de Negociação | Cloudflare Turnstile em staging | Limitação de taxa | Gráficos, indicadores |
| Estrela da Manhã | reCAPTCHA v3 | Páginas de exportação de dados | Análise de fundos |
Raspagem do analisador de estoque
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']})")
Extração de arquivamento SEC EDGAR
SEC EDGAR implementa limitação de taxa e CAPTCHAs para acesso de alto volume:
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")
Dados de mercado protegidos por catraca
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
Coleta de dados agendada
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)
Práticas recomendadas de limitação de taxa
Os sites financeiros são mais rígidos quanto ao acesso automatizado:
| Pratique | Recomendação |
|---|---|
| Atraso na solicitação | 2 a 5 segundos entre páginas |
| Conexões simultâneas | Máximo de 3 a 5 por domínio |
| Tipo de proxy | Residencial ou ISP |
| Duração da sessão | Sessões fixas de 5 a 10 minutos |
| Agente do usuário | Realista e consistente por sessão |
| SEG EDGAR | Incluir e-mail de contato no UA (obrigatório) |
| Horário do mercado | Raspe fora do horário de pico, quando possível |
Solução de problemas
| Problema | Causa | Correção |
|---|---|---|
| 403 na SEC EDGAR | User-Agent ausente com e-mail | Adicionar cabeçalho CompanyName email@domain |
| CAPTCHA em cada solicitação | Limite de taxa excedido | Adicione atrasos de 3 a 5 segundos entre solicitações |
| Dados de preços desatualizados | Resposta em cache | Adicionar parâmetro de consulta cache-bust |
| Erro de análise JSON | Página CAPTCHA retornada | Verifique o CAPTCHA antes de analisar |
| IP bloqueado | Muitas solicitações do mesmo IP | Mudar para egress de rede autorizado rotativo |
Perguntas frequentes
A coleta de dados financeiros é legal?
Dados financeiros públicos (arquivos da SEC, cotações de ações) são geralmente permitidos. Sempre respeite os termos de serviço e os limites de taxas. SEC EDGAR fornece explicitamente acesso EDGAR para fins de pesquisa.
Por que os sites financeiros usam CAPTCHAs?
Para evitar extração automatizada de alto volume que poderia permitir manipulação de mercado, coleta de inteligência competitiva ou carga excessiva do servidor.
Com que frequência devo coletar dados de mercado?
Para preços de ações: uma vez por minuto durante o horário de mercado, no máximo. Para arquivamentos: uma vez ao dia é o normal. A raspagem excessiva aciona CAPTCHAs com menor latênciamente.
Guias Relacionados
- A qualidade do proxy afeta a taxa de resolução
- Proxies residenciais rotativos
Colete dados financeiros sem interrupções de CAPTCHA -obtenha sua chave CaptchaAIe automatizar pesquisas de mercado.