Nicht begnügen
So soll eines meiner Bilder für meine Bewerbung bei KalkKunst 2025 heißen. Nicht begnügen ist als süffisantes Grinsen in Richtung Köln-Ausgabe des Stadtmagazins Mit Vergnügen zu verstehen, in der rechtsrheinische Orte und Geschichten unverhältnismäßig unterrepräsentiert sind! Wo sonst sollte man sowas künstlerisch beackern, wenn nicht bei einem Kunstwettbewerb mit dem Thema „Kalktopia – Zukunft gemeinsam gestalten“!?
Dass die Schäl Sick in der medialen Darstellung und Wahrnehmung generell selten gut wegkommt bzw. ihre Erfolgsgeschichten und liebenswerten Einrichtungen auf der anderen Seite des Rheins oft sträflich missachtet werden, ist erst einmal nur eine Arbeitshypothese. Ich werde hier keine wasserdichte Beweisführung liefern und habe auch kein Interesse an künstlich hochstilisiertem Aufwiegeln wegen unnötiger Verallgemeinerung. Aber herauszufinden, wie oft genau jetzt links- und rechtsrheinische Freizeit-Tipps auf Mit Vergnügen veröffentlicht werden … das versprach ein guter Ausgangspunkt für mein Bild zu sein.
Dafür muste ich einen kleinen Crawler programmieren, der automatisiert alle Seiten von Mit Vergnügen ansteuert, die GPS-Koordinaten aller besprochenen Locations und Ausgeh-Tipps erfasst und diese in einer passenden Datenform ablegt, mit der sich angenehm weiterarbeiten lässt. Scrapy war mir bei diesem Vorhaben eine große Hilfe und erledigte den Großteil der typischen Teilaufgaben der Datenextraktion.
- Die mit Scrapy mitgelieferte Klasse
CrawlSpider
bietet einen bequemen Mechanismus um Links nach bestimmten Regeln basierend auf regulären Ausdrücken zu folgen. Die Regel.*
erlaubt mir also, jede von der Homepage aus erreichbare Seite zu besuchen und damit wahrscheinlich den größten Teil der Webseite zu erfassen. Sehr praktisch: Doppelte URLs ignoriert Scrapy automatisch. - Das Auslesen von HTML-Elementen erfolgt mit CSS- bzw. XPath-Selektoren. Kein
BeautifulSoup
nötig! Da Mit Vergnügen alle Orte einer Seite auf einer interaktiven Karte darstellt, mussten die GPS-Daten irgendwo im Code der Webseite zu finden sein. Und tatsächlich beinhaltet das:markers
Attribut des<map>
Elements alle Daten, die ich brauche. - Einzelne Datensätze nennt Scrapy items, deren Felder von mir bestimmt werden können. Dank Scrapys item pipelines kann man das Auffinden und die Verarbeitung der Daten entkoppeln. Ein item ist in meinem Fall ein Ort mit ID, URL, Name, Adresse, Breiten-/Längengrad und Herkunfts-URL. Diese Informationen lassen sich schnell und einfach aus dem HTML-Code ziehen. In einem weiteren Verarbeitungsschritt entnehme ich der URL außerdem noch das Jahr der Berichterstattung, ziehe aus der Adresse die Postleitzahl oder ermittle diese, falls in der Adresse nicht vorhanden, durch reverse geocoding mit Nominatim via Geopy. Ist die PLZ nicht in Köln, kann ich Datensätze durch das Werfen einer
DropItem
exception entfernen. Um einen Ort als rechts- oder linksrheinisch zu klassifizieren, reicht es jetzt zu überprüfen, ob die PLZ mit 51 startet oder 50679 (Deutz) ist (rechtsrheinisch), oder nicht (linksrheinisch). - Mit der Option
-O
lässt Scrapy mich die Daten zum Beispiel in einer CSV-Datei ablegen.
Scrapy bietet noch weitaus mehr als hier vorgestellt, z.B. Logging, ordentliches Queuing der zu bearbeitenden URLs, umfangreiche Request
/Response
Objekte. Ich wollte den Crawler erst komplett von Hand schreiben, aber Scrapy ist einfach zu verlockend. Ein erster Run produzierte 6439 Datensätze (mit Duplikaten) in 100 Sekunden. Die erweiterte Datenverarbeitung (v.a. der Nominatim-Lookup) verlangsamte den Crawler schlussendlich auf 228 Sekunden und lieferte 2485 von Dubletten bereinigte und mit PLZ versehene Datensätze.
Ergebnis: Das rechtsrheinische Köln macht mit seinen 404.825 Einwohnern ca. 36,9% von Köln aus (entnommen aus dem Statistischen Jahrbuch Köln, Stand 31.12.2024). Dem gegenüber stehen aber nur 319 von 2485 auf Mit Vergnügen empfohlene Locations und damit ein meine Hypothese stützender Prozentsatz von 12,8. Die Hotspots in Deutz (82 Locations), Mülheim (69 Locations) und Kalk (49 Locations) belegen im gesamtkölschen Ranking gerade mal die Plätze 13–15.
Und damit sollten wir uns vielleicht … Nicht begnügen 😏 Der erste Schritt ist getan, jetzt geht es an den Pen Plotter.