Go Down

Topic: Online Abfrage von Benzin Preisen (Read 1 time) previous topic - next topic

A.R.Ty

Schnelle Möglichkeit zum Testen wäre, die Seite mal zu teilen und den unteren Bereich durchsuchen lassen - nur zum checken ob es werkelt  8)
Dum spiro, spero - if you find my posting helpful, please click my Karma :)<br />~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />Do you know A.R.T, the FREE Android Root Tool ?

eberduino

Das heißt:
1. Abgespeckter Quelltext im 192-er Netz als Quelle.hmtl speichern.
2. client.print("Host: 192.168.2.5"); // Speicherort in  meinem Netz
3. client.print("GET /Quelle.html HTTP/1.1");

Eventuell müsste ich noch Pfade angeben.

Wäre das so machbar?

Gruß Eberhard

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

A.R.Ty

Dum spiro, spero - if you find my posting helpful, please click my Karma :)<br />~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />Do you know A.R.T, the FREE Android Root Tool ?

mkl0815


Am Beispiel einer Tankstelle im Bereich meines Wohnortes würde es wie folgt aussehen:
Code: [Select]

client.println("GET /detail?id=14734438&t=WILMS%2C Dieselstr. 14-20%2C Mönchengladbach HTTP/1.1");
client.println("Host: http://mehr-tanken.de")


Kurze Anmerkung hierzu, das "http://" vor dem Eintrag "Host: http://mehr-tanken.de" muss weg.
Der HTTP Parameter "Host" bekommt nur den Servernamen.
Mario.

eberduino

@mkl0815
Du hast Recht. Mein Fehler, wirkt sich nicht auf den momentanen Fehler aus. Ist ja einen Monat her.

Ich habe mir den Datenstrom auf der SerialMonitor nochmal genau angesehen und merke gerade, dass ein <div> - Container gar nicht gelesen wird. Fiddler2 zeigt mir aber alles komplett - mit fehlendem <div>-Container. Also wertet der Arduino diesen Container nicht aus. Fehlen mir im Header einige Einstellungen?
Mein Request:
GET /tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon= HTTP/1.1
Antwort vom Server(Fiddler2):
Host: www.clever-tanken.de
User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,de-de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

Muss ich Einstellungen ändern?

Gruß
Eberhard



Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

mkl0815

Nein, eigentlich sollte das passen. Hab das selbst gerade mal getestet mit dem einfache WebClient Beispiel der Ethernet-Lib.
Klappt recht gut. Allerdings wird das Parsen der HTML-Daten spannend, da die Webseite 58.000 Bytes groß ist.
Mit dem Textfinder klappt das aber recht gut:
Ausgabe auf dem Serial Monitor:
Quote

connecting...
connected
Tankstelle 1
Wilms-Wickrath, Dieselstr. 14-20, 1.449 Euro
Tankstelle 2
OIL!, Karlstrasse  59, 1.479 Euro
Tankstelle 3
Shell, HARDTER STR. 133, 1.489 Euro
Tankstelle 4
Shell, MARIE-BERNAYS RING, 1.489 Euro
Tankstelle 5
Shell, DUVENSTRASSE. 339, 1.499 Euro
Tankstelle 6
TOTAL, DAHLENER STR. 520, 1.519 Euro


Hier der Code dazu:
Code: [Select]


#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.clever-tanken.de";    // name address for Google (using DNS)
EthernetClient client;

TextFinder finder( client);

char preis1[10];
char preis2[5];
char tankstelle[100];
char adresse[100];

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon= HTTP/1.1");
    client.println("Host: www.clever-tanken.de");
    client.println("Connection: close");
    client.println();
  }
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  int counter=1;
  if (client.connected()) {
    while(finder.find("addPoi")) {
       finder.getString("class=\"price\">","<",preis1,10);
       finder.getString("<sup>","</sup>",preis2,5);
       finder.getString("location_name\">","</div>",tankstelle,100);
       finder.getString("street_number\">","</div>",adresse,100);
       Serial.print("Tankstelle ");
       Serial.println(counter++);
       Serial.print(tankstelle);
       Serial.print(", ");
       Serial.print(adresse);
       Serial.print(", ");
       Serial.print(preis1);
       Serial.print(preis2);
       Serial.println(" Euro");
       
    }
  client.stop();
  }
  while(1) {};
}

eberduino

Nach einem halben Jahr habe ich das Thema nochmal aufgegriffen und an dem Thema weitergearbeitet.
@mkl0815:
Das Ergebnis hat mich auf den ersten Blick schon beeindruckt, Aber die Antwort auf die Abfrage beginnt nicht mit dem ersten sondern mit der 2. Tankstelle. Danach folgt die vierte usw. Zuerst dachte ich, das wäre ein Problem der Laufzeiten. Aber egal was ich gemacht habe => Null Erfolg.

Kann mir jemand sagen wo der Hase begraben ist?

Gruß Eberhard
Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

eberduino

Nach langem Suchen habe ich den Schwachpunkt gefunden.

Die Zeile:
Code: [Select]
finder.getString("<sup>","</sup>",preis2,5); macht Ärger.

Wenn sie geändert wird in :
Code: [Select]
finder.getString(">","<",preis2,5);
werden alle Tankstellen angezeigt, beginnend mit der Peiswertesten. Ist wohl innerhalb der Suchfunktion ein Zeitproblem. Je kürzer der Suchstring ist, um so schneller das Ganze. Wurden vorher max 5 Tankstellen angezeigt, werden nun deutlich mehr angezeigt. Die Anzahl hängt von der Geschwindigkeit des Servers ab. Ist aber m.E. unkritisch, da mich ohnehin nur die 3 preiswertesten Tankstellen interessieren.

Wenn jemand da drauße anderer Meinung ist, würde ich gerne wissen warum.

Gruß
Eberhard
Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

Hobo_D

Hallo Eberduino,

vielleicht kannst Du das Endergebnis hier einmal veröffentlichen.
Das wäre toll.

eberduino

Hallo Zusammen,

da das Forum zu diesem Projekt Wesentliches beigetragen hat, besteht auch ein Anrecht zu wissen, was daraus geworden ist:

Ich lasse mir die preiswerteste Tanke in meinem Bereich (Eingabe der PLZ) im Umkreis von 5km für meine Spritsorte auf meiner Squeezebox-Touch anzeigen. Ich könnte mir auch ein bestimmtes Musikstück zusätzlich einspielen lassen (Muss ich aber nicht haben). Desweiteren gibt es in den Sketch auch einen einstellbaren Schwellwert, der die Anzeige nur dann aktiviert wenn sie den eingestellten Wert (Spritpreis) unterschreitet

Hier mal ein Musterbild meiner Anzeige:



Die Darstellungen sind zu den echten Squeezeboxen identisch. Hier wurden nur die Softwarevarianten (Freeware) dargestellt.

Ein Hinweis: Dies ist nur eine Machbarkeitsstudie und nicht für den alltäglichen Gebrauch vorgesehen!

Es ist schon skuril: Die Markttransparenzstelle für Kraftstoffpreise (MTS-K) stellt ausgewählten Firmen die Rohdaten zur Verfügung, die sie auf ihrer WEbsite veröffentlichen. Eine XML-Datei stellt die MTS-K nicht zur Verfügung. Eine Weiterverarbeitung  der MTK-Daten ist offensichtlich nicht gewollt. Deshalb ist dieses nur eine Machbarkeitsstudie, deren Ergebnis ich euch nicht vorenthalten möchte.

Gruß Eberhard

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

Go Up