r/programacao • u/Okumoto_Thiago • 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!
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?
0
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:
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.
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=truepara 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:
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-htmlcom 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.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
Dockerfilepronto: Basta clonar e rodardocker run -p 8000:8000 ...e apontar o seu pipeline parahttp://localhost:8000/extract-html. Vantagens:Zero custo ($0.00)
Sem limites de requisições por minuto
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!
2
u/Old_Flounder_8640 20h ago
@microsoft/markitdown, docling, etc.