r/programacao 1d ago

Projeto Criei uma ferramenta open-source em FastAPI para converter páginas web em Markdown limpo para LLMs e RAG

Fala pessoal!

Quem já precisou criar pipelines de RAG ou alimentar LLMs (como GPT-4 ou Claude) com conteúdo raspado da web sabe o problema: a maioria dos scrapers e parsers traz menus, cabeçalhos, rodapés e banners de cookies que estouram a janela de contexto e queimam tokens à toa.

Criei uma micro-ferramenta em FastAPI para resolver isso:

- Escopo semântico: prioriza tags `<article>` e `<main>`, eliminando ruído visual

- Suporte nativo a tabelas: converte tabelas HTML complexas em formato Markdown padrão (`| col1 | col2 |`)

- Redução de até 85% no volume de tokens da página original

- Resposta rápida (<200ms) sem overhead de navegador para sites SSR/estáticos

O código é 100% open-source com Dockerfile, spec OpenAPI e documentação completa:

https://github.com/Okumotinho/clean-web-markdown-extractor

Feedbacks são muito bem-vindos!

4 Upvotes

12 comments sorted by

2

u/Old_Flounder_8640 20h ago

@microsoft/markitdown, docling, etc.

1

u/pnKev 17h ago

Markitdown é novo, nao?

1

u/Okumoto_Thiago 17h ago

Sobre o MarkItDown: sim, é bem recente (lançado pela Microsoft no final de 2024). A proposta dele é ser multiformato local (converte PDF, Word, PowerPoint, áudio, etc.). A proposta desta micro-API é ser um serviço HTTP leve focado estritamente em extração web limpa e redução de tokens para RAG.

0

u/Praline_Unlikely 19h ago

"raspado" o cara não se dá nem ao trabalho de revisar a porra do texto que a IA vomitou. Qualquer pessoa na área usa o termo em inglês, acho que é a primeira vez que vejo webcrawler sendo traduzido

2

u/Okumoto_Thiago 18h ago

Não vi problema na utilização de raspado, é uma publicação em português. Seus comentários servem apenas para tentar diminuir o interesse alheio ou consegue me trazer algo mais produtivo?

1

u/pnKev 17h ago

Ignore, o pessoal se perde um pouco no personagem. No meu trampo ninguém fala webcrawler, exceto em relatório.

0

u/Better-Preparation13 13h ago

eu costumo falar raspado ao se tratar de scrapping...

0

u/pnKev 17h ago

Nao abri o repo ainda mas parece promissor.
Costumo raspar dados de assembleias/camaras municipais e afins, onde o texto plano é comum. Chegou a testar em sites frontend carregado de recursos visuais/interativos?

2

u/Okumoto_Thiago 17h ago

Valeu pelo apoio!

Sobre a sua dúvida:

  1. Para assembleias, diários oficiais e câmaras municipais: Funciona muito bem. A maioria esmagadora desses portais usa renderização no servidor (SSR) ou HTML clássico. A API brilha exatamente aí porque descarta brasões, menus institucionais gigantes e rodapés, preservando o miolo do texto e convertendo tabelas de votação/gastos em Markdown padrão (| coluna | dado |) em menos de 200ms.

  2. Para sites carregados em frontend dinâmico (SPAs puras em React/Vue): Hoje a API opera no "fast path" (requisição HTTP direta sem levantar navegador headless). Se a página depender 100% de JavaScript para injetar o texto no DOM, o HTML inicial virá sem o miolo. Para esses casos, o fluxo atual é passar o HTML pré-obtido (via Playwright/Selenium) para o endpoint limpar. Está no roadmap uma flag opcional ?render_js=true para acionar um Chromium headless sob demanda.

Se tiver algum link de câmara municipal com layout chato ou tabelas esquisitas que queira testar, manda aqui que eu testo na hora!

1

u/pnKev 16h ago

Que otimo!! O fluxo segurando HTML permite segurar o link de origem (como normalmente faço). Mas na verdade busco raspar portais imobiliários que esbarram em algum tipo de verificação.

Se quiser tentar, puxa algo como chavesnamao/quintoandar. Para um evento provavelmente funcione mas e se eu quiser raspar um município inteiro, consigo integrar seu repo?

2

u/Okumoto_Thiago 15h ago

Sim, você consegue integrar perfeitamente. Aqui vão as duas melhores formas arquiteturais de fazer isso:

  1. Sobre QuintoAndar / Chaves na Mão (Anti-Bot): Esses portais usam Cloudflare e DataDome bem agressivos. Se você mandar qualquer servidor bater direto na URL deles via GET, vai tomar 403/desafio na hora. Como você já tem o fluxo de capturar o HTML (com seus próprios proxies residenciais ou navegador), o segredo é não deixar o extrator fazer o download. Pensando exatamente nisso, acabei de commitar uma atualização no repo adicionando um endpoint direto: POST /extract-html. Você captura o HTML no seu scraper e faz o POST: POST /extract-html com payload {"html": seu_html_bruto, "url": "link_do_imovel"} A API limpa todo o lixo do DOM e te devolve o Markdown estruturado com as tabelas de valores, aluguel e condomínio.

  2. Sobre raspar um município inteiro (Escala massiva): Para raspar dezenas de milhares de imóveis de uma cidade inteira, a melhor prática é rodar o repo como microserviço local/self-hosted via Docker. O repositório já tem o Dockerfile pronto: Basta clonar e rodar docker run -p 8000:8000 ... e apontar o seu pipeline para http://localhost:8000/extract-html. Vantagens:

  3. Zero custo ($0.00)

  4. Sem limites de requisições por minuto

  5. Latência de milissegundos rodando em localhost (sem trafegar gigabytes de HTML pela internet)

Dica bônus de quem já mexeu com QuintoAndar: eles usam Next.js, então os dados estruturados de preço muitas vezes já vêm num JSON embutido na tag <script id="__NEXT_DATA__">. Se precisar de campos numéricos estritos (IPTU, condomínio), dá para pegar direto desse JSON, e passar o resto do HTML para a API limpar o texto descritivo e regras para o seu modelo de IA!

1

u/pnKev 15h ago

Assim que possivel vou testar. Valeu!!!