84 estrelas no GitHub e a contagem continua. O Yozh Crawler + Scraper é gratuito, de código aberto e desenvolvido publicamente — dá-nos uma estrela se ele merecer o seu lugar na tua pilha de ferramentas.
CyberYozh Data / Yozh Scraper
Software · Yozh Scraper

Introduza um URL e obtenha dados estruturados organizados

O Yozh Scraper exibe qualquer URL num navegador Playwright real e devolve exatamente o que pedires — campos extraídos, HTML bruto ou uma captura de ecrã da página completa. Inclui proxies CyberYozh integrados, modo discreto por predefinição, predefinições para os principais sites e sessões autenticadas. Não é um serviço SaaS, funciona em :8000.

$curl -X POST :8000/api/v1/scrape/page -d '{"url":"https://site.com", "proxy_type":"res_rotating","extract":{"type":"css","fields":{...}}}'

Scraping

O Yozh Scraper renderiza qualquer URL num navegador Playwright real e devolve exatamente o que pedes — campos extraídos, HTML bruto ou uma captura de ecrã da página completa. Cada extração é uma tarefa assíncrona: envie um URL, verifique o estado da tarefa e recupere o resultado. Proxies, modo discreto, predefinições e sessões autenticadas são todos suportados de forma nativa.

  • Renderização real do navegador — O Playwright renderiza páginas criadas com JavaScript; desative render desativar para HTML estático.
  • Extração estruturada — As regras de campos CSS ou XPath devolvem um objeto data , o que é muito mais eficiente do que descarregar e analisar HTML bruto por conta própria.
  • Proxies integrados — CyberYozh residencial / LTE móvel / centro de dados, com segmentação geográfica e sem deteção de pool-id.
  • Modo furtivo por predefinição — patches «playwright-stealth» (navigator.webdriver, impressão digital WebGL/Canvas, runtime do Chrome) para reduzir a deteção de bots.
  • Predefinições — extrair dados da Amazon, Google, eBay, Walmart, YouTube e LinkedIn por nome, com autocorreção opcional do LLM.
  • Sessões — sessões autenticadas geridas pelo servidor para alvos que iniciaram sessão, reutilizadas em várias recolhas de dados.
URL de basehttp://localhost:8000
Documentação da OpenAPIhttp://localhost:8000/docs
Ponto final do MCPhttp://localhost:8000/mcp
Funciona em conjunto com o Yozh Crawler. O crawler (:8001) percorre um site a partir de um URL inicial e recupera todas as páginas através deste scraper — as mesmas funcionalidades de renderização, proxy e sessão aplicam-se às páginas rastreadas.

Início rápido

O raspador surge a partir da raiz docker-compose.yml (ao lado do rastreador):

bash
cp .env.example .env          # set CYBERYOZH_API_KEY if using proxies
docker compose up --build
# scraper → http://localhost:8000
# crawler → http://localhost:8001

Verifique se está ativo:

bash
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
Os proxies precisam de uma chave API — definir CYBERYOZH_API_KEY em .env (pode obter uma em app.cyberyozh.com/api-access). Sem ela, apenas proxy_type: none funciona.

Utilização básica

Cada ponto final de scraping cria uma tarefa em segundo plano e devolve um job_id. Verifique o estado da tarefa e, em seguida, recupere os seus resultados.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://example.com", "proxy_type": "none" }'
# → { "job_id": "req_abc123" }

curl http://localhost:8000/api/v1/scrape/req_abc123          # status
curl http://localhost:8000/api/v1/scrape/req_abc123/results  # results

O resultado final inclui metadados e tudo o que tiver solicitado (data, raw_html, screenshot_base64):

JSON
{
  "job_id": "req_abc123",
  "status": "done",
  "total": 1, "done": 1,
  "results": [
    {
      "request_id": "req_abc123",
      "took_ms": 1234,
      "meta": { "url": "https://example.com", "final_url": "https://example.com/",
                "status_code": 200, "device": "desktop", "proxy_type": "none", "retries": 0 },
      "data": null, "raw_html": null, "screenshot_base64": null, "warnings": []
    }
  ]
}
status movimentos queuedrunningdone (ou failed / cancelled). Os resultados estão disponíveis para done, failede cancelled empregos.

Extrair dados

Aplicar uma extract regra e a resposta inclui um data objeto indexado pelos nomes dos teus campos — muito mais eficiente do que descarregar raw_html e analisá-lo você mesmo. As regras são css ou xpath.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{
    "url": "https://example.com",
    "extract": {
      "type": "css",
      "fields": {
        "title": { "selector": "h1", "attr": "text", "required": true }
      }
    }
  }'
# result → { "data": { "title": "Example Domain" } }

Cada campo é uma regra:

Chave de campoTipoPredefiniçãoDescrição
selectorstringobrigatórioSeletor CSS ou expressão XPath para o campo.
attrstringtextO que ler — text ou um nome de atributo (por exemplo, href, src).
allboolfalseDevolve todos os resultados correspondentes numa lista, em vez de apenas o primeiro.
requiredboolfalseSinalizar em caso de falta — aciona a autocorreção predefinida do LLM.

Utilize "type": "xpath" com seletores XPath (por exemplo, //h1) para a mesma forma.

Capturas de ecrã e HTML bruto

Definir screenshot: true para um PNG de página inteira (base64 em screenshot_base64) ou raw_html: true para obter o HTML completo após a renderização em raw_html.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://example.com", "screenshot": true, "raw_html": true }'
As capturas de ecrã desencadeiam uma passagem de deslocamento para carregar imagens diferidas. Se também utilizar block_assets, desativa-o para as capturas de ecrã, para que as imagens sejam apresentadas.

Proxies

Para uma extração de dados fiável, os proxies são essenciais — a maioria dos sites modernos bloqueia os pedidos diretos. O Yozh integra-se com o Serviço de Proxy CyberYozh; defina proxy_type em qualquer pedido.

proxy_typeO que é isto
res_rotatingRotativo residencial — predefinição recomendada.
res_staticEstática residencial (IP dedicado).
mobileMóvel / LTE, dedicado.
mobile_sharedMóvel / LTE, pool partilhado.
dc_staticCentro de dados estático.
noneLigação direta, sem proxy.

Selecione um local com proxy_geo (country_code / region / city). Descubra o que comprou sem ter de procurar os IDs da piscina:

cURL
curl "http://localhost:8000/api/v1/proxies/available?proxy_type=res_rotating"
curl "http://localhost:8000/api/v1/proxies/countries"
Os proxies exigem CYBERYOZH_API_KEY no scraper .env. Obtenha um em app.cyberyozh.com/api-access, e, em seguida, reinicie o contentor.

Predefinições

Uma predefinição agrupa um perfil de pedido + modelo de URL + receita de análise, pelo que permite extrair dados de um site pelo nome, em vez de ter de montar manualmente um pedido. Estão disponíveis predefinições integradas para a Amazon, o Google, o eBay, o Walmart, o YouTube e o LinkedIn; também pode criar as suas próprias (CSS/XPath determinísticas ou geradas por IA).

cURL
curl -X POST http://localhost:8000/api/v1/scrape/preset/page 
  -H "Content-Type: application/json" 
  -d '{
    "source": "amazon_product",
    "preset_params": { "asin": "B08N5WRWNW" },
    "locale": "us",
    "llm": { "model": "openai/gpt-5.4-mini" }
  }'
# → { "job_id": "..." }  then GET /api/v1/scrape/<job_id>/results
llm é opcional. Sem ele, o analisador determinístico funciona de forma autónoma; com ele, os seletores corrigem-se automaticamente quando um required campo for devolvido vazio. As chaves do fornecedor (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / OPENROUTER_API_KEY) são do lado do servidor em .env.

Gerir predefinições através de GET /api/v1/presets, GET /api/v1/presets/{name}, e POST /api/v1/presets (os nomes das predefinições do utilizador têm de começar por user_).

Sessões

