Zum Inhalt

Beispielarbeiten · Daten & Scraping

Datenextraktion: 40 Betriebe aus einem Online-Verzeichnis in eine saubere Tabelle

Name, Ort, Telefon, Website und Öffnungszeiten von 40 Kfz-Werkstätten, aus einem Verzeichnis gelesen, bereinigt und geprüft. Mit Code, Prüfregeln und der fertigen Datei.

Beispielarbeit, kein Kundenauftrag. Der Betrieb und alle Zahlen sind erfunden, damit du siehst, wie die Arbeit aussieht, bevor du etwas in Auftrag gibst.

Was geliefert wird

  • CSV-Datei mit 40 Einträgen: Name, Ort, Telefon, Website, Öffnungszeiten (Excel öffnet sie direkt)
  • Bereinigt: Telefonnummern einheitlich, Leerzeichen und Zeilenumbrüche entfernt
  • Geprüft: keine Dubletten (Name und Ort), keine leeren Pflichtfelder
  • Das Skript dazu, damit die Liste später selbst aktualisiert werden kann

CSV-Datei herunterladen

Die ersten sechs Zeilen

NameOrtTelefonÖffnungszeiten
Reifen BauerKlagenfurt+43 597 817838Mo-Fr 8:00-18:00
Kfz BauerLinz+43 578 641821Mo-Fr 8:00-18:00
Kfz WagnerKlagenfurt+43 513 602643Mo-Fr 8:00-18:00
Reifen HuberKlagenfurt+43 330 996445Mo-Do 7:00-16:30, Fr 7:00-12:00
Kfz LeitnerVillach+43 676 627415Mo-Fr 7:30-17:00
Kfz HoferKlagenfurt+43 304 515884Mo-Fr 8:00-18:00

So wird gelesen

Erst wird geprüft, ob die Seite den Abruf in ihrer robots.txt erlaubt. Gelesen wird langsam, eine Seite alle drei Sekunden, damit der Betreiber nicht belastet wird. Persönliche Daten von Privatpersonen werden nicht gesammelt.

import time, requests
from urllib import robotparser
from bs4 import BeautifulSoup

BASIS = "https://verzeichnis.example/kfz-werkstaetten?seite={}"

def erlaubt(url):
    rp = robotparser.RobotFileParser("https://verzeichnis.example/robots.txt"); rp.read()
    return rp.can_fetch("GLTools-Datenabruf", url)

def lesen(seiten=4):
    zeilen = []
    for n in range(1, seiten + 1):
        url = BASIS.format(n)
        if not erlaubt(url):
            raise SystemExit("robots.txt verbietet den Abruf - hier wird nicht weitergemacht")
        html = requests.get(url, headers={"User-Agent": "GLTools-Datenabruf"}, timeout=30).text
        for karte in BeautifulSoup(html, "html.parser").select(".eintrag"):
            zeilen.append({
                "name": karte.select_one(".name").get_text(strip=True),
                "ort": karte.select_one(".ort").get_text(strip=True),
                "telefon": karte.select_one(".tel").get_text(strip=True),
            })
        time.sleep(3)          # langsam lesen: eine Seite alle 3 Sekunden
    return zeilen

So etwas für deinen Betrieb?

Beschreib kurz, was du brauchst. Du bekommst einen Festpreis, bevor ich anfange; ohne dein Ja passiert nichts.

Zur Werkstatt