Tutorial: Website parsen mit dem ESP8266 – Teil 1

Einleitung

In den letzten Tagen habe ich mich verstärkt mit der Abfrage verschiedener Websites beschäftigt und der Nutzung der Informationen im eigenen Programm. Das Finden und Extrahieren von Informationen aus einem Text, einem String oder einer Seite nennt man parsen. Da ich dabei viel gelernt habe, möchte ich dieses Wissen gerne weitergeben. Wichtig ist mir dabei wie immer, dass ihr das versteht und selbstständig nachvollziehen könnt. Deshalb werden meine Erklärungen vielleicht etwas ausführlicher und richten sich an die Programmieranfänger unter euch. Da ich das Tutorial für den ESP schreibe, werde ich auch auch auf die grundsätzliche Abfrage von Websites mit dem ESP eingehen.

Der ESP als Client

In den Libraries des ESP ist ein Beispiel enthalten, wie mit den ESP als Client Informationen von einem Webserver abgerufen werden können. In meinem Tutorial über die Speicherung von MySQL Daten habe ich ja bereits ein Beispiel zur Abfrage eines Webservers gezeigt. Das folgende Beispiel zeigt die Anwendung des ESP als Client mit Nutzung der neuesten Libraries. Das Beispiel ruft google.de auf und schreibt die Ausgabe auf die serielle Schnittstelle.

/*
 * Basic ESP Client example, based on the ESP libraries examples
 */

#include <ESP8266WiFi.h>

const char* ssid     = "yourSSID";
const char* password = "yourPASSPHRASE";
const char* host = "google.de";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println();
}

void loop() {
  Serial.print("connecting to ");
  Serial.println(host);
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/";
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  // start waiting for the response             
  unsigned long lasttime = millis();
  while (!client.available() && millis() - lasttime < 1000) {delay(1);}   // wait max 1s for data
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    char readchar = client.read();
    Serial.print(readchar);
  }
  Serial.println();
  Serial.println("closing connection");
  delay(5000);
}

Auf einige Teile dieses Codes möchte ich nochmal tiefer eingehen.

// We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

Im setup wird die Verbindung zum lokalen WLAN aufgebaut, dazu müssen im Parameterblock oben im Programm SSID und Passwort eingetragen werden.
Das Programm versucht nun (hier endlos) eine Verbindung zum WLAN aufzubauen. In meinem Fall wird die Verbindung nach ca. 5-8 Sekunden aufgebaut, wenn es bis dahin keine Verbindung gibt, muss man ein Reset machen und manchmal auch den Code neu flashen.

  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

Im loop wird dann die Verbindung zum Host, hier google.de aufgebaut

// We now create a URI for the request
  String url = "/";
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");

Zunächst wird die URL für die Abfrage zusammengesetzt. Als erstes wird der Teil der nach dem Host in der URL kommt in einen String geschrieben. In diesem Fall kommt nach google.de nichts mehr, deshalb steht hier nur ein „/“. Im nchsten Schritt werden die für die Abfrage notwendigen Parameter zum String hinzugefügt. ( die \r\n stehen für CR und LF und müssen an diesen Stellen stehen, am Ende der Abfrage sogar zweimal). Die client.print() Anweisung schickt die Abfrage zum Server.

// start waiting for the response             
  unsigned long lasttime = millis();
  while (!client.available() && millis() - lasttime < 1000) {delay(1);}   // wait max 1s for data

Jetzt wartet der Client auf eine Antwort des Servers. Manche Server lassen sich damit Zeit, deshalb wartet der Client entweder bis er Daten bekommt (client-available()=true) oder die Zeit abgelaufen ist (hier 1000ms).

  while(client.available()){
    char readchar = client.read();
    Serial.print(readchar);
  }

Solange Daten empfangen werden, gibt der ESP diese Buchstabe für Buchstabe auf der seriellen Schnittstelle aus. Im Client der Library ist hier alternativ eine Methode vorgeschlagen, die Daten zeilenweise (bis zum CR) zu lesen und auszugeben. Diese Methode werden wir für die nächsten Beispiele verwenden, also jetzt schon mal in das Beispiel einbauen. Manchmal ist es sinnvoller, statt nach einem CR ein LF zu suchen, dann sind die Strings möglicherweise kürzer, doch dazu später mehr.

  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

Die Aussgabe auf der seriellen Schnittstelle sieht dann so aus

Connecting to DD-WRT 
............. 
WiFi connected 
IP address:  
192.168.2.109 
 
connecting to google.de 
Requesting URL: / 
HTTP/1.1 301 Moved Permanently 
Location: http://www.google.de/ 
Content-Type: text/html; charset=UTF-8 
Date: Sat, 30 Jan 2016 22:25:54 GMT 
Expires: Mon, 29 Feb 2016 22:25:54 GMT 
Cache-Control: public, max-age=2592000 
Server: gws 
Content-Length: 218 
X-XSS-Protection: 1; mode=block 
X-Frame-Options: SAMEORIGIN 
Connection: close 
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.de/">here</A>. 
</BODY></HTML> 
 
closing connection 

Am Anfang der Ausgabe kommen Informationen über den Server, die eigentliche Ausgabe der Webseite beginnt ab <HTML>. Die Webseite bietet nicht viel an nutzbarer Information, allerdings könnte man aus den Header Daten die Uhrzeit parsen, anstatt den NTP Client einzubinden. Das möchte ich als abschließendes erstes Beispiel für das parsen zeigen. Wichtig beim parsen ist, dass man ein sich eindeutige Suchbegriffe sucht, über die man die Zeile in der die Information steht und als zweites der Platz in der Zeile eindeutig bestimmen kann. Für die Zeitabfrage ist das die Zeile

Date: Sat, 30 Jan 2016 22:25:54 GMT

Als erstes suchen wir also im eingelesenen String nach dem Suchwort „Date“ und wissen dann, dass wir in der richtigen Zeile sind. Das Schöne an diesem Beispiel ist, dass die Zeit immer genau an der selben Stelle im String steht.

Die beiden wichtigsten Befehle beim parsen sind:

String.indexOf(„Suchstring“)  ->  gibt als int die Position im String aus, wo der Suchstring gefunden wird

String.substring(von, bis)  -> liefert String, der bei „von“ beginnt und vor „bis“ endet.

Da wir wissen, dass das Suchwort „Date“ immer an Position 1 im String zu finden ist (auf Position 0 steht ein LF), können wir einfach die Position im String abzählen, wo der gesuchte Teil steht. Doch zuvor testen wir, ob der Suchstring im gelesenen String vorkommt.

_________1_________2_________3_________4
1234567890123456789012345678901234567890
Date: Sat, 30 Jan 2016 22:25:54 GMT

Der entsprechende Code-Block sieht dann so aus:

  while (client.available()) {
    String line = client.readStringUntil('\r');
    if (line.indexOf("Date:")>=0) {   // Searchstring exists?
      Serial.println();
      Serial.print("Heute ist der ");
      Serial.print(line.substring(12, 23));
      Serial.print(", es ist ");
      Serial.println(line.substring(24, 32));
    }
    Serial.print(line);
  }

Die Uhrzeit wird in GMT ausgegeben, zur korrekten Darstellung muss (in der Winterzeit) 1 Stunde addiert werden. Dafür müssen Teile des Strings zunächst mit dem Befehl atoi() in einen Integer umgewandelt werden. Dieser Befehl kann nicht direkt auf den String ausgeführt werden. Dafür wird zunächste der Teilstring extrahiert und an die Funktion atoi() der Pointer auf den neuen String übergeben. Dafür setzen wir die Funktion String.c_str() ein.

  while (client.available()) {
    String line = client.readStringUntil('\r');
    if (line.indexOf("Date:")>=1) {   // Searchstring exists?
      Serial.println();
      Serial.print("Heute ist der ");
      Serial.print(line.substring(12, 23));
      String stundeSubString = line.substring(24,26);
      int stunde = atoi(stundeSubString.c_str());
      if (stunde==23) stunde=0; else stunde++;      
      Serial.print(", es ist ");
      if (stunde<10) Serial.print("0");
      Serial.print(stunde);
      Serial.print(line.substring(26, 32));
      if (stunde==0) Serial.print(" + 1 Tag"); else Serial.println();  // Tagsprung ??
    }

Natürlich müsste bei einem Tagsprung, also bei 0 Uhr bis 0:59 auch der Tag geändert werden. Das ist eine nette Übung für euch. Man sieht, mit der Umwandlung der Ausgabe in rechenbares Format, kann der Code schnell umfangreicher werden.
Die Ausgabe sieht jetzt so aus:

Connecting to DD-WRT 
............. 
WiFi connected 
IP address:  
192.168.2.109 
 
connecting to google.de 
Requesting URL: / 
HTTP/1.1 301 Moved Permanently
Location: http://www.google.de/
Content-Type: text/html; charset=UTF-8 
Heute ist der 31 Jan 2016, es ist 08:33:24 

Date: Sun, 31 Jan 2016 07:33:24 GMT
Expires: Tue, 01 Mar 2016 07:33:24 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.de/">here</A>.
</BODY></HTML>
 
closing connection 

Die war der erste Teil meines Tutorials zum parsen von Webseiten. Ich hoffe, ihr konntet meinen Erklärungen folgen und die Beispiele funktionierten auch bei euch. Wie immer, freue ich mich auf eure Rückmeldungen. Im zweiten Teil werde ich euch weitere Tips geben, wie eine Webseite „auseinander genommen“ werden kann.

Anmerkung: google.de gibt dem ESP nur eine sehr reduzierte Information zurück. Offensichtlich erkennt google, dass hier kein Browser anfragt.

Werbung

Veröffentlicht am 31. Januar 2016 in ESP8266, Tutorial und mit , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 21 Kommentare.

  1. Hallo trotzdem noch eine Frage: Die Anordnung der Blocks sind für mich beim letzten beschriebenen Beispiel nicht ganz ersichtlich. Wo sollte der Block mit dem Datum eingebunden werden? Hättest du vielleicht den entsprechenden Code noch zur Hand.

  2. Hallo Chilla,
    der gesamte Code steht im Post oben, du musst nur den Bereich
    „click here to expand the code of the ESP Client example“
    aufklappen.
    Dann musst du nur noch den Block
    while(client.available()){
    char readchar = client.read();
    Serial.print(readchar);
    }
    durch den letzten Block im Post ersetzen.
    Gruß
    Reinhard
    (ich hoffe, ich habe dich richtig verstanden)

  3. alfred odenthal

    danke. Klasse erklärt . Hab es geschaft dank Ihrer Erkärung ein Projekt zu lösen.

  4. Jochen Bruening

    Auf der Seite http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html
    des deutschen Wetterdienstes werden Wetterwarnungen als html und json files angeboten.

    http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
    http://www.dwd.de/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html

    Obwohl ich mich eng an das Beispielprogramm gehalten habe bekomme ich keine Daten vom Server.
    Was mache ich falsch? WLAN access klappt, auch die Verbindung zum Server wird aufgebaut.
    ————————–schnipp—————————————————–
    #include
    #include
    WiFiClient client;

    const char* ssid = „****“;
    const char* password = „****“;
    const char* host = „www.dwd.de“; // DWD server
    const int http_port = 80;
    // different server requests
    const char* Server_BW = „/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html“;
    const char* Server_json = „http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json“;
    char InChar; // incomming characters

    void setup() {
    Serial.begin(115200);
    delay(1000);
    Serial.println(); Serial.println(„sketch_jul17d“);Serial.println(); Serial.println();
    delay(1000);
    // We start by connecting to a WiFi network
    Serial.print(„Connecting to „);
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(„.“);
    }
    Serial.println();
    Serial.println(„WiFi connected“);
    Serial.println(„IP address: „);
    Serial.println(WiFi.localIP());
    Serial.println();
    }

    void loop() {
    Serial.println(„connecting DWD server“);
    while(!client.connect(host, http_port)){ // wait for server connection
    Serial.println(„no server connection „);
    delay(1000);
    }
    Serial.println(„server connection established“); // ok, start request
    client.println(String(„GET „) + Server_json + “ \r\n“);
    // + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // verstehe ich nicht

    // start waiting for the response
    unsigned long lasttime = millis();
    while (!client.available() && millis() – lasttime < 5000) {delay(1);} // wait max 5s for response
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
    InChar = client.read();
    Serial.print(InChar);
    }

    Serial.println();
    client.stop(); // Close socket

    delay(10000); // start over again
    }
    ——————————-schnapp——————————

    • Hallo Jochen,
      es sind nur ein paar Tipp- oder Kopierfehler im Code gewesen. Hier die Zeilen die ich geändert habe:
      #include
      WiFiClient client;
      const char* ssid = „****“;
      const char* password = „****“;
      ….
      const char* Server_json = „/DWD/warnungen/warnapp/json/warnings.json“;
      ….
      Serial.println(„server connection established“); // ok, start request
      client.println(String(„GET „) + Server_json + “ HTTP/1.1\r\n“ + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // könnte man auch noch einfacher schreiben
      // start waiting for the response
      ….

      Schönen Gruß aus Köln und weiter so
      Reinhard

      • Jochen Bruening

        2. Versuch
        mein etwas längeren Kommentar in dem ich mich für die sehr hilfreichen Hinweise und die nette Artdies zu tun bedanke ist leider nicht gesendet worden (access Google account)

      • Jochen Bruening

        Hi Reinhard,
        Deinem Rat „weiter so“ bin ich gefolgt und schwupp brauche ich nochmals Deine Hilfe.

        Der deutsche Wetter Dienst (DWD) bietet online eine Fülle von Services, u.a. auch Wetterwarnungen in verschiedenen Formaten (http, JSON), die ich verarbeiten möchte. Hier eine Übersicht:
        http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/einbindung_karten_geowebservice.pdf?__blob=publicationFile&v=2Mit der URL bekommt man Gemeinde spezifische JSON Daten :
        https://maps.dwd.de/geoserver/dwd/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=dwd:Warnungen_Gemeinden&maxFeatures=50&outputFormat=text%2Fjavascript&CQL_FILTER=WARNCELLID%20IN%20('808435059‚)

        Im Browser eingegeben funktioniert das prima. Diese URL, wegen der Sonderzeichen (Seite 4 der Übersicht) etwas modifiziert, in einem GET-Aufruf funktioniert – zumindest bei mir – leider nicht. Was mache ich falsch, hat jemand einen Tipp für mich?

        Besten Dank und ein schönes Wochenende
        ———————schnipp———————
        /*
        * DWD Wetterwarnungen V3
        */

        #include
        #include
        WiFiClient client;

        const char* ssid = „###“;
        const char* password = „###“;
        const char http_site[] = „maps.dwd.de“; // DWD Server
        const int http_port = 80;
        const char* service_1 = „/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html“; // DWD services
        const char* service_2 = „/DWD/warnungen/warnapp/json/warnings.json“;

        char InChar; // incomming characters

        void setup() {
        Serial.begin(115200);
        delay(1000);
        Serial.println(); Serial.println(„ESP_DWD_V3“);Serial.println(); Serial.println();
        delay(1000);

        Serial.print(„Connecting to „); // connect to WiFi…
        Serial.println(ssid);
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(„.“);
        }
        Serial.println();
        Serial.println(„WiFi connected“);
        Serial.println(„IP address: „);
        Serial.println(WiFi.localIP());
        Serial.println(); // established!
        }

        void loop() {
        Serial.println(„connecting DWD server“);
        while(!client.connect(http_site, http_port)){ // wait for server connection
        Serial.println(„no server connection „);
        delay(1000);
        }
        Serial.println(„server connection established“); // ok, make a HTTP GET request

        client.print(String(„GET „) +
        „%2Fgeoserver%2Fdwd%2Fows%3Fservice%3DWFS%26version%3D1.0.0%26request%3DGetFeature%26typeName%3Ddwd%3AWarnungen%5FGemeinden%26maxFeatures%3D50%26outputFormat%3Dtext%2Fjavascript%26CQL%5FFILTER%3DWARNCELLID%20IN%20%28%27809362000%27%29%20%5Cr%%Cn“ +
        “ HTTP/1.1\r\nHost: “ + http_site +
        „\r\nConnection: close\r\n\r\n“ );

        unsigned long lasttime = millis(); // server might need some time…
        while (!client.available() && millis() – lasttime < 5000) {delay(1);} // …to response
        while(client.available()){
        InChar = client.read();
        Serial.print(InChar);
        }
        Serial.println();
        client.stop(); // Close socket and …
        delay(10000); // …start over again
        }

        ——————schnapp——————–

  5. das ist eine Zeile:
    client.println(String(„GET „) + Server_json + “ HTTP/1.1\r\n“ + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // könnte man auch noch einfacher schreiben

  6. Hi,
    tolles Tutorial. Hab damit mein Problem umgangen, nicht direkt auf eine DB zugreifen zu können. Somit parse ich mir ein PHP-Script welches mir die Daten mit speziellen Trennzeichen ausgibt. Nach etwas gefummel hat es dann funktioniert. Habe dann festgestellt, dass eine int-Variable doch besser ist als eine byte-Variable. Nachdem die zu übergebenden Daten immer mehr wurden, ist mir die Variable „überlaufen“. Hab mehrere Tage nach dem „Fehler“ gesucht. PEBKAC :-)
    Jetzt hab ich nur noch einen Schönheitsfehler: Die Abfrage dauert doch relativ lange (4-5 Sekunden). Kann man das irgendwie beschleunigen?
    Wenn ich das Script per Browser aufrufe, dann ist das Ergebnis sofort da. Der ESP gibt auch sofort die Serverdaten und die Länge der Datenmenge aus. Die Daten an sich gibt er aber erst nach den 4-5 Sekunden aus. In dieser Zeit kann das Programm aber nicht auf Buttons o.ä. reagieren.
    Kann ich über das PHP-Script irgend einen Wert übergeben, der dem ESP sagt, dass alles da ist?

    Hier mal ein Teil vom Sketch:
    ———————————————————————-
    client.print(String(„GET „) + url + “ HTTP/1.1\r\n“ +
    „Host: “ + host + „\r\n“ +
    „Connection: close\r\n\r\n“);
    unsigned long timeout = millis();
    while (client.available() == 0) {
    if (millis() – timeout > 1000) {
    Serial.println(„>>> Client Timeout !“);
    client.stop();
    return;
    }
    }
    String line;
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()) {
    line = client.readStringUntil(‚\r‘);
    Serial.print(line);
    ———————————————————————-
    Und die Ausgabe auf dem seriellen Monitor:
    ———————————————————————-
    Connecting to FreeWiFi
    …..
    WiFi connected
    IP address:
    192.168.254.44
    connecting to maier-illertal.de
    Requesting URL: /bestelldruck.php?status=1
    HTTP/1.1 200 OK
    Date: Thu, 19 Jul 2018 16:21:08 GMT
    Server: Apache
    X-Powered-By: PHP/7.0.30
    Vary: Accept-Encoding
    Content-Type: text/html; charset=UTF-8
    X-Varnish: 666021275
    Age: 0
    Via: 1.1 varnish (Varnish/6.0)
    Accept-Ranges: bytes
    Content-Length: 54
    Connection: close

    a0;a1;a2;a3;a4;a5;a6;a7;a8;a9;a10;a11;a12;a13;a14;a15;
    ———————————————————————-
    Zur Erleichterung: Die Auszugebenden Zahlen sind immer durch a0; a1; etc getrennt.

    • Nachtrag: Es wurden keine Daten ausgegeben, da die Datenbank gerade leer ist. Drum sind nur die Platzhalter ausgegeben worden :-)
      Es dauert aber gleichlange, egal ob Daten vorhanden sind, oder nicht.

      • Es scheint an dem Befehl
        line = client.readStringUntil(‚\r‘);
        zu liegen. Der wartet bis er ins Timeout läuft, weil zwar Daten da sind zum lesen, er aber kein „\r“ mehr findet.
        bau den Teil zum auslesen mal so auf:

        // Read all the lines of the reply from server and print them to Serial
        while (client.available()) {
        char text = client.read();
        Serial.print(text);
        }
        Serial.println();
        Serial.println(„closing connection“);

      • Hey,
        danke mal. Hätte ich wohl selbst draufkommen können… Steht ja schließlich im Tutorial.
        Es wird wohl am Timeout liegen, da es mit der anderen Methode viel schneller geht.
        Wenn ich line = client.readString(); nehme, dann geht es auch schneller, aber bei weitem nicht so, wie mit dem Char-Array.
        Vielen Dank!

  7. „google.de gibt dem ESP nur eine sehr reduzierte Information zurück. Offensichtlich erkennt google, dass hier kein Browser anfragt.“
    Knapp vorbei… Im Header fehlt die Zeile „Request URL: http://www.google.de/„. Deshalb geht der Server davon aus, dass die IP von einem google-Server als URL eingegeben wurde. Deshalb kommt ein 301 Redirect zurück. Dieser soll den Client darauf hinweisen, bitte „http://www.google.de/“ aufzurufen (mir passendem Header). Danach käme dann noch ein zweiter Redirect, mit dem man auf https://www.google.de geleitet wird.
    Insofern ist Google egal, wer anfragt. Es wird einfach davon ausgegangen, dass jemand direkt die IP aufgerufen hat.

    • Danke für den Hinweis, muss ich direkt mal ausprobieren

    • Wieso sollte die Request-URL fehlen? Es wird ein GET / geschickt und als Host wird google.de genannt. Damit ist die Request-URL bekannt: http://google.de/

      Der Webserver geht also nicht davon aus, dass über die IP-Adresse aufgerufen wurde. Der Server geht davon aus, dass google.de aufgerufen wurde. (Übrigens: Würde der Server davon ausgehen, dass man über die IP-Adresse aufruft, würde er nicht auf http://www.google.de sondern auf http://www.google.com weiterleiten)

      Das Problem ist, dass Google sich entschieden hat, die Website nicht über google.de sondern über http://www.google.de/ auszuliefern. Das ist zwar ein schlechter Stil (siehe no-www.org ), aber eine Entscheidung, die man treffen kann. Daher erfolgt dann auch die Weiterleitung auf http://www.google.de/ .

      Ich habe es mit curl ausprobiert. Ich sah (zumindest im Header) keine Weiterleitung zu https. Eventuell findet die Weiterleitung durch JavaScript statt.

  8. all4electronics

    Danke für das nette Tutorial!

  9. Hallo,

    ich finde deine Erklärung klasse!
    Gibt es auch eine Möglichkeit nach einem Text zu suchen und dann die darauffolgenden Zeichen auszugeben?

    Ich habe mal ein Beispiel einer kleinen Webseite auf Wemos die mir die Informationen Zeilenweise ausgibt:

    WeMoS 1 Pelletlager

    WeMoS 71 Pelletlager

    Entfernung
    134 cm

    Temperatur
    13.81 C

    Temperatur intern
    19.94 C

    Luftfeuchte
    45.83%

    Luftdruck
    992.50 hp

    Wenn ich hier z.B. den Wert „13.81“ herausholen möchte. Wie muss ich das machen?

    • Prinzipiell ja.
      Du suchst nach dem ersten Vorkommen von „Temperatur“ und du suchst nach dieser Position nach dem ersten Vorkommen von „C“. Zwischen diesen beiden Positionen steht der Wert, du musst nur noch die Zeilenumbrüche berücksichtigen.
      Wenn das zeilenweise ausgegeben wird, genauso. Du suchst nach dem ersten Vorkommen „Temperatur“ dann weisst du, dass in der nächsten Zeile der Wert kommt.

  10. Hallo,
    Wenn ich in meiner URL z.b http://www.google.de/katze/ habe wie wird das in dem Quelltext angegeben?

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: