• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

Spritpreise auslesen und anzeigen mit Geektool

Denny15

Ribston Pepping
Registriert
14.11.10
Beiträge
296
Hallo Leute,;)


Ich habe eine kleine Frage... Ich würde mir ganz gerne die Spritpreise meiner Stammtankstelle auf dem Desktop anzeigen lassen mit Geektool.


Versuche mit einem umgebauten Wetterscript führten leider nicht zum gewünschten Ergebnis :-x...

Auslesen würde ich ganz gerne auf dieser Seite- mit dem Vorteil dass die Tankstelle die Preise selbst meldet- heißt also fast immer richtige und aktuelle Preise.

http://www.clever-tanken.de/showtan...ing+Bensheim&secureid=22175&typ=&ort=Bensheim

Als Besipiel wäre Diesel gut, ausgabeseitig sollte (bspw) einfach nur die Zahl "1,539" rauskommen. Ohne den Zusatz 0,9ct (unaufgerundet, im Beispiel also "1,53") wäre noch besser. Den Rest kann ich mir dann selbst erstellen denke ich (Ich möchte alle Preise angezeigt bekommen, für jede Spritsorte ein Script).

Vielen Dank schonmal!!!;)
 
Zuletzt bearbeitet:

mintracer

Weigelts Zinszahler (Rotfranch)
Registriert
23.02.12
Beiträge
246
vielleicht ein Ansatz... :)

curl --silent "http://www.clever-tanken.de/showtank_payed.asp?Tankstelle=HEM+Berliner+Ring+Bensheim&secureid=22175&typ=&ort=Bensheim" | grep -E '(<font class="partnerhead">Diesel:</td>)' -A 16 | sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
 

Denny15

Ribston Pepping
Registriert
14.11.10
Beiträge
296
Hey ;) Vielen Dank!!! Scheint zu funktionieren. Werde mich dann mal bei Zeit am Rest versuchen. Mal schauen ob es stabil läuft! Danke schonmal
 

mintracer

Weigelts Zinszahler (Rotfranch)
Registriert
23.02.12
Beiträge
246
Also bei mir läuft das sehr gut... in Verbindung mit einer Tankstellen-Preistafel als Hintergrund und der richtigen Schrift schauts schon sehr gut aus! :)
Übrigens hat Google alles nötige dafür ausgespuckt... :)
 

mintracer

Weigelts Zinszahler (Rotfranch)
Registriert
23.02.12
Beiträge
246
Also kurz erläutert...

als Grundlage nehme ich nun mal diese URL:

Code:
curl --silent "http://www.clever-tanken.de/showtank_payed.asp?Tankstelle=Tanken+%26+Mehr+D%FCsseldorfer+Str%2E+Duisburg&secureid=14466&typ=&ort=Duisburg" | grep -E '(<font class="partnerhead">Super)' -A 2 | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed 2q | sed -e 's/(Schutzsorte)//' | sed "s/ //g" | sed 's/Super://g' | sed 's/9//g' | sed 'N;s/\n//'

So was passiert nun:

Als erstes wird die komplette Webseite dessen URL wir angeben als Quelltext eingelesen, dies geht mit dem Befehl "curl"

Code:
curl --silent "http://www.clever-tanken.de/showtank_payed.asp?Tankstelle=Tanken+%26+Mehr+D%FCsseldorfer+Str%2E+Duisburg&secureid=14466&typ=&ort=Duisburg"

die Option "--silent" sorgt dafür das wir nicht die eingelesenen Daten als Ausgabe sehen...

nun kommt das wichtigste Zeichen!

das sogenannte "Pipe" | (ALT + 7)

Dieses Zeichen ist als "Datenträger" anzusehen, es überträgt die Daten von einem Befehl zum anderen Befehl...

Optisch als solches vorzustellen

Code:
Befehl1 -> Eingabe -> Verarbeitung -> Ausgabe1 | Befehl2 -> Eingabe1 -> Verarbeitung -> Ausgabe2  | usw.

in unserem Geeklet-Code "pipen" wir den Quelltext an den Befehl "grep"

mit dem Befehl grep, kann man in den übergebenen Daten suchen (ich merke es mir, in dem ich sage "grab" = "grep")

Code:
grep -E '(<font class="partnerhead">Super)' -A 2

wir suchen nun einen Teil der so selten vorkommt wie nur möglich, so ersparen wir uns weitere Arbeit... in unserem Fall wäre das "(<font class="partnerhead">Super"

der Schalter -E sagt grep das es sich um ein "Suchwort" handelt. würde man den Schalter -f nehmen, so müsste man eine Datei angeben...

an dem grep-Befehl steht am Ende noch ein -A 2, damit wird gesagt, das man ab dem gefunden "Suchwort" noch gern 2 Folgezeilen mit Ausgeben möchte

Ausgabe:
Code:
  <td bgcolor="#E5ECF0"><font class="partnerhead">Super (Schutzsorte):</td>  <TD bgcolor="#BBCCD7"><font class="partnerhead">1,669</TD>
 </TR>
--
  <td bgcolor="#E5ECF0"><font class="partnerhead">SuperPlus:</td>
  <TD bgcolor="#BBCCD7"><font class="partnerhead">1,739</TD>
 </TR>

nun kommt der spannende Teil... sed

mit sed kann man mit Hilfe von RegEx Parametern Datensätze komplett Löschen/Beschneiden/Ändern

das erste sed Kommando entfernt in unserem Beispiel alle HTML Tags sodass nur noch "lesbarer" Text über bleibt.

Code:
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
(genaue Erklärung kann ich so adhoc nicht dazu geben, da ich mich mit RegEx noch nicht so auskenne...)

Ausgabe:
Code:
  Super (Schutzsorte):  1,669
 
--
  SuperPlus:
  1,739

der 2. sed Befehl

Code:
sed 2q

dieser gibt uns nun nur die ersten beiden Zeilen aus und beendet dann die Ausgabe mit "q" für quit und löscht den Rest

Ausgabe:
Code:
 Super (Schutzsorte):
  1,669

der 3. sed Befehl

Code:
sed -e 's/(Schutzsorte)//'

löscht in unserem Fall das Wort "Schutzsorte" und ersetzt es mit nichts... "sed -e 's/suchwort/neues Wort/'"

Ausgabe:
Code:
 Super :
  1,669
der 4. sed Befehl

Code:
sed "s/ //g"

sorgt dafür das alle Leerzeichen entfernt werden... das g am Ende sorgt dafür das "ALLE" Leerzeichen mit genommen werden, das g nennt man auch "greedy, eg. gierig" die sorgt dafür das bis zum Zeilenende gearbeitet wird.

Ausgabe:
Code:
 Super:
  1,669

Der 5. sed Befehl

Code:
sed 's/Super://g'

entfernt das Suchwort "Super:"

Ausgabe:
Code:
  1,669

Der 6. sed Befehl

Code:
sed 's/9//g'

entfernt am Ende die 9

Ausgabe:
Code:
  1,66

Der 7. und letzte sed Befehl

Code:
sed 'N;s/\n//'

entfernt alle Zeilenumbrüche

Ausgabe:
Code:
1,66


Möchte man nun den Diesel-Preis, so muss man lediglich das grep-Suchwort in Diesel ändern...

Übrigens kann man jeden einzelnen Befehl super im Terminal direkt ausführen...

Ich hoffe das man nun einigermaßen nachvolziehen kann was hier passiert...

Quellen zum nachschlagen:

cURL: http://curl.haxx.se/docs/manpage.html
grep: http://unixhelp.ed.ac.uk/CGI/man-cgi?grep
sed: http://unixhelp.ed.ac.uk/CGI/man-cgi?sed
 
Zuletzt bearbeitet:

Denny15

Ribston Pepping
Registriert
14.11.10
Beiträge
296
Wow!!! Vielen Dank für die Klasse Erklärung! Ich hoffe beim 2ten Versuch hat dich meine PN erreicht...;)


Oberes wird mir sicherlich noch öfters behilflich sein.

Gruß Denny;)
 

Nicbert1

Erdapfel
Registriert
02.02.12
Beiträge
1
Hallo,
erstmal ein Dankeschön für die Eräuterungen von mintracer, haben mir sehr geholfen :)
Ich hab auch eine Frage zu Geektool und zwar versuche ich mir den aktuellen Serverstatus der Battelfield 3 Server anzeigen zu lassen :D

# curl --silent "http://www.ea.com/servers/battlefield3" | grep -E '(<div class="server-status server-up">Up</div>)' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed -e 's/Up/Server: Up/'

Soweit bin ich gekommen, Geektool listet mir alle drei Servertypen (Xbox,PS3 und Pc) untereinander auf. Jedoch kriege ich nur ein Output, wenn der Serverstatus Up anzeigt, nicht jedoch bei anderen Ereignissen (Stresset, Down, etc.). Auch wäre es schön, wenn vor der betreffenden Zeile der Entsprechende Servername (Xbox, PS3, PC) stehen würde.

