Skip to content

ezn1hero/site-dynamic-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Site Parser (full mirror)

Зеркало сайта с реальным браузером: запускает Chromium (Playwright), обходит страницы, кликает раскрывающие кнопки/аккордеоны, скроллит для lazy-load и сохраняет оригинальные тела всех HTTP-ответов (HTML + CSS + JS + шрифты + картинки + XHR) с сохранением исходной структуры путей. Это значит, что SPA (React/Vue/Vite и т.п.) продолжают работать со стилями, роутингом и логикой — нужно просто отдать зеркало локальным HTTP-сервером.

TL;DR

python -m venv .venv; .venv\Scripts\activate
pip install -r requirements.txt
python -m playwright install chromium
python crawler.py https://example.com --out .\site --max-pages 30
python serve.py .\site\example.com 8000

Открой http://127.0.0.1:8000.

Структура проекта

  • crawler.py — обход сайта, клики, сохранение ответов.
  • serve.py — локальный HTTP-сервер с SPA-fallback.
  • requirements.txt — зависимости (только playwright).
  • site/ — сюда складывается зеркало (в .gitignore).

Установка

python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python -m playwright install chromium

Снятие зеркала

python crawler.py https://example.com --out .\site --max-pages 50

Опции:

  • --out — корневая папка (по умолчанию ./site).
  • --max-pages — лимит страниц при BFS-обходе.
  • --any-subdomain — разрешить поддомены исходного хоста.
  • --headless — без окна браузера.

Результат лежит в site/<host>/... ровно с теми же путями, что и на боевом сайте. Ничего в HTML/JS/CSS не переписывается — поэтому все абсолютные /assets/xxx.js и относительные url(../fonts/x.woff2) резолвятся как есть.

Локальный запуск зеркала

SPA нельзя открывать через file:// — модули ES, fetch и клиентский роутер не будут работать. Используй встроенный сервер:

python serve.py .\site\example.com 8000

Открой http://127.0.0.1:8000. Для неизвестных маршрутов сервер отдаёт index.html (SPA-fallback), чтобы клиентский роутер сам разрулил путь.

Что кликается при обходе

CLICK_SELECTORS в crawler.py: button, [role=button], [aria-expanded=false], details > summary, .accordion-*, .load-more/.show-more и похожие. Кнопки с текстом «войти/купить/удалить/подписаться/checkout» пропускаются (SKIP_CLICK_TEXT), чтобы случайно не отправить формы.

Ограничения

  • Динамика, которая грузится только по действию пользователя после авторизации, требует ручного логина. Запусти без --headless, залогинься, и перезапусти со storage_state (см. Playwright docs) — легко допилить.
  • Агрессивные анти-боты (Cloudflare Turnstile и т.п.) могут блокировать.
  • Серверную логику (API за токеном, приватные эндпоинты) скопировать нельзя — сохранится только то, что реально отдавалось в ответ на HTTP-запрос в твоей сессии.
  • Уважай robots.txt и ToS сайта.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages