Mein Script gibt die 3 preiswertesten Handy-Abos der Schweiz aus, wobei man unlimitierte Daten und unlimitierte Telefonie bekommt.
Gecurlt wird: "https://www.comparis.ch/telecom/mobile/angebote/flatrate-abo".
# 🛠️ Tech Stack
- 🔥 Containerized
- 🧠 JSON Output
Anfangs habe ich mich informiert was curl überhaupt macht. Es ist eigentlich wie ein GET-Request, was Dir die antwort des Browsers zurückgibt. Im Best-Case (dazu komme ich leider noch😫) erhält man als Antwort das HTML der gecurlten Webseite.
Ich wollte anfangs Digitec scrapen, was aber viel zu aufwändig geworden wäre, da es wie eine Babushka aufgebaut ist. Anschliessend habe ich mich für Comparis entschieden, da es in meinem Interesse war (Mein jetziges Abo ist 70.-🤠).
Mit Hilfe des Dev-Tools (fn+f12) in Chrome habe ich herausgefunden, dass alle relevanten Informationen im Response-HTML enthalten waren.
Alles was ich wissen wollte (Anbieter, Preis, Netz, Aboname) hatte je die gleiche CSS-Klasse davor.
GREP kam da sehr clutch. Mit GREP und ein bisschen Regexen konnte ich die Werte herausfiltern und je in einem separaten Array speichern.Ich hatte einfach ein kleines Problem. Die ersten zwei Erwähnungen der jeweiligen CSS-Klassen waren Styling-Definitionen, welche ich natürlich nicht gebraucht habe. Dieses Problem konnte ich mit TAIL umgehen. Mit TAIL konnte ich die ersten zwei Erwähnungen ignorieren.
Mit einem foreach konnte ich dann das Array entsprechend ausgeben. Da der stout farbig sein sollte, habe ich sogenannte ANSI-Codes verwendet. Jetzt musste ich nur noch die JSON-Output-Funktion erstellen. Ich habe mir zuerst überlegt (ChatGPT), ob man dafür eine Library verwenden soll. Es gab coole Lösungen, aber ich hatte ja noch ein anstehendes Dockerfile, was kompakt sein sollte. Da mein Script erst ca. 20 Zeilen gross war, habe ich mich entschieden, das Parsing Hard-Zu-Coden, was mich von allem wahrscheinlich am wenigsten Zeit gekostet hat.
Ich hatte noch eine Shell-Check-Warnung, weil ich ganz normal über eine for-Loop das Array ausgelesen habe und ausgeben wollte. Anscheinend kann es zu Problemen kommen, wenn in einem Array-Eintrag Leerzeichen oder Umbrüche beinhaltet und mapfile löst diese Probleme für mich. Ich weiss leider nicht wie es die Einträge im Detail ausliest, dass es nicht zu Konflikten kommt.
Wir haben im Unterricht schon ein Mal ein kleines Dockerfile gebaut. Ich wusste also ungefähr was ich brauche. Ich habe beim Dockerfile viel mit KI gearbeitet. Als Erstes habe ich mein gesamtes Script als Prompt mitgegeben und gesagt, dass es mir damit ein Dockerfile machen soll. Dann habe ich es ausgeführt und es hat funktioniert.
Der nächste Schritt war, das Dockerfile den Anforderungen entsprechend zu machen. Ich habe curl noch nicht selber kompiliert. Das war wahrscheinlich das Schwierigste. Zum Glück haben wir es in der letzten Lektion vor der Abgabe angeschaut. Wir haben es mit make machen. Make macht grob gesagt das Heruntergeladene in deiner Umgebung ausführbar. Es verschiebt zum Beispiel die Abhängigkeiten in den nötigen Folder, oder es kompiliert Dateien, sodass es von der Unix Umgebung verstanden werden kann. Solche Dinge halt. Die Anweisungen liest make aus einem sogenanntem Make-File.
Als letzten Schritt habe ich das Dockerfile komprimiert. Ich habe wieder ChatGPT gefragt, ob er mir das File nur mit den nötigsten Abhängigkeiten machen könnte und habe es laufen lassen. Es gab wieder keine Fehlermeldungen, ausser das irgendwie die Zeilenumbrüche als Windows-Zeilenumbrüche gelesen werden und es diese einfach in Unix-Umbrüche überschreiben wird. Da ich aber einen cleanen Output haben wollte, habe ich mit dos2unix dieses Problem gelöst. Da es spät wurde und mein Gehirn nicht mehr sehr fit war, habe ich angefangen einfach Abhängigkeit für Abhängigkeit zu entfernen und zu schauen, ob es Fehler gibt. Best-Practice😎. Nein ich habe natürlich schon nachgelesen was all diese Pakete machen und bei weniger nötigen habe ich eben diese Methode angewendet.
Die Pipeline habe ich kurz mit einem Tuorial von GitHub gemacht. Es macht wirklich das Minimum vom Minimum, also effizient😄. Viel Zeit habe ich nicht investiert und ich verstehe den Sinn der Pipeline noch nicht so ganz. Ich kann mir den useCase nicht so gut vorstellen.
Ich hatte in der letzten Woche vor der Abgabe ein grosses Problem. Aus irgendeinem Grund hat mein Script keine Werte mehr zurückgegeben. Zuerst habe ich auf der Seite nachgeschaut, ob sich das Response-HTML geändert hat, jedoch ist das gleich geblieben. Dann habe ich einen ganz normalen curl-Request gemacht und der Response war überhaupt nicht wie vorher. Es gab mir manchmal ein einfaches HTML zurück, oder dann irgendwelche Infos über die Geschwindigkeit und Dauer meines Requests.
Dann habe ich mir überlegt, ob es vielleicht etwas wie ein Request-Limit gab, oder mir die nötige Authentifizierung fehlte, aber der Response war immer erfolgreich. Anschliessend habe ich mein curl mit einem Request-Header verschickt und die Antwort war gleich. Ich habe dann im Internet gelesen, dass die meisten Scraper-Webseiten so Bots haben, welche verhindern, dass andere sie scrapen können. Es macht schon Sinn, da Comparis selbst ja auch ein Scraper ist und ich dann ganz einfach von ihrer arbeit profitieren könnte, ohne einen Finger zu rühren. Schade ist nur, dass es 1 Woche vor der abgabe passieren musste.
Eine andere Erklärung habe ich leider nicht. Vielleicht liegt es an mir.
![]()
- Output Issue fixen

