Sommario:

Raschiare i dati con un ESP8266/ESP32: 7 passaggi
Raschiare i dati con un ESP8266/ESP32: 7 passaggi

Video: Raschiare i dati con un ESP8266/ESP32: 7 passaggi

Video: Raschiare i dati con un ESP8266/ESP32: 7 passaggi
Video: Usare un ESP come Webserver con pagina html 2024, Dicembre
Anonim
Raschiare i dati con un ESP8266/ESP32
Raschiare i dati con un ESP8266/ESP32
Raschiare i dati con un ESP8266/ESP32
Raschiare i dati con un ESP8266/ESP32

Hai mai desiderato ottenere dati per i tuoi progetti Arduino, ma non esiste un'API pubblica per questo? O in casi come l'API di Instagram in cui il processo di installazione non è molto conveniente?

In questo Instructable esamineremo 2 diverse opzioni per raschiare i dati da un sito Web per i tuoi progetti ESP8266 o ESP32.

Passaggio 1: guarda il video

Image
Image

Ho realizzato un video che copre la stessa cosa di questo istruibile, quindi se sei interessato, dai un'occhiata!

Passaggio 2: prima di iniziare

Prima di iniziare
Prima di iniziare
Prima di iniziare
Prima di iniziare

Solo un avvertimento che i dati di cui parlerò di scraping sono dati pubblici e non richiedono alcuna autenticazione. Ad esempio, ad esempio, il mio numero esatto di iscritti a YouTube è disponibile solo per me all'interno di Creator Studio, quindi il dispositivo dovrebbe effettuare una richiesta che si è autenticato come me per caricarlo. Questo tipo di richieste non sarà compreso nell'ambito di questo video. Un rapido test per verificare se sarebbe coperto è provare a caricare la pagina in una finestra di navigazione in incognito poiché ciò non ti consentirà di accedere automaticamente a nessun sito.

Per le tecniche trattate in questo Instructable dovremo utilizzare alcuni degli strumenti per sviluppatori disponibili nei browser. Li mostrerò con Firefox, ma so per certo che Chrome ha strumenti simili e sono sicuro che anche altri browser li hanno.

Passaggio 3: API non pubbliche (spoiler: Instructables ne ha una!)

Il primo modo in cui esamineremo è l'utilizzo di un'API non pubblica. Questo non sarà sempre disponibile, ma se lo è questo è sicuramente il metodo che dovresti mirare a usare. Quello che chiamo "API non pubblica" è fondamentalmente il luogo in cui un sito utilizza un'API non pubblicizzata sul proprio sito Web dietro le quinte per recuperare i dati che stiamo cercando di ottenere.

Ci sono alcuni motivi per cui questa sarebbe l'opzione preferita da utilizzare.

  1. Il vantaggio più grande è che è improbabile che cambi con la stessa frequenza di una pagina Web, se raschi i dati direttamente dall'HTML della pagina Web, ogni volta che apportano una modifica al sito, l'analisi potrebbe interrompersi.
  2. Normalmente è più efficiente in termini di dati. Quando si esegue lo scraping di una pagina Web, si scarica l'intera pagina HTML per estrarre parti di informazioni da essa, le API restituiranno solo punti dati, quindi normalmente si tratterebbe di richieste molto più piccole.
  3. Di solito è più facile da analizzare. Normalmente le API restituiscono dati in formato JSON che è semplice da analizzare, questo è particolarmente vero se si estraggono più parti di dati.

Dobbiamo prima scoprire se la pagina web utilizza una configurazione come questa. L'indizio più grande è se il sito aggiorna il valore in tempo reale come fa su Kickstarter, ma anche se non lo fa c'è ancora speranza che possa utilizzare questa configurazione. Instructables utilizza un'API non pubblica per recuperare alcuni dati per il proprio sito anche se non si aggiorna in tempo reale.

Per verificare se il sito utilizza questa configurazione, accedi alla modalità sviluppatore del tuo browser, trovo che il modo più semplice per farlo sia fare clic con il pulsante destro del mouse sulla pagina e selezionare "ispeziona elemento".