Sessões autenticadas geridas pelo servidor: crie uma, inicie sessão uma vez e, em seguida, passe o seu session_id para qualquer processo de rastreamento, para que as páginas sejam obtidas com os cookies guardados e o estado de armazenamento. Necessário para alvos que exigem início de sessão, como a linkedin_profile predefinição.

  1. POST /api/v1/sessions — criar. Pinos device / proxy_type / proxy_geo e um TTL. Devolve { session_id, expires_at }.
  2. POST /api/v1/sessions/{id}/login — executar novamente um script de início de sessão declarativo com creds no corpo: { script, creds }.
  3. POST /api/v1/scrape/page com session_id set — scrape autenticado.
  4. DELETE /api/v1/sessions/{id} — limpar.
cURL
# 1. create  →  {"session_id":"sess_...","expires_at":...}
curl -X POST http://localhost:8000/api/v1/sessions 
  -H "Content-Type: application/json" 
  -d '{ "device": "desktop", "proxy_type": "res_rotating" }'

# 2. log in (declarative DSL + creds)
curl -X POST http://localhost:8000/api/v1/sessions/sess_.../login 
  -H "Content-Type: application/json" 
  -d '{ "script": { "steps": [ {"op":"goto","url":"https://site/login"} ] },
        "creds": { "username": "...", "password": "..." } }'

# 3. scrape with the session
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://site/secure", "session_id": "sess_...", "raw_html": true }'
session_id e cookies juntos → 422. O conteúdo extraído device / proxy_type / proxy_pool_id / proxy_geo devem corresponder aos valores fixados da sessão. No caso de CAPTCHA / 2FA que a DSL de início de sessão não consiga resolver, ignore o script e, em vez disso, insira cookies na sessão.

Extracção em lote

Envie várias páginas num único trabalho com POST /api/v1/scrape/pages — cada entrada corresponde a um pedido completo de extração. Verifique o estado e obtenha os resultados através dos mesmos pontos de acesso do trabalho.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/pages 
  -H "Content-Type: application/json" 
  -d '{
    "pages": [
      { "url": "https://example.com", "proxy_type": "none" },
      { "url": "https://example.org", "proxy_type": "none" }
    ]
  }'
Um nível superior session_id aplica-se a todas as páginas do lote (é rejeitado com o código 422 se uma página já tiver fixado outra diferente).

MCP

O scraper disponibiliza um ponto de acesso do Protocolo de Contexto de Modelo em /mcp (HTTP Streamable). Aponte o Claude ou o Cursor para ele e as ferramentas aparecem automaticamente:

  • run_scrape_page
  • run_scrape_pages
  • get_job_status
  • get_job_result
  • cancel_scrape_job
  • health
~/.claude/settings.json
"yozh-scraper": {
  "type": "http",
  "url": "http://localhost:8000/mcp"
}

Depois, basta perguntar: «Recolhe o conteúdo de https://example.com e diz-me o que está na página.» O mesmo ponto final funciona a partir de um agente LangChain ou de um nó da ferramenta cliente MCP do n8n.

Referência de configuração

Pedido — ScrapeRequest (selecionado)

CampoTipoPredefiniçãoDescrição
urlcadeia de caracteres (URL)obrigatórioA página a apresentar e a extrair.
renderbooltrueRenderizar no navegador (necessário para páginas criadas com JavaScript).
wait_untildomcontentloaded · networkidledomcontentloadedQuando a página for considerada pronta.
wait_for_selectorcadeia de caracteres · nulonullAguarde a aparecimento de um elemento específico antes de capturar.
devicedesktop · mobiledesktopJanela de visualização / Perfil do agente do utilizador.
proxy_typever ProxiesnoneConjunto de proxies pelo qual as rotas de recuperação passam.
proxy_geoProxyGeo · nulonullSegmentação por país / região / cidade.
session_idcadeia de caracteres · nulonullUtilize uma sessão autenticada — consulte a secção «Sessões».
stealthbooltrueAplicar medidas de reforço contra a deteção.
block_assetsbool · nullenvBloquear imagens/tipos de letra/conteúdos multimédia para aumentar a velocidade (recorre a BLOCK_ASSETS).
extractExtractRule · nulonullRegras de campo CSS/XPath → estruturadas data.
raw_htmlboolfalseInclua o código HTML completo após a renderização.
screenshotboolfalseCapture um ficheiro PNG de página inteira (base64).

Referência da API

