3.5 KiB
📚 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:
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 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 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 .