Dovrai quindi andare alla scheda di rete, questa visualizzerà le richieste che la pagina Web effettua in background, nota che potresti dover ricaricare la pagina dopo aver aperto questa scheda perché mostrerà solo le richieste fatte da ora in poi.

Normalmente vuoi cercare quelli con il tipo "json". Possono esserci molte richieste qui, quindi potrebbe essere utile ordinare per tipo. Puoi vedere che è molto ovvio sulla pagina della campagna kickstarter che sta usando questa configurazione in quanto puoi vedere richieste costanti fatte a un endpoint "stats.json". Nella pagina degli autori di Instructables (ad esempio il mio è "https://www.instructables.com/member/witnessmenow/"), non fanno richieste costanti, ma puoi vedere nascosta tra le altre una richiesta all'endpoint "showAuthorStats".

Per scoprire maggiori informazioni su questa richiesta, puoi fare clic su di essa. Dovresti essere in grado di ottenere tutte le informazioni di cui hai bisogno da qui per replicare la richiesta. Ma prima di farlo, devi prima ricontrollare che disponga dei dati che desideri. Fare clic sulla scheda di risposta e vedere se i dati sono presenti.

Se contiene i dati di cui hai bisogno, sei a posto! Puoi quindi utilizzare gli stessi approcci discussi nel mio video precedente sulla connessione alle API. La versione breve di ciò è assicurarsi che la richiesta funzioni come previsto su uno strumento come Postman prima e quindi utilizzare questo progetto di esempio per verificare che funzioni sul dispositivo.

Per analizzare i dati JSON, consiglierei di utilizzare ArudinoJSON nella maggior parte degli scenari, se questo è qualcosa di cui vorresti essere istruito, fammelo sapere!

Passaggio 4: raschiare i dati direttamente

Raschiare i dati direttamente
Raschiare i dati direttamente
Raschiare i dati direttamente
Raschiare i dati direttamente
Raschiare i dati direttamente
Raschiare i dati direttamente

Successivamente esamineremo lo scraping dei dati direttamente dalla pagina Web, richiedendo l'intera pagina Web sul dispositivo e analizzando i dati che desideriamo. Ho già menzionato i vantaggi dell'API non pubblica rispetto a questo metodo, ma a volte le esigenze devono!

Una cosa che è importante notare qui, se hai familiarità con lo sviluppo web potresti essere abituato a utilizzare la funzione di ispezione dell'elemento per scoprire informazioni su un particolare elemento e su come è strutturato. Questo dovrebbe essere evitato per questo approccio, perché le pagine Web moderne vengono solitamente modificate dinamicamente utilizzando Javascript, cosa che non accadrà sul tuo dispositivo. Il codice HTML disponibile sul tuo dispositivo sarà solo la pagina web originale che è stata scaricata. Un buon esempio di ciò è la pagina TeamTrees, il conteggio delle donazioni correnti inizia da 0 e viene caricato nella pagina in seguito con questa animazione, ma a differenza dei due esempi che abbiamo visto prima, non carica i dati in background, quindi i dati corretti devono essere da qualche altra parte.

Per visualizzare il codice della pagina web originale è possibile fare clic con il pulsante destro del mouse sulla pagina e selezionare "Visualizza sorgente". Quindi vuoi cercare i dati particolari che desideri, quindi nell'esempio di TeamTrees quando cerchiamo il conteggio delle donazioni corrente, possiamo vedere che il conteggio effettivo è memorizzato nella proprietà data-count dell'elemento count, è qui che dobbiamo raschiare i dati da.

Devi trovare una stringa di ricerca che ti porti ai tuoi dati, è molto più facile capirlo prima di codificare per il dispositivo. Per questo esempio, la ricerca di "data-count\"" mi porta direttamente ai dati che vogliamo, il che è perfetto. Non dobbiamo preoccuparci che corrisponda anche in altri punti della pagina, perché colpirà prima quello in alto. Se hai bisogno di colpire il terzo, puoi semplicemente programmarlo per ignorare i primi 2 che hai colpito.

Se diamo un'occhiata all'esempio di TeamTrees, come prima abbiamo saltato le intestazioni della risposta e ora stiamo guardando il corpo della risposta (che è la pagina web). Quello che ritorna dal cliente è un flusso di dati. Non ci interessa nulla fino alla nostra query di ricerca, quindi facciamo un client.find. Se trova la query di ricerca, restituirà true e sposterà il flusso alla fine della query. La prossima cosa disponibile dal flusso saranno i dati che stiamo cercando, ma in questo caso non siamo sicuri di quanto tempo saranno i dati, ma sappiamo che sono tutte le informazioni tra la nostra posizione attuale nel flusso e la prossima virgola. Possiamo ottenere ciò utilizzando "client.readBytesUntil" che fa ciò che dice, legge i byte in un buffer finché non raggiunge la query specificata. Assicurati solo che il buffer in cui stai leggendo sia abbastanza grande da contenere tutti i dati, penso che siamo abbastanza al sicuro qui con 32!

Se disponi di tutti i dati di cui hai bisogno, non è necessario leggere più dati. Non ho chiuso la connessione qui perché non sembrava causare problemi su ESP8266, sembrava causare problemi con ESP32, quindi ho aggiunto un client.stop(). Ad essere completamente onesto, non sono sicuro del motivo per cui l'ho messo in cima al metodo, penso che avrebbe più senso chiuderlo una volta che hai i dati che desideri.

Passaggio 5: raschiatura dei dati utilizzando un server esterno:

Raschiare i dati utilizzando un server esterno
Raschiare i dati utilizzando un server esterno
Raschiare i dati utilizzando un server esterno
Raschiare i dati utilizzando un server esterno

Solo un altro argomento su cui toccare, ci sono strumenti molto migliori per l'analisi su normali ambienti basati su computer come NodeJS che su un micro controller, quindi a volte potrebbe avere senso creare un servizio che recupera i dati da una pagina Web e fornisce un più semplice endpoint per ESP8266 o ESP32. Un esempio di ciò è stato il raschiamento della pagina CrowdSupply per ottenere un conteggio in tempo reale di quanti TinyPICO sono stati venduti. Potrebbe essere stato possibile ottenerlo direttamente su un ESP8266 o ESP32, ma poiché stava analizzando più punti dati diversi su diversi elementi, sarebbe stato complicato.

Ho finito per creare un progetto NodeJS e ho analizzato i dati usando una libreria chiamata cheerio e ha funzionato molto bene. Ho ospitato questo progetto su un server cloud che avevo già, ma potresti eseguire questo tipo di progetto su un pi se non avessi qualcosa del genere.

Passaggio 6: limiti di utilizzo

Limiti di utilizzo
Limiti di utilizzo

Una cosa che potrebbe potenzialmente avere un impatto su tutti questi approcci è raggiungere i limiti di utilizzo dei siti. Nelle API normali è normalmente abbastanza ben documentato quante richieste puoi fare al minuto o al giorno e puoi limitare le richieste dei tuoi progetti in base a questo. Quando stai raschiando, non sai quali sono questi limiti, quindi corri il rischio di colpirli e potenzialmente di essere bloccato. Non posso dare alcun consiglio esatto su come limitarlo in modo da rimanere nei loro buoni libri, ma penso che qualsiasi cosa sotto ogni minuto sarebbe troppo spesso, a parte forse casi come kickstarter in cui sembrano fare richieste ogni pochi secondi da soli.

Passaggio 7: grazie per la lettura

Speriamo che questo video sia stato d'aiuto se sei interessato all'analisi dei dati direttamente dalle pagine Web sul tuo ESP8266 o ESP32. Hai altre domande sull'argomento che non ho trattato? Per favore fammelo sapere nei commenti qui sotto, o unisciti a me e a un gruppo di altri creatori sul mio server Discord, dove possiamo discutere di questo argomento o di qualsiasi altro creatore correlato che hai, le persone sono davvero utili lì, quindi è un ottimo posto dove appendere fuori

Vorrei anche ringraziare enormemente i miei sponsor Github che aiutano a supportare quello che faccio, lo apprezzo davvero. Se non lo sai, Github sta abbinando le sponsorizzazioni per il primo anno, quindi se fai una sponsorizzazione la abbineranno al 100% per i prossimi mesi.

Grazie per aver letto!

Consigliato: