Web scraper - Arduino + Ethernet / ESP8266 / ESP32

02.01.2020

Dnes sa budem baviť o spôsobe, akým som z mikrokontroléru spravil webscraper. (Ak sa to tak dá nazvať pri spracovaní informácii vlastným backendom. - mikrokontróler načítava zdrojový kód a preposiela ho na ďalšie spracovanie)
Ako mnohí z vás viete, web scraper je zariadenie, ktoré plní úlohu získavania informácii z danej webovej lokality. Medzi najžiadanejšie informácie z webových lokalít sú e-mailové adresy, telefónne čísla. 

V poslednej dobe sa ale tento fenomén používa aj na rôzne štatistické úlohy, kedy web scraper získava údaje o produktoch, ich cene a tie vyhodnocuje. Dokonca sa podobné zariadenia využívajú a to ako roboty na obchodovanie s kryptomenami, či bežnými menami. Robot v najvhodnejší čas(štatisticky) pedal a nakúpil inú - vhodnú menu so stúpajúcou tendenciou. 

V mojom prípade som sa zaujímal o získavanie informácii z webov a to konkrétne telefónnych čísel a e-mailových adries.Prejdem teda priamo k realizácii. Využil som 3 druhy mikrokontrolérov. Pre weby na nešifrovanom HTTP protokole som použil Arduino s Ethernet shieldom (podporuje iba HTTP spojenia), pre weby pod HTTPS protokolom som použil dosku NodeMCU s integrovaným čipom ESP8266 a taktiež aj ESP32 Devkit v1 DOIT.

ESP32 má oproti ESP8266 výhodu v tom, že disponuje dvomi jadrami, rýchlejšími o 160MHz, má o takmer 400kB viac RAM a je možné túto dosku napojiť aj do podnikových sietí pod protokolom 802.1x (WPA/WPA2 Enterprise).Funkčnosť všetkých troch menovaných dosiek je až morbídne jednoduchá.

Ich úlohou je iba pripojiť sa na cieľový web, odkiaľ chceme informácie získať a zdrojový kód po riadkoch posielajú na môj web, kde sa tieto informácie spracujú a za pomoci regulárneho výrazu získam informácie, ktoré potrebujem. Nakoľko dosky nedokážu spustiť client-side script, teda Javascript, tak sú chránené pre JS aplikáciami na vyhľadávanie scraperov, iné zariadenia typu Rpi dokážu zaznamenať, pretože pri emulácii prehliadača tieto scripty spustia. Moje dosky sa nezobrazia v Google Analytics, či sledovanom nástroji Smartlook a pod.

Jediná možnosť zaznamenať informácie o doske, že na stránke bola (vykonala GET request)je cez PHP kód, alebo iný serverovo orientovaný jazyk, na ktorý bol request vykonaný. Je možné pristupovať na rôzne verzie HTTP hlavičiek od 1.0 cez 1.1 a s novšími doskami ESP32 aj na HTTP /2 - podľa podpory cieľového webu.

Na mojom webe spracúvavam riadky zdrojového kódu iného webu cez PHP, kde mám vyskladaný requlárny výraz, ktorý som postupne vylepšoval a dnes som schopný zaznamenať tieto druhy e-mailových adries, ktoré sa na weboch vyskytujú v rôznych formátoch, ktoré ich majú uchrániť pred získaním robotmi, scrapermi, crawlermi.

Doskám neprekáža ani obsah za prihlásením, dokážu sa prihlásiť na web ako štandardný používateľ prostredníctvom HTTP Autentizácie - ak to host povoľuje. Postupom času je možné vytvoriť aj pokročilé aplikácie na záznam štatistických údajov z daného webu. Napríklad teplota z niektorej meteo stránky, kurz bitcoinu, štatistika športových zápasov a pracovať s týmito dátami je možné po celé roky.

