Web scraping avec un esp8266

Bonjour a tous,

Je cherche a faire du web scrapping pour récupérer une donnée sur une page web.
mais entre des api qui fournissent un url, l'utilisation de xpath directement d'un fichier xml, je suis perdu.

Quelle est la démarche pour récupérer une donnée ciblé dans une page web?

Merci d'avance

Il faut

  • effectuer un GET sur la page pour obtenir son contenu
  • écrire un bout de code qui analyse le flux entrant pour trouver la partie à extraire

Suivant le type de page web ce n’est pas forcément trivial, l’affichage pouvant résulter de l’exécution d’un code JavaScript que votre arduino ne pourra pas faire

Si vous faites un curl sur l’URL dans un terminal, voyez vous la donnée qui vous intéresse??

Avez vous cherché s’il existe une API REST qui vous donnerait plus directement la valeur ?

Attention aussi à la clause de propriété des données extraites et ce que vous pouvez en faire légalement

Merci J-M-L,

Première chose je ne sais pas utiliser une commande curl.

Ensuite j'ai bien essayé avec des API, j'en ai une qui me renvoie un résultat en plaçant l'url dans le navigateur et me télécharge un fichier csv, donc je ne vois pas comment exploiter ça.

J'ai récupérer le xpath est il possible de l'utiliser pour récupérer l'information?

vous avez quel OS?

le xpath permet d'extraire une portion d'un document XML. c'est du XML que vous recevez ?

pouvez vous partagez l'URL du serveur où c'est secret défense ?

Je suis sous windows10

Voici l'url:
https://api.meteomatics.com/2022-10-05T19:30:00.000+02:00/msl_pressure:hPa/50.7235038,3.1605714/csv?model=mix

Elle ne sert à rien il faut un nom d'utilisateur et un mot de passe

Ok Merci fdufnews,

Voici le fichier csv que je récupère avec cette url, seulement le problème est que je ne vois pas non plus comment pouvoir passer le login et le mot de passe dans mon code pour utiliser cette url.

csv.txt (53 Bytes)

Dans le csv je ne veux récupérer que le 1015.

Je ne sais pas ce qu'est une API REST, mais on lit sur le site de meteomatics:

Meteomatics provides a REST style API to retrieve historic, current, and forecast data globally.

Oui lesept,
je pense que ça correspond a l'url que j'ai posté plus haut, mais je n'ai pas réussi à l'exploiter, a cause du login et du mot de passe, mais également la gestion du csv.

Oups, j'avais pas compris.

Je recommande pour ceci un tuto de techtutorialsx (une mine de très bon tutos) :

j'ai vu qu'on peut récupérer un JSON au lieu d'un XML ce sera plus simple pour filtrer
je vais regarder leur API pour le login

j'ai regardé, l'API est relativement triviale à utiliser

si vous avez un ESP32 essayez ce code:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// *****************************************
// *****************************************
//
//     ! ATTENTION ELEMENTS SECRETS !
//
// *****************************************
// *****************************************
const char*   ssid =              "**********";
const char*   password =          "**********";
const char *  meteomaticsLogin =  "**********";
const char *  meteomaticsPwd =    "**********";

// *****************************************
// *****************************************

void getMeteoData() {

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFI non disponible. Requête impossible");
    return ;
  }

  HTTPClient httpClient;

  httpClient.begin("https://api.meteomatics.com/2022-10-05T19:30:00.000+02:00/msl_pressure:hPa/50.7235038,3.1605714/json");
  httpClient.setAuthorization(meteomaticsLogin, meteomaticsPwd);

  int statusCode = httpClient.GET();

  if (statusCode > 0) {

    Serial.println("HTTPS REQUEST OK.");

    if (statusCode == HTTP_CODE_OK) {
      Serial.println("Server responded with HTTP status 200.");
      String payload = httpClient.getString();
      Serial.println(payload);
    } else {
      Serial.printf("Got HTTP status: %d", statusCode);
      String payload = httpClient.getString();
      Serial.println(payload);
    }
  }
  else {
    Serial.printf("Error occurred while sending HTTP Get: %s\n", httpClient.errorToString(statusCode).c_str());
  }

  // Release the resources used
  httpClient.end();
}

void setup() {

  Serial.begin(115200);
  delay(2000);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.write('.');
  }
  Serial.print("\nConnected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  getMeteoData();
}

void loop() {}

il faudra remplir la partie suivante avec vos éléments personnels

const char*   ssid =              "**********";
const char*   password =          "**********";
const char *  meteomaticsLogin =  "**********";
const char *  meteomaticsPwd =    "**********";

si vous balancez la requête vous avez une réponse au format JSON

{
  "version": "3.0",
  "user": "username",
  "dateGenerated": "2022-10-05T20:47:23Z",
  "status": "OK",
  "data": [
    {
      "parameter": "msl_pressure:hPa",
      "coordinates": [
        {
          "lat": 50.723504,
          "lon": 3.160571,
          "dates": [
            {
              "date": "2022-10-05T17:30:00Z",
              "value": 1016
            }
          ]
        }
      ]
    }
  ]
}

ou visuellement

il suffirait ensuite de passer cela dans la bibliothèque ArduinoJSON pour extraire les informations souhaitées

je n'ai pas d'ESP8266 sous la main en ce moment pour tester

PS: ils ont aussi OAuth Authentification | Meteomatics si vous voulez faire du oauth au lieu du login/pwd

Un grand merci pour tout ce que tu as fait, je n'ai pas pu tester pour l'instant, j'ai un soucis avec la librairies "HTTPClient.h".
Je continue de regarder demain.

vous avez un ESP32 pour tester ou pas?

Un esp8266 NodeMcu V3 CH340

avec un ESP8266 regardez cet exemple et celui là et adaptez le pour votre URL

Ok je regarde demain, merci

Bonjour a tous,

J'ai un bug dans l'ide Arduino, il ne veut plus compiler, j'ai cette erreur:

Error compiling for board Generic ESP8266 Module

Comment puis je réduire le soucis?

C'est juste un bout du message, copie l'ensemble dans ta réponse. Il y a un bouton sur l'IDE pour copier le message d'erreur