Dieses Projekt besteht aus zwei Python-Skripten:
example_scraper.py: Extrahiert Speisekartendaten (Kategorien, Gerichte, Preise, Beschreibungen, Allergene) von einer Beispiel-Restaurant-Webseite und speichert sie in einer CSV-Datei (example_menu_data.csv).example_uploader.py: Liest die Daten aus derexample_menu_data.csvund lädt sie automatisiert in ein Admin-Panel zur Speisekarteneingabe hoch.
Dieses Skript verwendet Selenium, um Daten von einer Webseite zu extrahieren.
- Python 3.x
- pip (Python Package Installer)
- Google Chrome Browser
- ChromeDriver (muss mit der installierten Chrome-Version kompatibel sein)
-
Selenium installieren:
pip3 install selenium
-
ChromeDriver installieren:
- macOS (mit Homebrew):
brew install chromedriver
- Andere Betriebssysteme: Lade den passenden ChromeDriver von https://chromedriver.chromium.org/downloads herunter und stelle sicher, dass er sich im System-PATH befindet oder gib den Pfad im Skript an.
- macOS (mit Homebrew):
-
Ziel-URL ändern: Öffne
example_scraper.pyund ändere die Variableurl(Zeile 19) zur URL der Restaurant-Webseite, von der du Daten extrahieren möchtest:url = "https://www.deine-restaurant-webseite.com/speisekarte"
-
Selektoren (XPATHs) anpassen: Die Webseitenstruktur jeder Restaurantseite ist anders. Daher musst du wahrscheinlich die XPATH-Selektoren im Skript anpassen, um die richtigen Elemente zu finden. Verwende die Entwicklertools deines Browsers (Rechtsklick -> Untersuchen), um die HTML-Struktur zu analysieren und die passenden XPATHs zu finden für:
- Cookie-Banner-Button (Zeile 26-29): Oft notwendig, um mit der Seite interagieren zu können.
- Kategorie-Container (Zeile 41): Das Element, das jede Speisekategorie umschließt.
- Kategoriename (Zeile 52): Das Element innerhalb eines Kategorie-Containers, das den Namen der Kategorie enthält (oft ein
<h2>oder ähnliches). - Produkt-Container (Zeile 59): Das Element, das alle Gerichte einer Kategorie umschließt.
- Gerichte-Elemente (Zeile 65): Die einzelnen Elemente für jedes Gericht.
- Gerichtsname (Zeile 72):
producttitle - Gerichtsbeschreibung (Zeile 77):
productdesc - Gerichtspreis (Zeile 85):
productprice - Allergene (Zeile 90):
allergene
Passe die
By.XPATHWerte entsprechend an. Beispiel:category_containers = driver.find_elements(By.XPATH, "//div[contains(@class, 'menu-category')]") # ... und so weiter für andere Selektoren
-
Wartezeiten (Optional): Abhängig von der Ladegeschwindigkeit der Webseite müssen eventuell
time.sleep()Werte angepasst werden, um sicherzustellen, dass Inhalte geladen sind, bevor das Skript versucht, darauf zuzugreifen.
Führe das Skript über dein Terminal aus:
python3 example_scraper.pyDas Skript gibt den Fortschritt im Terminal aus und erstellt am Ende die Datei example_menu_data.csv im selben Verzeichnis.
example_menu_data.csv: Eine CSV-Datei mit den Spalten:Kategorie,Name,Beschreibung,Preis,Allergene.
Dieses Skript verwendet Selenium, um sich mit einer bestehenden Chrome-Browsersitzung zu verbinden und die in example_menu_data.csv gespeicherten Gerichte automatisiert in ein Web-Formular (z.B. ein Admin-Panel für Restaurants) einzutragen.
- Python 3.x
- pip (Python Package Installer)
- Google Chrome Browser
- ChromeDriver (muss mit der installierten Chrome-Version kompatibel sein und für Selenium erreichbar sein)
- Die Datei
example_menu_data.csv(generiert durchexample_scraper.pyoder manuell erstellt mit passender Struktur).
-
Chrome im Debugging-Modus starten: Damit Selenium eine bestehende Browsersitzung steuern kann, muss Chrome mit einem offenen Debugging-Port gestartet werden. Schließe alle laufenden Chrome-Instanzen und starte Chrome über das Terminal:
- macOS:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 - Windows:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 # (Passe den Pfad ggf. an deine Chrome-Installation an)
- Linux:
bash google-chrome --remote-debugging-port=9222Ein neues Chrome-Fenster öffnet sich. Lasse dieses Terminalfenster und den Chrome-Browser während der Ausführung des Skripts geöffnet.
- macOS:
-
Manuelle Vorbereitung im Browser:
- Logge dich in diesem Chrome-Fenster manuell in dein Admin-Panel ein.
- Navigiere zu der Seite, auf der du neue Gerichte hinzufügen kannst.
- WICHTIG: Wähle die Speise-Kategorie aus, für die du Gerichte hochladen möchtest. Das Skript wird dich nach dem Namen dieser Kategorie fragen, um die entsprechenden Gerichte aus der CSV zu filtern.
-
CSV-Dateipfad (falls nötig): Die Variable
CSV_FILE_PATHinexample_uploader.pyist standardmäßig aufexample_menu_data.csvgesetzt. Ändere dies, falls deine CSV-Datei anders heißt oder woanders liegt. -
Selektoren für das Admin-Panel (SEHR WICHTIG): Dies ist der kritischste Teil der Anpassung. Du musst die CSS-Selektoren oder XPATHs für die Formularfelder und Buttons in deinem Admin-Panel genau identifizieren und im Skript eintragen. Verwende die Entwicklertools deines Browsers (Rechtsklick -> Untersuchen). Ändere die folgenden Variablen am Anfang von
example_uploader.py:ADD_NEW_DISH_BUTTON_SELECTOR: Selektor für den Button "Neues Gericht hinzufügen" (oder ähnlich). Achtung: Der aktuelle Beispiel-Selektor(By.ID, "1")ist sehr generisch und muss wahrscheinlich angepasst werden!DISH_NAME_INPUT_SELECTOR: Selektor für das Eingabefeld des Gerichtsnamens.DISH_PRICE_INPUT_SELECTOR: Selektor für das Eingabefeld des Preises.DISH_DESCRIPTION_INPUT_SELECTOR: Selektor für das Eingabefeld der Beschreibung.DISH_TAX_INPUT_SELECTOR: Selektor für das Eingabefeld des Steuersatzes.DISH_ALLERGENS_INPUT_SELECTOR: Selektor für das Eingabefeld der Allergene.SAVE_DISH_BUTTON_SELECTOR: Selektor für den Speicher-Button des Formulars.
Beispiel für spezifischere Selektoren (oft IDs oder eindeutige Klassen/Attribute):
ADD_NEW_DISH_BUTTON_SELECTOR = (By.XPATH, "//button[contains(text(), 'Neues Gericht erstellen')]") DISH_NAME_INPUT_SELECTOR = (By.ID, "dishNameField") # ... usw.
Tipp: IDs sind meist die zuverlässigsten Selektoren. Wenn es keine IDs gibt, verwende spezifische Klassen-Kombinationen oder XPATHs.
-
Anpassung der Wartezeiten (Geschwindigkeit): Am Anfang des Skripts findest du Variablen für Wartezeiten:
SHORT_WAIT(Standard: 0.5 Sekunden): Kurze Pause nach dem Ausfüllen einzelner Felder.MEDIUM_WAIT(Standard: 3 Sekunden): Längere Pause am Anfang und nach Fehlern.LONG_WAIT(Standard: 3 Sekunden): Pause nach dem Klick auf "Speichern", um der Seite Zeit zu geben, zu reagieren (z.B. ein Modal zu schließen oder die Liste zu aktualisieren).WebDriverWait(driver, 10): Der generelle Timeout für explizite Waits (z.B. Warten auf Klickbarkeit eines Elements). Erhöhe diesen Wert (z.B. auf20), wenn deine Admin-Seite langsam lädt.
Reduziere die
SHORT_WAITundLONG_WAITZeiten, um das Skript zu beschleunigen, aber sei vorsichtig: Zu kurze Wartezeiten können zu Fehlern führen, wenn die Seite noch nicht bereit für die nächste Aktion ist. Erhöhe sie, wenn das Skript zu schnell für die Webseite ist.
- Stelle sicher, dass Chrome im Debugging-Modus läuft und du im Admin-Panel auf der richtigen Seite/Kategorie bist.
- Führe das Skript über dein Terminal aus:
python3 example_uploader.py
- Das Skript fragt dich nach dem genauen Namen der Kategorie, die du im Browser geöffnet hast (Groß-/Kleinschreibung wie in der CSV-Datei). Gib den Namen ein und drücke Enter.
- Das Skript beginnt dann, die Gerichte für diese Kategorie nacheinander einzutragen.
ElementClickInterceptedException: Dieser Fehler tritt häufig auf, wenn ein anderes Element (z.B. ein Popup, ein Overlay oder ein sich langsam schließendes Modal nach dem Speichern) den Klick auf den Ziel-Button blockiert.- Lösung: Erhöhe
LONG_WAITnach dem Speichern. Überprüfe, ob es Modals gibt, die explizit geschlossen werden müssen (ggf. durch einen weiteren Klick oder das Senden derESC-Taste – dieKeys-Klasse ist im Skript auskommentiert, kann aber importiert und verwendet werden). Manchmal hilft auch ein JavaScript-Klick, der im Skript als Fallback implementiert ist.
- Lösung: Erhöhe
- Falsche Selektoren: Wenn das Skript Elemente nicht findet oder mit den falschen interagiert, sind die Selektoren in
example_uploader.pynicht korrekt. Überprüfe sie sorgfältig mit den Entwicklertools. - Stabilität: Die Automatisierung von Webseiten-Interaktionen kann fehleranfällig sein, besonders wenn sich die Struktur der Webseite ändert.
- Verantwortung: Nutze diese Skripte verantwortungsbewusst und beachte die Nutzungsbedingungen der Webseiten.
Die .gitignore-Datei ist so konfiguriert, dass *.csv-Dateien (also auch example_menu_data.csv und die ursprüngliche hanil_speisekarte.csv) sowie .DS_Store-Dateien (macOS) nicht in Git-Repositories aufgenommen werden.