Jednu stránku môže prehliadať aj niekoľko dosiek súčasne, obecne používam jednu návštevu raz za 6 - 24 hodín, ak sa jedná napríklad o stránky týkajúce sa správ, z čoho je možné následne tvoriť RSS feed, ktorý sa dá umiestniť na môj web, alebo mať podobné využitie. Spracované údaje sa môžu okamžite ukladať do databázy, tabuliek v xml, či csv formáte a tie použiť prakticky ihneď.
Dúfam, že sa vám článok páčil a naučili ste sa jedno z nových využití Arduina, ESP dosiek a otvoreného hardvéru celkovo.

Získavanie dát je dnes žiadané a možno tento spôsob získavania dát bude mať za následok v budúcnosti vybudovanie fariem, kde sa podobný hardvér na získavanie využije a spracovanie dát prebehne už v backende danej farmy, ktorá môže s dátami obchodovať, tvoriť miliónové zoznamy e-mailových adries, telefónnych čísel.


*Použitie dát z iného webu a ich sťahovanie musí byť povolené aj z druhej strany
Niečo viac o mojom scraperi na NodeMCU: https://arduino.php5.sk/web-scraper.php
Na čítanie obsahu webu stačí použiť príklad Webclienta (Arduino) a upraviť si ho podľa seba: https://www.arduino.cc/en/Tutorial/WebClient
(ESP8266 HTTP): https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiClient/WiFiClient.ino
(ESP8266 HTTPS): https://gist.github.com/9SQ/200c796672b0f4db173e
(ESP32 HTTP): https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClient/WiFiClient.ino
(ESP32 HTTPS): https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFiClientSecure/examples/WiFiClientSecure/WiFiClientSecure.ino
(ESP32 pod 802.1x HTTP): https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino

ESP8266 Web scraper

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
const char * ssid = "my_ssid";
const char * password = "my_pass";
const char * host = "www.cielovyweb.sk";
const int httpsPort = 443;
const char* fingerprint = "‎‎a6 02 4d e1 32 b0 0b fe 56 85 0f 84 03 ec b2 18 23 09 f0 63;
String inData;
void setup() {
  Serial.begin(500000);  //high datarate
  Serial.println();
  IPAddress ip(192, 168, 2, 50);
  IPAddress gateway(192, 168, 2, 20);
  Serial.print(F("Setting static ip to : "));
  Serial.println(ip);
  IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your
  WiFi.config(ip, gateway, subnet);
  Serial.println("pripajam na ");
  Serial.println(ssid);
  WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
  while (WiFi.status() != WL_CONNECTED) { //pokial sa nepripojime na wifi opakuj pripajanie a spustaj funkcie pre ovladanie v offline rezime
    delay(500);
    Serial.println(".");
  }
  Serial.println("");
  Serial.println("WiFi pripojene"); //uspesne pripojenie na wifi siet
  Serial.println("IP adresa: ");
  Serial.println(WiFi.localIP()); // pridelena IP adresa pre dosku
  index();
}
void index() {
  WiFiClientSecure client; //HTTPS client
  if (client.verify(fingerprint, host)) {} else {}
  if (client.connect(host, httpsPort)) {
    Serial.println("Connected to server!");
    String url = "/";
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");


    // if there are incoming bytes available
    // from the server, read them and print them:
    while (client.available()) {
      char thisChar = client.read();
      inData += thisChar;


      // echo to the server what's been received to confirm we have the string
      if (thisChar == '\n')
      {
        Serial.print("\nreceived:");
        Serial.print(inData);
        HTTPClient http;
        http.begin("https://www.arduino.php5.sk/connect.php");
        http.addHeader("Content-Type", "application/x-www-form-urlencoded");
        http.POST("c=" + inData);
        http.writeToStream(&Serial);
        http.end();
        inData = "";
      }
    }
    client.stop();
    Serial.println("Vsetko");
  } else {
    Serial.println("Nepripojene");
  }
}
void loop() {

}         
© 2024-2025 Arduino Blog - Všetky práva vyhradené.
Vytvorené službou Webnode Cookies
Vytvorte si webové stránky zdarma! Táto stránka bola vytvorená pomocou služby Webnode. Vytvorte si vlastný web zdarma ešte dnes! Vytvoriť stránky