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 / Casos de utilização / Extracção de dados da Web e análise de dados
Caso de utilização · Web scraping

Dados públicos da Web, estruturados para SQL

Importa qualquer página pública ou todo o site para o teu armazém de dados como JSON limpo: ofertas de emprego, notícias, críticas, catálogos, perfis públicos. O Yozh trata dos seletores, da proteção contra bots, das tentativas de repetição e dos proxies — os teus carregadores apenas adicionam os dados ao Snowflake, ao BigQuery ou ao Postgres.

$curl -s :8000/api/v1/scrape/batch -d @urls.json | jq -c '.results[]' | psql -c "COPY raw FROM stdin"
batch: g2.com/products
Target table
scraped_pages
Batch
200 urls 8 workers 1.0/s
Status
streaming · 247 / 200 rows
Yozh batch /scrape/batch
Pulling URL batch
Stealth fetch + retry
Parsing & normalizing
Emitting JSON-lines
COPY FROM stdin
Condutas para a tua pilha
Por que razão a maioria das condutas apodrece

Os scrapers criados pelos próprios utilizadores consomem 90% do tempo dedicado à análise e geram dados de má qualidade

Um «pequeno script em Python» transforma-se em meses de gestão de cookies, rotação de proxies, correções de seletores, filas de novas tentativas e alertas às 3 da manhã, tudo porque a fonte alterou o nome de uma classe. A equipa de dados passa o trimestre a reconstruir a estrutura de base, em vez de criar painéis de controlo. Fornecemos as quatro componentes que todas as equipas têm de reconstruir do zero — prontas a usar.

Se o seu armazém tiver mais nullcolunas do que filas após uma reformulação da fonte — isto é para si.

Os raspadores de bricolage frágeis apodrecem num quarto de ano

O problema. Um script em Python escrito ao fim de semana transforma-se num motor interno frágil: uma fila aqui, uma camada de repetição de tentativas ali, sem observabilidade, um seletor CSS que deixa de funcionar sempre que o código-fonte é redesenhado. A equipa fica responsável por uma infraestrutura que nunca quis criar.

Como o Yozh Scraper resolve o problema. Motor pronto para produção: executor de lotes em paralelo, novas tentativas automáticas com recuo exponencial, códigos de erro estruturados e autocorreção LLM que regenera seletores danificados a partir do DOM ativo. Um único docker compose up substitui meses de código de ligação.

  • autocorreção por LLM
  • Lote + repetições
  • Erros estruturados

Código HTML desorganizado em todas as fontes

O problema. Cada site apresenta a sua própria combinação única de divs aninhadas, blobs JSON não documentados e formatos de data inconsistentes. Os vossos carregadores precisam de uma etapa de normalização antes do armazenamento — e essa etapa é a primeira a falhar sempre que a fonte lança um novo design.

Como o Yozh Scraper resolve isso. As predefinições integradas garantem um formato JSON idêntico em todas as fontes — as mesmas chaves, datas ISO e moedas normalizadas de acordo com a localização. Fontes personalizadas? POST /api/v1/presets/generate Basta um URL de exemplo — um LLM infere o esquema e cria os seletores. Integra-se diretamente em COPY ... FROM stdin.

  • Mesmo formato JSON
  • Datas ISO
  • Predefinições geradas por LLM

A luta contra os bots consome o sprint

O problema. Os proxies dos centros de dados esgotam-se numa única sessão, as barreiras CAPTCHA bloqueiam os rastreios a meio do trabalho e a identificação de impressões digitais TLS deteta os navegadores sem interface em segundos. Os engenheiros de dados acabam por ter de resolver os bloqueios em vez de criarem painéis de controlo. As faturas dos proxies disparam, enquanto o volume estagna.

Como o Yozh Scraper resolve isso. Integração nativa com o CyberYozh App Proxy através de CYBERYOZH_API_KEY — 5 tipos de proxy (residencial rotativo/fixo, móvel 4G/5G, centro de dados, ISP) em 250 códigos de país. A versão «Stealth» do Chromium, com impressão digital «warm», adapta-se automaticamente à origem do proxy. A maioria dos fluxos nunca encontra um CAPTCHA.

  • 5 tipos de proxy
  • 250 códigos de país
  • Fingerprint aquecida

Orquestração ad hoc do rastreio

O problema. «Percorrer este site, extrair todas as páginas de produtos, estar atento a novos URLs» é uma tarefa lógica — mas, em código, traduz-se numa fila, numa tabela de deduplicação, em regras de âmbito, em limites de RPS e num cancelamento em duas etapas. Se for implementado manualmente, falha perante novas tentativas e volta a extrair silenciosamente o mesmo URL.

Como o Yozh Scraper resolve isso. O Yozh Crawler percorre o site do lado do servidor, elimina duplicados através de hashes SHA1 por tarefa, transmite novos URLs via SSE e encadeia-se ao scraper em cada correspondência. Cancelamento em duas fases (suave → forçado). Envie o fluxo diretamente para o Airflow / dbt / cron — a orquestração mantém-se nas ferramentas que já utiliza.

  • Streaming SSE
  • Deduplicação por tarefa
  • Airflow / dbt / cron
Como funciona

De uma página web em bruto a uma linha no armazém — em 3 passos

Um ponto final para extrair, uma forma para carregar. Ligue o Yozh diretamente ao seu carregador, ao seu orquestrador e ao seu armazém de dados — sem necessidade de uma camada intermédia.

1 Acelera o motor

Clona o repositório e docker compose up. O scraper no :8000, o crawler está a funcionar :8001. Sem conta SaaS, sem assistente de chave API — funciona na sua VPC.

# one-time setup
git clone 
  github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
docker compose up -d
2 Extrair em lote uma lista de URLs

Envie via POST o seu lote de URLs (até 200 por chamada). Os workers são executados em paralelo, com as novas tentativas e os proxies geridos do lado do servidor. O mesmo formato JSON em todas as fontes.

curl 
  localhost:8000/api/v1/scrape/batch 
  -X POST 
  -d '{"urls": ["…", "…"],
       "preset": "auto",
       "concurrency": 8}'
3 Envie diretamente para o seu armazém

Os resultados são apresentados como linhas JSON. Envie-os através de jq para COPY ... FROM stdin no Postgres, ou carregue diretamente através do cliente Snowflake / BigQuery. Sem middleware.

# postgres example
curl :8000/api/v1/scrape/batch 
  -d @urls.json 
| jq -c '.results[]' 
| psql -c "COPY raw FROM stdin"
Exemplo prático

O que ganha em troca — um único formato, para todos os mercados

Escolha uma predefinição para ver como fica a resposta. O conjunto de campos varia consoante a fonte, mas o formato do pedido é idêntico.


            
Receitas

Como as equipas de dados organizam o seu trabalho — em 10 linhas cada

Três canais de transporte de conteúdo da página para o armazém, prontos a serem inseridos. O Yozh trata da extração — o seu orquestrador trata da programação.

1 Instantâneo diário → Postgres

O Cron recupera uma lista de URLs, faz a extração em lote e transmite linhas JSON diretamente para uma tabela de preparação. O dbt recebe esses dados a jusante.

# crontab: every day at 06:00
0 6 * * * /usr/local/bin/snapshot.sh

# snapshot.sh
curl -s :8000/api/v1/scrape/batch 
  -d "@urls.json" 
| jq -c '.results[]' 
| psql -c "COPY raw_scrape FROM stdin"

# dbt build runs next in Airflow DAG
dbt build --select staging.raw_scrape+
200 URLs/lote COPY FROM stdin o teu cron / Airflow
2 Rastreio de descoberta → BigQuery

Fazer o rastreio de um site, transferir novos URLs à medida que forem sendo descobertos. Eliminar duplicados em relação aos dados de ontem, extrair apenas as alterações e inserir linhas no BigQuery à medida que forem chegando.

# stream discovered URLs over SSE
curl -N :8001/api/v1/crawl/start 
  -d '{"seed_url":"site.com",
       "scope":"same-domain",
       "max_pages":1000}' 
| jq -r 'select(.event=="found") | .url' 
| comm -13 yesterday.txt - 
| bq insert dataset.urls --source_format=NEWLINE_DELIMITED_JSON
Streaming SSE deduplicação por tarefa (SHA1) inserções só de deltas
3 Fluxo contínuo de notícias → Kafka

Rastrear e extrair informações de fontes noticiosas, publicando cada artigo como um evento no Kafka. Os consumidores a jusante (painéis de controlo, modelos de análise de sentimentos, alertas) subscrevem por tema.

# 1. continuous crawl of source list
curl -N :8001/api/v1/crawl/start 
  -d "@sources.json" 
| jq -c 'select(.event=="scraped") | .result' 
| kcat -P -t news.raw -b kafka:9092

# 2. consumers subscribe downstream
kcat -C -t news.raw | your-pipeline
cadeia scraping + publicação Produtor Kafka tópico por fonte
FAQ

Perguntas frequentes sobre a entrada em armazéns

Que fontes posso extrair?
Qualquer página pública. As predefinições integradas abrangem as que têm maior tráfego — plataformas de comércio eletrónico, motores de busca, YouTube, perfis do LinkedIn (com sessões). Para fontes personalizadas, basta chamar POST /api/v1/presets/generate com um URL de exemplo — um LLM infere o esquema e cria os seletores, obtendo uma predefinição reutilizável em segundos. Para páginas pontuais, POST /scrape/page com um extract: {...} funciona sem qualquer predefinição. O ficheiro robots.txt é respeitado por predefinição; respeite-o para as fontes que não lhe pertencem.
Como posso importar dados para o Snowflake / BigQuery / Postgres?
O scraper devolve linhas JSON em cada lote e fluxos SSE em cada rastreio. Envie diretamente para o seu carregador de armazém: jq -c '.results[]' | psql -c "COPY raw FROM stdin" para o Postgres, bq insert para o BigQuery, snowsql --query "PUT ..." + COPY INTO para o Snowflake, ou grave no S3/GCS e deixe que o seu Snowpipe ou tabela externa já existente recupere os dados. Não é necessário manter nenhum conector personalizado — trata-se apenas de JSON via HTTP.
Posso executar isto dentro da minha VPC?
Sim — o Yozh é auto-hospedado. docker compose up Inclui dois contentores (scraper + crawler) dentro de qualquer rede que lhes atribuir: VPC, no local, isolada. Sem comunicação com o servidor central, sem dependência de SaaS. O tráfego de saída é direcionado para os alvos que você rastreia (e, opcionalmente, para o CyberYozh App Proxy, caso o ative). Registos, rastreios e métricas permanecem onde os colocar — registos JSON estruturados no ponto de extremidade do Prometheus em /metrics, registos JSON estruturados para o stdout.
Como funcionam as tentativas de repetição, os erros e a observabilidade?
Cada pedido recebe um orçamento de tentativas com recuo exponencial (configurável por chamada). As falhas devolvem códigos de erro estruturados — BLOCKED, CAPTCHA, SELECTOR_FAIL, UPSTREAM_TIMEOUT — para que o seu carregador possa ramificar com base neles, em vez de analisar cadeias de caracteres. Quando um seletor deixa de funcionar após uma reformulação da fonte, a autocorreção do LLM regenera-o em tempo real (passando llm: {model: "..."}) e marca a resposta com self_heal: true para auditoria a jusante. As métricas do Prometheus relativas à profundidade da fila, taxa de sucesso e latência do proxy estão disponíveis de fábrica.
Como é que isto se integra com o Airflow / dbt / Temporal?
O Yozh trata da recolha de dados; o teu orquestrador trata da programação. O padrão mais simples: um Airflow BashOperator (ou um PythonOperator com requests) chama /scrape/batch, encaminha os resultados para uma tabela de preparação e, em seguida, encadeia uma tarefa dbt a jusante. As recolhas devolvem um fluxo SSE — utilize uma tarefa de longa duração ou divida-a em blocos retomáveis através do job_id. A ausência de um agendador integrado significa que não há dependência: utilize o que a sua plataforma de dados já executa.
Código aberto · Licença MIT · 84 ★

Está pronto para transferir dados da Web para o seu armazém de dados?

Uma configuração do Docker Compose, um fluxo de linhas JSON, todas as fontes normalizadas — diretamente para o Snowflake, BigQuery, Postgres e Kafka. Grátis. Para sempre. Se isto te ajudar, marca-nos com uma estrela — cada estrela conta.

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

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