Casos de Uso

Extração de dados financeiros com tratamento CAPTCHA

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

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


Colete dados financeiros sem interrupções de CAPTCHA -obtenha sua chave CaptchaAIe automatizar pesquisas de mercado.

Os comentários estão desativados para este artigo.