MétodoCaminhoFinalidade
POST/api/v1/scrape/pageExtrair uma página. Devolve {"job_id":"…"}.
POST/api/v1/scrape/pagesExtrair várias páginas em lote numa única tarefa.
POST/api/v1/scrape/preset/pageExtrair por nome de predefinição (Amazon, Google, …).
GET/api/v1/scrape/{id}Estado da tarefa (em fila/em execução/concluída/…).
GET/api/v1/scrape/{id}/resultsResultados da tarefa (páginas + ScrapeResponse).
DELETE/api/v1/scrape/{id}Cancelamento suave — fim das páginas durante o voo.
POST/api/v1/sessionsCriar uma sessão autenticada.
POST/api/v1/sessions/{id}/loginExecutar um script de início de sessão declarativo.
DELETE/api/v1/sessions/{id}Eliminar uma sessão.
GET/api/v1/proxies/availableListar os proxies adquiridos de um determinado tipo.
GET/api/v1/presetsLista de predefinições integradas e criadas pelo utilizador.
GET/api/v1/healthSaúde + número de trabalhadores.

Detalhes importantes

Os proxies precisam de uma chave API. Defina-a CYBERYOZH_API_KEY no scraper .env. Sem ela, apenas proxy_type: none (ligações diretas) funcionam.
Tarefas assíncronas na memória. Cada extração é uma tarefa em segundo plano; o armazenamento é feito na memória e é reiniciado quando o contentor é reiniciado. Obtenha os resultados enquanto estiverem disponíveis ou guarde-os por conta própria.
As sessões são exclusivas com cookies. Ao passar ambos session_id e cookies retorna 422, e uma extração deve corresponder ao ID fixado da sessão device / proxy_type / proxy_geo.
A autocorreção do LLM é do lado do servidor. A autocorreção predefinida utiliza chaves do fornecedor (OPENAI / ANTHROPIC / GEMINI / OPENROUTER) provenientes de .env — que nunca são enviadas pelo cliente.

Apreciado pelas equipas de dados e pelos criadores de IA

O que dizem as pessoas que criam com o Yozh

5,0 / 5 · Crítica de 5
GitHub
Substituímos o nosso cluster interno do Playwright pelo Yozh numa tarde. O endpoint do MCP integrou-se diretamente no nosso agente Claude — sem qualquer código de ligação, o crawler e o scraper funcionaram logo.
Marcus Reinhardt Engenheiro de Dados Principal Northwind Analytics
X
O sistema de predefinições é a funcionalidade mais marcante. Passamos um nome de fonte e recebemos um JSON limpo em resposta; a correção automática chegou mesmo a detetar duas alterações no layout da Amazon antes de nos apercebermos.
Priya Nair Fundador ScrapeStack
Reddit
Finalmente, um scraper de código aberto que trata os proxies e as sessões como elementos de primeira classe. Executamo-lo em portais de parceiros que exigem início de sessão — as sessões mantêm-se ativas e os resultados permanecem consistentes em todas as regiões.
Daniel Osei Engenheiro de Backend Loopfeed
X
Liguei-o ao Cursor através do MCP e agora o meu agente obtém dados da Web em tempo real durante a execução da tarefa. O rastreio em tempo real através do SSE é exatamente o que faltava aos fluxos de trabalho do agente.
Elena Kovac Engenheiro de IA Vektor Labs
GitHub
Deixámos de utilizar uma API de extração de dados paga para reduzir custos e preparámo-nos para um declínio na qualidade — mas aconteceu o contrário. É auto-hospedada, não há cobrança por pedido e o esquema de saída é mais claro do que aquele pelo qual costumávamos pagar.
Sofia Almeida Gestor de Engenharia Tabbly
Código aberto · Licença MIT · 84 ★

Processar um URL. Obter dados limpos

O Yozh Scraper é o motor de renderização por trás de toda a pilha — um docker compose up e já tem proxies, modo furtivo, predefinições, sessões e extração, compatível com MCP, na sua própria infraestrutura. Grátis. Para sempre.

O Yozh Scraper + Crawler é distribuído ao abrigo da licença MIT. Utilize-o. Faça um fork. Desenvolva com ele.