You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.2 KiB
145 lines
3.2 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:
|
|
|
|
```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
|
|
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
|
|
|
|
tar \
|
|
--exclude="**pycache**" \
|
|
--exclude="_/**pycache**/_" \
|
|
--exclude="\*.pyc" \
|
|
--exclude=".venv" \
|
|
--exclude="venv" \
|
|
-czvf project.tar.gz .
|