Ein Python-Skript zur automatisierten Abfrage und Speicherung von Musiktiteln aus den öffentlich zugänglichen Playlists der NDR-Radiosender. Die Daten werden in einer PostgreSQL-Datenbank gespeichert, ausgewertet und bei Bedarf analysiert.
Dieses Projekt liest öffentlich sichtbare Playlists von verschiedenen NDR-Radiosendern automatisiert aus – ganz klassisch per Webscraping.
Die Daten stammen aus frei zugänglichen Webseiten und sind für alle Internetnutzer sichtbar. Es handelt sich dabei nicht um eine offizielle Open-Data-Schnittstelle, aber die Inhalte lassen sich gut weiterverarbeiten – z. B. zur Auswertung oder Archivierung.
Ziel ist es, aus öffentlich zugänglichen Infos strukturierte Daten zu machen – für eigene Analysen, für Musikinteressierte oder einfach aus Neugier.
Dabei wird bewusst ressourcenschonend gearbeitet:
Kein wildes Crawling, sondern gezielter Abruf einzelner Seiten – einmal täglich.
- ⏱ Automatisierter Tagesabruf der Playlists
- 📥 Speicherung in PostgreSQL (TimescaleDB kompatibel)
- 📊 Eigene Analyse-Skripte (z. B. Top-Interpreten, Anomalien, etc.)
- 🛠 Konfigurierbar über
config/config.json
- ⚙️ Optional gesteuert über
systemd.timer
- 🧪 HTML-Scraping mit
BeautifulSoup
- Python ≥ 3.8
- PostgreSQL (z. B. als Docker-Container)
- Empfohlene Pakete (siehe
requirements.txt
)
Installiere mit:
sudo apt install python3-aiohttp python3-requests python3-psycopg2 python3-bs4
Oder via Pip:
pip install -r requirements.txt
NDR-scraper-postgresql/
├── abfrage.py # Interaktive Auswahl-Abfrage
├── abfrage_auto.py # Automatisierte Version (für systemd)
├── stations.csv # Liste der NDR-Sender + URLs
├── requirements.txt # Python-Abhängigkeiten
├── config/
│ └── config.json # Zugangsdaten für PostgreSQL
├── functions/
│ ├── fetch_data.py
│ ├── postgresql.py
│ └── scrape_playlist.py
└── scripts/
├── top_artists.py
├── evaluate_day.py
├── check_anomalies.py
In config/config.json
:
{
"pg_host": "192.168.178.100",
"pg_port": 5432,
"pg_user": "admin",
"pg_password": "admin",
"pg_db": "playlist",
"num_days": 3,
"max_parallel_requests": 10
}
CREATE TABLE ndr_playlist (
checksum TEXT NOT NULL,
station TEXT,
artist TEXT,
title TEXT,
played_date DATE,
played_time TIME,
played_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (checksum, played_at)
);
-- Optional: TimescaleDB aktivieren
CREATE EXTENSION IF NOT EXISTS timescaledb;
SELECT create_hypertable('ndr_playlist', 'played_at', if_not_exists => TRUE);
[Unit]
Description=NDR Scraper Abfrage – einmal täglich
After=network.target
[Service]
Type=oneshot
User=pi
WorkingDirectory=/home/pi/NDR-scraper-postgresql
ExecStart=/usr/bin/python3 /home/pi/NDR-scraper-postgresql/abfrage_auto.py
[Unit]
Description=Täglicher Abruf der NDR-Playlisten
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now ndr-abfrage.timer
top_artists.py
: Top 3 Interpreten der letzten 30 Tage je Senderevaluate_day.py
: Analyse auffälliger Tage (z. B. Duplikate)check_anomalies.py
: Erkennung von ungewöhnlich vielen Einträgen pro Tag
📻 N-Joy:
1. Nina Chuba (147 Plays)
2. Myles Smith (125 Plays)
3. Linkin Park (120 Plays)
📻 NDR 2:
1. Ed Sheeran (82 Plays)
2. Linkin Park (77 Plays)
3. Benson Boone (72 Plays)
Dieses Projekt wurde inspiriert durch den Vortrag „RadioMining – Playlist-Scraping und Analyse“ von Stefan Magerstedt beim 38C3. Die Präsentation bietet einen tiefen Einblick in die Analyse von Radiosender-Playlists.
@kajoty
MIT License
Dieses Projekt wurde mit Unterstützung von ChatGPT erstellt.
Pull Requests, Issues oder Wünsche sind jederzeit willkommen! ✨