# πŸ“š BookScraper β€” Web UI + Docker + Live Log Streaming BookScraper is een moderne, volledig geautomatiseerde scraper voor Chinese webnovels zoals **Piaotian / Piaotia**. Het project combineert een krachtige scraping-engine met een prettige webinterface. --- # πŸ” Wat doet dit project? BookScraper bestaat uit drie belangrijke onderdelen: --- ## 1. 🧠 BookScraper Engine (Python) Dit is de kern van het project. De engine: - Leest basisinformatie van een boek (titel, auteur, cover) - Zoekt alle chapter-links - Downloadt elk chapter met: - **Retry systeem** - **Anti-429 backoff** (wacht: `backoff * attempt + 1 seconde`) - Detectie van lege chapters β†’ automatisch opnieuw proberen - Past tekstreplacements toe (via `replacements.txt`) - Slaat chapters geordend op - Splits lange boeken automatisch in volumes (`v1/`, `v2/`, `v3/`…) De engine is **bestand tegen rate limiting** van Piaotian en soortgelijke sites en werkt met een **throttle (MAX_DOWNLOADS_PER_SEC)** om blokkades te voorkomen. --- ## 2. 🌐 Flask Webinterface (UI) De webinterface biedt: - Een invoerveld voor de boek-URL - Een knop: **Run Scraper** - Live feedback via **server-sent events (SSE)** Tijdens het scrapen zie je realtime updates verschijnen, zoals: [DEBUG] GET chapter 1123 [DEBUG] HTTP 429 β†’ retry sleep 4.0s [DEBUG] Saved chapter: output/xxx/01123\_章名.txt Hierdoor voelt het alsof de scraper β€œlive” aan het werk is. --- ## 3. πŸ“‘ Live Logging (SSE) De Logger vangt alle BookScraper-meldingen op en streamt ze via `/stream` naar de webinterface. Dit maakt het ideaal om scraping in de gaten te houden zonder console. --- ## 4. πŸ”§ Configuratie via `.env` Om het project flexibel te houden wordt alles ingesteld via `.env`: - Throttle (`MAX_DOWNLOADS_PER_SEC`) - Debugmode (`FLASK_DEBUG`) - DRY_RUN (alleen eerste chapters) - Volume size - Host & Port De `.env` wordt automatisch geladen door Docker Compose en door Flask. --- # πŸ“¦ Projectstructuur bookscraper/ β”‚ β”œβ”€β”€ scraper/ β”‚ β”œβ”€β”€ book_scraper.py # De scraper engine β”‚ β”œβ”€β”€ logger.py # SSE logger β”‚ β”œβ”€β”€ sites.py # Site configuratie (selectors etc.) β”‚ β”œβ”€β”€ utils.py # Helpers β”‚ └── ... β”‚ β”œβ”€β”€ templates/ β”‚ └── index.html # UI β”‚ β”œβ”€β”€ output/ # Book results β”‚ β”œβ”€β”€ app.py # Flask webserver + endpoints β”œβ”€β”€ replacements.txt # Tekstvervangers β”œβ”€β”€ Dockerfile β”œβ”€β”€ docker-compose.yml β”œβ”€β”€ requirements.txt └── .env --- # ▢️ Project handmatig starten (ZONDER Docker) Zorg dat dependencies geΓ―nstalleerd zijn: ```bash pip install -r requirements.txt Start de Flask server: python app.py Open daarna: πŸ‘‰ http://localhost:5000 Docker Build (zonder compose) Manueel builden: docker build -t bookscraper . docker run -p 5000:5000 --env-file .env bookscraper docker run \ -p 5000:5000 \ --env-file .env \ -v $(pwd)/output:/app/output \ bookscraper ``` docker compose down --remove-orphans docker image prune -f docker builder prune -af docker volume prune -f docker compose build --no-cache docker compose up docker compose down docker compose build docker compose up docker compose up -d docker compose build --no-cache web && docker compose up web docker compose build worker_download && docker compose up worker_download docker compose down --remove-orphans docker compose build --no-cache worker_m4b docker compose up -d worker_m4b docker compose up web docker compose build web docker compose restart web tar \ --exclude="**pycache**" \ --exclude="_/**pycache**/_" \ --exclude="\*.pyc" \ --exclude=".venv" \ --exclude="venv" \ -czvf project.tar.gz . docker compose down docker image rm bookscraper-worker_m4b || true docker builder prune -af docker compose build --no-cache worker_m4b docker compose up -d worker_m4b