Danke schon mal :)
 
  • Like
Reaktionen: mintracer

mintracer

Weigelts Zinszahler (Rotfranch)
Registriert
23.02.12
Beiträge
246
Weil du Explizit nach UP suchst... du müsstest praktisch die Zeile die du nun mit Grep suchst, dir ausgeben lassen... denn dort würde sich ja der Inhalt ändern... Sprich dort stünde dann ja "stressed" oder "down"...

also müsstest du vorher einen Punkt suchen... und dann x Zeichen und Zeilen ausgeben lassen... damit dein Ergebnis dieser Zeile entspricht:

<div class="server-status server-up">Up</div>

Daraus entnimmst du dann das jeweilige "UP", "Stressed" oder "Down" und hängst ein "Server: " davor...

Gruss mini
 

JohnSteed

Querina
Registriert
05.12.10
Beiträge
183
Der Beitrag ist ja zwar schon älter, aber das Thema immer noch aktuell.

Die Erklärungen von mintracer haben mir sehr geholfen die Befehle "einigermaßen" zu verstehen.
Aber leider habe ich von der gesamten Thematik ehrlich gesagt immer noch sehr wenig Ahnung.

Da sich die Webseite von clever tanken geändert hat, habe ich in dem obigen Script die URL und den Suchtext auf die Anzeige des Diesel Preises aktualisiert.
Das Script funktioniert mit "Schönheitsfehlern".

Code:
curl "http://www.clever-tanken.de/tankstelle_details/40122" | grep -E '(<div class="fuel_type">Diesel<br/><span)' -A 2 | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' |sed 's/Diesel MTS-K Preis//g'| sed 's/ //g'|sed 's/-//g'|sed 's/+//g'

Die "Schönheitsfehler" die ich nicht lösen kann:
  • beim Versuch die Umbrüche mit (sed 'N;s/\n//') zu löschen, ist auf einmal alles weg ... ?
  • ich weiss leider nicht wie es möglich ist, in einem Script den Namen der Tankstelle, dann den Spritpreis und danach das Wort "Euro" anzeigen zu lassen.
    Jetzt mache ich das in Geektool über ein separates leeres Script mit der Option "Overide text". Nicht elegant, aber es funktioniert.
 
  • Like
Reaktionen: mintracer

Trimic

Jonagold
Registriert
13.02.14
Beiträge
19
Ich hätte da auch noch evtl. etwas verständlicheres ;)


Code:
#!/bin/sh

curl -silent "http://www.clever-tanken.de/tankstelle_details/9654" | awk  '/fuel_type">Diesel|display_preis/ {
        if ( index($0,"Diesel") > 0 )
        {
           ZNR=NR;      // Zeilennummer merken
        }
        preis_index=index($0,"display_preis");
        if ( preis_index > 0 && NR-ZNR == 2){
                preis=substr($0, preis_index+15, 4);
                printf("Diesel: %s\n", preis)}
        } '

Awk matched nur die Zeilen mit 'fuel_type">Diesel' und/oder 'display_preis'.
Merkt sich dann die Zeilennummer von 'Diesel,' wenn in der Zeile das Suchmuster vorkommt.
Ermittelt dann Index von 'display_preis' (>0, wenn in Zeile vorkommt) und extrahiert Preis aus Zeile (ZNR+2)
Die +15 ist der Offset zum preis_index bei welchem der Preis im HTML-Output anfängt.
 
Zuletzt bearbeitet:

JohnSteed

Querina
Registriert
05.12.10
Beiträge
183
Ist ja nur unwesentlich klarer als mein Geschreibsel ;)

Sieht echt prima aus, habe das schon bei mir eingesetzt.
 

Trimic

Jonagold
Registriert
13.02.14
Beiträge
19
Vielleicht noch als Tipp:
Bei Sachen mit sed und Regular Expressions oder aber allgemein mit nicht trivialen Regular Expressions teste ich das meistens vorher mit einem Online-RegEx Tool aus...
 

mintracer

Weigelts Zinszahler (Rotfranch)
Registriert
23.02.12
Beiträge
246
Ist ja witzig das es wieder belebt wird... ;) freut mich das es nicht ganz umsonst war...
 

pleibling

Golden Delicious
Registriert
12.04.16
Beiträge
9
Hallo, Klasse Idee :).

Leider funktioniert die letzte Version nicht, da anscheinen die Seite wieder aktualisiert wurde.

Hat jemand eine aktuellere/funktionierende Version?

Danke.
 

pleibling

Golden Delicious
Registriert
12.04.16
Beiträge
9
Hmm, bin schon ein wenig weitergekommen - aber irgendwie ist das nicht so berauschend:

echo "BFT: " && curl -silent "http://www.clever-tanken.de/tankstelle_details/36403"|grep -E "display_preis" -m 1|cut -c 117-|cut -c -5 && echo " €"

Leider erst mal nur zu statisch (schneide die Stellen vorher und nachher einfach ab, das geht sicherlich besser), ausserdem kommt immer eine Meldung "(23) Failed writing body" (wird jedoch nicht im Geekelt angezeigt). Weiterhin hätte ich es gerne das alles in einer Zeile ist - komme aber (hoffentlich) noch nicht mit sed klar.

Leider bin ich nicht fit auf der Console :(.

Könnte mir jemand bitte ein wenig auf die Sprünge helfen?
Danke.
 

MaChris

Osnabrücker Reinette
Registriert
25.07.06
Beiträge
990
Ich gestehe, dass ich auch keine Ahnung von der Konsole habe und nur eine vage Vorstellung von grep und curl etc. habe. Aber ich kenne Geektool und habe es bis vor kurzem auch im Einsatz gehabt.
Aber vielleicht kann ich neue Denkanstösse geben, insofern ob es evtl. mit einer anderen URL leichter umzusetzen geht. Ich verwende gerne für die Suche nach dem günstigsten Benzinpreis die Seite http://www.benzinpreis.de. Vielleicht lässt sich das Script auf eine andere Quelle leichter anpassen?
Wie angedeutet, ich habe selbst keine Ahnung.

Weiterhin bin ich vor kurzem auf das Tool Ubersicht (http://tracesof.net/uebersicht/) gestossen und könnte mir vorstellen, dass es mit seiner Unterstützung von HTML und JavaScript / CoffeeScript leichtere Möglichkeiten für eine Umsetzung bieten könnte.

Was meint ihr?
 

Trimic

Jonagold
Registriert
13.02.14
Beiträge
19
Ich schau mir mein obiges Script mal an.
Eine Anpassung an die neue Seite ist wohl nur etwas Arbeit....
 

pleibling

Golden Delicious
Registriert
12.04.16
Beiträge
9
Danke euch beiden für die Unterstützung.

@MaChris: Danke für den Link, denke aber damit ist es schwerer, da man nicht die Werte per URL aufrufen kann, sondern in einer Seite geladen werden.

@Trimic: Nutzt du das Script noch? So eine Preisliste auf dem Desktop kann echt unterstützend sein, gestern Abend hatten wir unterschiede in der selben PLZ von 25 Cent - JE LITER! Da ist so ein kleines Tool auf dem Desktop schon fat Gold wert ;).
 

Trimic

Jonagold
Registriert
13.02.14
Beiträge
19
Habe das Skript mal soweit angepasst, aber bisher nur auf einem Linux-PC getestet...

Für andere Benzinsorten sind alle Vorkommen von "Diesel" zu ersetzen.

Das AWK-Script matched nur die Zeilen mit den Suchbegriffen "/fuel-price-type"><span>Diesel" und "init="init".
Im 1. Suchbegriff steht die Sorte und der 2. Suchbegriff beinhaltet den Preis.

Code:
        preis[NR]=substr($0, 85, 5);
Erstmal 5 Zeichen ab Position 85 der matchenden Zeile in ein Array packen.

Code:
        sorte=index($0,"Diesel");
Nach der Benzinsorte suchen, wenn gefunden ist index > 0

Code:
        if (sorte > 0 ) {
                print "Diesel: " preis[NR-1];
        }
Wenn index > 0 dann haben wir die gewünschte Benzinsorte gefunden und den Preis holen wir uns aus dem Array (Zeile-1)
und geben ihn aus ;)

Und hier das ganze zusammenhängend:
Code:
#!/bin/sh

curl -silent "http://www.clever-tanken.de/tankstelle_details/9654" | awk  '/fuel-price-type"><span>Diesel|init="init/ {

        preis[NR]=substr($0, 85, 5);
        sorte=index($0,"Diesel");
        if (sorte > 0 ) {
                print "Diesel: " preis[NR-1];
        }
} '