Pages: [1] 2   Go Down
Author Topic: Online Abfrage von Benzin Preisen  (Read 1638 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich habe ein Arduino Uno mit einem Ethernetshield.
Mit diesem möchte ich per GET Befehl den Benzinpreis von genau einer Tankstelle bei mir in der Stadt abfragen.
Und zwar gibt es ja die Seiten clever-tanken.de bzw mehr-tanken.de
Von einer der beiden möchte ich den Preis abfragen.

http://www.clever-tanken.de/liste_payed.asp?ort=64646&typ=Super&image1.x=53&image1.y=17
http://mehr-tanken.de/list?plz=64646&city=&brand_id=6&fuel_id=1&radius=5&suche=Suche
     
Ich komme hier aber nicht weiter. Was muß ich genau per GET schicken um die richtige Antwort zu erhalten.
Vielleicht kann mir jemand helfen.


Logged

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hoi,
Du musst die Seite in einen String einlesen und in diesem String ab einer bestimmten Anzahl Zeichen (bzw. nach einem Such-Index)  die Anzahl Zeichen einlesen, die den Preis darstellen.
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
erst einmal Danke für den Hinweis.
Aber mein Problem besteht darin das ich erst gar nicht so weit komme.
Die links sind ja die, die im Browser angezeigt werden wenn ich die Suche über die Maske der Homepage gestartet habe.
Ich müßte eher wissen was ich in den Get-Befehl schreibe, damit ich die Preise bekomme um sie dann rauszufiltern.
Wenn ich es so wie in den links eingebe kommt bei dem einen gar nichts raus und bei dem Anderen alles mögliche außer dem Preis.
Logged

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann empfehle ich erstmal ein par Grundlagen zum Thema GET / POST:
http://www.php-dummies.de/script/Tutorials/Erste_Schritte/Formulare/Post_oder_Get_%3F.html
(Beispiel) bzw. hilft Tante Gugel.
Kenne mich mit dem GET Befehl nicht so aus, aber bei 1,499 würde ich wie gesagt den Quelltext als String einlesen, suchte dann nach z.B. dem ersten KOMMA-Zeichen und würde dann von der Position minus 1 (hoffe ja nicht, dass da mal 2 Stellen erscheinen  smiley-confuse ) 5 Zeichen einlesen und Voilá - da ist der Preis  smiley-grin
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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")

Damit hättest Du zwar die Seite abgerufen, aber leider liegen die Preise fast immer als Bild-Datei (*.png) vor und somit nicht im Datenstrom auswertbar. Dafür müsste man ein XML-Dokument abrufen können.

Frage in die Runde: Kennt jemand einen Anbieter, der eine API-Schnittstelle mit XML_Dokument für die Benzinpreise bereithält?

benzinpreis.de will einen Domainnamen haben, benzinpreis-aktuell.de stellt zwar eine API zur Verfügung aber nur als PHP-Script. Habe versucht eine ID zu generieren und habe nach 15 Versuchen frustiert aufgegeben.

ARAL bietet auf seiner Web-Site auswertbare Preiszahlen an, allerdings auch keine XML-Dokumente.

Sieht also zur Zeit m.E. nicht so gut aus. Da ist die Wetterseite deutlich weiter; hier sind XML-Daten leicht zu beschaffen.

Gruß Eberhard
Logged

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

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oder müsstest (wie ich) ein eigenes Proggi auf einem PC o.ä. laufen haben, der diese Arbeiten für Dich übernimmt und (wie bei mir) eine ASCII.txt erstellt mit nur den Daten, die Du brauchst.

Ist zwar von hinten durch's Knie in's Auge  smiley-mr-green - aber der Zweck heiligt die Mittel  smiley-lol
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@ Arty
Bedeutet dass, dass der PC in regelmäßigen Abständen die .txt-Datei zur Verfügung stellt? Und was machst du mit den Preisen, die in PNG-Dateien "versteckt" sind?

Gruß Eberhard
Logged

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

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Bedeutet dass, dass der PC in regelmäßigen Abständen die .txt-Datei zur Verfügung stellt?
Jepp

Quote
Und was machst du mit den Preisen, die in PNG-Dateien "versteckt" sind?
Nüscht
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaube ich sollte man erklären was ich damit machen möchte.
Ich möchte praktisch von meiner Tankstelle in der Stadt morgens automatisch den Preis abrufen und dann per Prowl an mein Handy schicken. Somit weis ich ob es sich lohnt den Umweg durch die Stadt zum Tanken zu nehmen. Auf dem direkten Arbeitsweg komme ich da nicht vorbei. Das senden von Daten mit Prowl funktioniert schon super. Alternativ funktioniert auch isticky.

Ich kenn mich nicht mit Homepage Programmierung aus.
Vielleicht könnte man auch das Bild irgendwie schicken?
Oder A.R.Ty  stellt den einen Preis zur Verfügung  smiley-lol

Was machst Du eigentlich damit?
Logged

Offline Offline
Faraday Member
**
Karma: 130
Posts: 4231
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kannst du da nicht gleiche eine App auf dem Handy schreiben, die das für dich erledigt?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ne leider nicht.
Wenn ich das könnte wäre ich reich und berühmt  smiley-cool
Logged

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Oder A.R.Ty  stellt den einen Preis zur Verfügung  smiley-lol
Was machst Du eigentlich damit?

Den Preis meiner Tankstelle hier kannste haben ;-)
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Um das Thema noch einmal aufzugreifen:

Inzwischen gibt es die URL www.clever-tanken.de in deren Quelltext die Bezinpreise enthalten sind. Mein Ansinnen ist nun,  diese Preise mit der library Textfinder.h zu extrahieren.

Wie weit bin ich? Die Webseite wird als Quelltext - wenn kein finder.find() aktiviert ist - einwandfrei im SerialMonitor angezeigt. Aktiviere ich den Finder und lass ihn nach einem bestimmten string suchen, wird der Quelltext nicht mehr angezeigt nur noch ein "H", Scheint ein zeitliches Problem zu sein ist aber sekundär.

Ärgerlicher ist, dass die Suchfunktion nur im oberen Bereich funktioniert. Der Bereich, in dem die Ergebnisse stehen, wird offensichtlich nicht ausgewertet. Um die Pprogrammierunng zu ändern, muss ich wissen, warum nichts ausgewertet wird.

Ich habe mal den kompletten Sketch beigefügt.  Der Bereich "Finder ist markiert. Als Suche habe ich eine Tankstellennummer meines Bereiches ausgewählt (Die aber nicht gefunden wird)
Code:
/*
   Web client sketch for IDE v1.0.1 and w5100/w5200
   Uses GET method.
   Posted October 2012 by SurferTim
   Last modified September 15, 2013
*/

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

// this must be unique
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// change to your network settings
IPAddress ip(192,168,2,44);
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(212,11,226,1); // clever-tanken

//Change to your domain name for virtual servers
char serverName[] = "www.clever-tanken.de";
// If no domain name, use the ip address above
// char serverName[] = "74.125.227.16";

// change to your server's port
int serverPort = 80;

EthernetClient client;
TextFinder finder( client);
int totalCount = 0;
char pageAdd[64] = "/tankstelle_liste?spritsorte=7&r=5&ort=41189&lat=&lon=";
char preis2[15]="5"; // Default-Zahl ist nur für Testzwecke
char preis3[15]="7";

#define delayMillis 60000UL

unsigned long thisMillis = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  // Start ethernet
  Serial.println(F("Starting ethernet..."));
  Ethernet.begin(mac, ip, gateway);

  // If using dhcp, comment out the line above
  // and uncomment the next 2 lines

  // if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  // else Serial.println(F("ok"));
  digitalWrite(10,HIGH);

  Serial.println(Ethernet.localIP());

  delay(2000);
  Serial.println(F("Ready"));
}

void loop()
{
  thisMillis = millis();

  if(thisMillis - lastMillis > delayMillis)
  {
    lastMillis = thisMillis;

    // Modify next line to load different page
    // or pass values to server
    sprintf(pageAdd,"/",totalCount);

    // sprintf(pageAdd,"/arduino.php?test=%u",totalCount);

    if(!getPage(server,serverPort,pageAdd)) Serial.print(F("Fail "));
    else Serial.print(F("Pass "));
    totalCount++;
    Serial.println(totalCount,DEC);
  }   
}

byte getPage(IPAddress ipBuf,int thisPort, char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  if(client.connect(ipBuf,thisPort))
  {
    Serial.println(F("connected"));

    sprintf(outBuf,"GET %s HTTP/1.1",page);
    client.println(outBuf);
    sprintf(outBuf,"Host: %s",serverName);
    client.println(outBuf);
    client.println(F("Connection: close\r\n"));
  }
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      int a=0;
      inChar = client.read();
      Serial.write(inChar);

// -----  Ende Start --------       
     if (finder.find("10564"))
     {
       a = 1;
       Serial.println(a);
     }
// -----  Ende Finder --------     
     
      // set connectLoop to zero if a packet arrives
      connectLoop = 0;
    }

    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println(F("Timeout"));
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}
Die Anlage Quell.txt enthält den Quelltext der Ergebnisseite. In dieser ist der Bereich, ab dem der Finder nicht mehr funktioniert deutlich markiert.

Kann sich jemand vorstellen, warum er nichts mehr findet?

Gruß Eberhard
Die Diskussion über die Sinnhaftigkeit, wo es doch Apps gibt, ist ja schon geführt worden.  smiley-cool


* Quell.txt (58.58 KB - downloaded 34 times.)
« Last Edit: December 21, 2013, 04:56:57 am by eberduino » Logged

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

DE
Offline Offline
God Member
*****
Karma: 21
Posts: 710
| Germany | NRW |
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hoi Eberhard,

kanne es was damit zu tun haben dass es "zu viele" Zeichen sind, will sagen dass ein Buffer überläuft oder voll ist ?

Wie Du schreibst, scheint es im "oberen" Bereich zu funktionieren - daher mag es sein dass ab 32xxx Zeichen nichts mehr eingelesen/ verarbeitet wird ?
Kenne diese Problematik nicht vom ARDUINO sondern von anderen ProgSprachen her - nur mal so als Denkanstoss.

Genau so kann es aber auch ein Timing-Problem sein - zu schnell (zu viel) einlesen ?

Doei
Franz
Logged

Dum spiro, spero - if you find my posting helpful, please click my Karma smiley
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Do you know A.R.T

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Frage mit dem Speicher habe ich mir auch schon gestellt, aber noch nicht beantwortet (bekommen). Es fragt sich, ob der Arduino für den find-Prozess die ganze Seite speichert. Dass es dann zu Speicherproblemen kommt, wäre verständlich.

Ohne Finder läuft ja der gesamte Text durch. Das bedeutet, dass hierbei der Speicher nicht befüllt wird.

Gruß Eberhard
Logged

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

Pages: [1] 2   Go Up
Jump to: