Baixa o conteúdo de um site para navegação offline. Recria a estrutura de pastas original, baixa HTML, CSS, JavaScript e imagens, reescreve os links para caminhos locais (a cópia navega de verdade) e opcionalmente compacta tudo em um ZIP. Funciona por interface gráfica (Tkinter) ou por linha de comando.
- Download recursivo com limite de profundidade configurável.
- Reescrita de links: a cópia offline navega entre as páginas baixadas.
- Respeito ao
robots.txte rate limiting educado entre requisições. - Restrição ao mesmo domínio (com opção de liberar).
- Interface gráfica com barra de progresso e botão de cancelar (sem travar).
- Modo linha de comando para automação.
- Compactação opcional em ZIP.
SiteExtractor/
├── site_extractor/
│ ├── __init__.py
│ ├── crawler.py # lógica de download e reescrita de links (sem UI)
│ ├── cli.py # interface de linha de comando
│ └── gui.py # interface gráfica (Tkinter, com threading)
├── tests/
│ └── test_crawler.py
├── siteextrator.py # entrypoint compatível (abre a GUI)
├── requirements.txt
├── requirements-dev.txt
└── pyproject.toml
- Python 3.9 ou superior
requestsebeautifulsoup4(verrequirements.txt)tkinter(nativo do Python; em algumas distros Linux instala-se com o pacotepython3-tk)
git clone https://github.com/bulletdev/site-extractor.git
cd site-extractor
pip install -r requirements.txtPara desenvolvimento (testes e linters):
pip install -r requirements-dev.txtpython siteextrator.py- Informe a URL do site.
- Ajuste a profundidade e as opções desejadas.
- Clique em "Baixar Site" e escolha a pasta de destino.
# Baixa a página inicial e seus assets
python -m site_extractor.cli https://exemplo.com -o ./saida
# Recursão de até 3 níveis, gerando um ZIP
python -m site_extractor.cli https://exemplo.com --depth 3 --zip
# Ignora robots.txt e remove o delay entre requisições
python -m site_extractor.cli https://exemplo.com --no-robots --delay 0
# E-commerce (recomendado): limita paginas e colapsa filtros/ordenacao
python -m site_extractor.cli https://loja.com --depth 4 --max-pages 200 --ignore-queryPor padrão, assets (css/js/imagens) são baixados mesmo quando servidos por um
CDN em outro domínio, para que a cópia offline mantenha estilo e imagens. Em
sites grandes com navegação por filtros, use --max-pages e --ignore-query
para o crawl convergir.
Veja todas as opções com python -m site_extractor.cli --help.
Linters e testes (equivalentes Python do ecossistema Rails):
| Ferramenta | Papel | Equivalente Rails |
|---|---|---|
| Ruff | lint e formatação | RuboCop |
| Bandit | análise de segurança | Brakeman |
| Semgrep | análise semântica de padrões | Semgrep |
| pytest | testes | RSpec |
ruff check .
ruff format --check .
bandit -r site_extractor -c pyproject.toml
semgrep --config .semgrep.yml --config p/python .
pytest -qO mesmo conjunto roda automaticamente no CI (ver .github/workflows/ci.yml).
- Conteúdo dinâmico gerado por JavaScript ou protegido por autenticação pode não ser baixado.
- Use apenas em sites de domínio público ou para os quais você tem permissão.
Distribuído sob a licença MIT.