Nei precedenti capitoli abbiamo introdotto il termine ricetta (recipe). Quasi tutti i software per lo scraping utilizzano questa parola per definire l’insieme delle impostazioni per catturare elementi da estrarre da una pagina web. In pratica il record-tipo (detto recordset) desiderato per il file di output o ancora più semplicemente le colonne del file finale.
Free e Batch Data Collector ampliano questo concetto integrando nelle recipe tutta una serie di regole e azioni da compiere per ottenere non solo un’estrazione di dati, ma anche una pre-elaborazione degli stessi.
Per ciascuna colonna fanno parte delle ricette:
- funzioni di esclusione di un dato raccolto qualora esso non fosse conforme a specifiche regole;
- funzioni di sostituzione di stringhe o parte di esse, per manipolare il dato raccolto;
- funzioni di divisione di stringhe in presenza di uno o più caratteri;
- funzioni di selezione di una sottoparte di stringa che si desidera separare;
- funzioni di aggiunta di prefissi e suffissi a valori raccolti;
- funzioni di cattura del testo compreso tra due sequenze di testo;
- funzioni di deduzione automatica di informazioni complesse quali numeri di telefono, lingua della pagina, indirizzo della pagina, indirizzo inizialmente richiesto…
A corredo di quanto appena indicato, specifichiamo che una risorsa in Internet è accessibile tramite un indirizzo che è tecnicamente denominato URL (Uniform Resource Locator, ovvero una sequenza di caratteri che definisce una posizione in una rete di computer) o più generalmente URI (Uniform Resource Identifier), ovvero una risorsa ovunque essa si trovi.
Per ogni record-tipo (recordset) fa parte della ricetta anche l’elenco degli eventi o azioni da compiere prima, durante e/o dopo l’estrazione. Esempi tipici potrebbero essere clic a collegamenti sulla pagina, compilazioni automatiche di campi di testo, intere sostituzioni di parte di codice, definizione di cicli. Un ciclo tipico potrebbe essere l’auto-navigazione di un insieme di pagine successive, dalla prima all’ultima, e l’esecuzione dell’azione di estrazione dati dopo ogni caricamento. Percorsi di lavoro (workflow) più complessi potrebbero includere azioni dipendenti da condizioni SE (IF), soppressione di parti di codice sorgente, pause, scroll-down, manipolazione delle variabili d’ambiente quali l’esecuzione di Javascript (un linguaggio molto usato nelle pagine web) o il caricamento di immagini.
Tornado alle colonne, ognuna farà riferimento ad elementi sulla pagina web denominati nodi. I nodi possono essere espressi attraverso selettori CSS.
Il CSS (Cascading Style Sheets) è un linguaggio utilizzato per definire lo stile visivo degli elementi HTML, XHTML e XML e quindi più banalmente anche lo stile di una qualunque pagina web. Prima della sua introduzione, Internet era un insieme disordinato di pagine il cui codice mescolava contenuto a istruzioni di formattazione. Alcuni di voi ricorderanno la guerra dei browser: ciascun produttore introduceva le proprie istruzioni indipendentemente dagli altri. L’assenza di regole aveva dato vita ad un’anarchia della programmazione i cui sconfitti erano i fruitori. Finché nel 1996 il W3C decise di standardizzare il settore creando delle vere e proprie linee guida. L’accettazione delle stesse passa attraverso vent’anni di battaglie industriali e ci restituisce oggi un web sempre più aderente a regole chiare e dunque sempre più interrogabile con mezzi diversi.
Ciò che si stabilisce con l’adesione a XHTML e CSS è, in breve, il rispetto di una logica gerarchica nel codice e la separazione tra elementi visivi di stile e contenuto. Intorno al tag ruota tutta la rivoluzione delle nuove regole. Il tag non è altro che una parola chiave, con un preciso significato rispetto ad un linguaggio, racchiusa tra i simboli “<” e “>”.
Sono tag, per l’XHTML, ad esempio, “<br />”, che consente di far effettuare all’interprete del browser un ritorno a capo, oppure i tag “<p>” e “</p>”, che rappresentano l’apertura e la chiusura di un paragrafo. Non elencheremo, se non in modo molto superficiale, tutti i tag previsti per l’HTML. Vi basti sapere che tra le regole fondamentali stabilite dal W3C ce n’è una che invita a chiudere ogni tag aperto. Sempre. Non potrà dunque mai esistere un tag “<div>” senza il corrispondente “</div>”.
Ogni tag è dotato di attributi. Per attributo si intende un insieme di dettagli che descrivono un elemento. Facciamo un esempio fittizio, utilizzando l’elemento di fantasia “pietanza”.
<pietanza peso=”20″ temperatura=”60″ calorie=”360″ ingredienti=”peperoni,zucchine,melanzane,pesce” id=”pietanza_1″ class=”secondipiatti”></pietanza>
Nell’esempio sopra peso, temperatura, calorie, ingredienti, id e class sono gli attributi del tag pietanza. La pietanza è correttamente definita in quanto al suo tag di apertura corrisponde quello di chiusura (</pietanza>). Il codice è detto ben formato (well-formed) e più è tale più sarà adatto a qualunque device e software e più sarà possibile agganciare le sue parti ad una ricetta.
Tra gli attributi sopra elencati ne esistono due non di fantasia: id e class.
Gli id sono identificatori univoci che riconducono ad uno e un solo tag all’interno di un tracciato HTML. Non possono esistere due tag con lo stesso id, a meno di essere in presenza di un codice di bassa qualità.
Le class non sono altro che classi di elementi, banalmente gruppi, accomunati da proprietà grafiche simili. Per esempio in una pagina web potrebbero appartenere alla stessa classe tutti i link accomunati dallo stesso colore e stesso aspetto. O tutti i pulsanti o tutti i titoli del corpo del testo.
Nella stesura di un selettore CSS, un id è sempre premesso dal simbolo “#” (cancelletto o hashtag), mentre una class dal simbolo “.” (punto o dot).
Pertanto, tornando all’esempio sopra, possiamo agganciare ad una ricetta il nostro elemento immaginario <pietanza> attraverso i seguenti selettori:
- pietanza
- #pietanza_1
- .secondipiatti
- #pietanza_1.secondipiatti
- pietanza#pietanza_1
- pietanza.secondipiatti
Tanti modi diversi, alcuni univoci, altri no. Il primo, ad esempio, non è univoco in quanto potrebbero esistere tanti tag <pietanza>. Il secondo, per definizione di id, è senz’altro univoco.
Perché scegliere un elemento univoco o uno ripetitivo? Dipende. E’ chiaro che se la ricetta da creare dovrà catturare un testo presente una volta sola nella pagina, il selettore univoco sarà raccomandato. Ma se dovrà agganciare più righe di una tabella sarà senz’altro necessario usare un selettore ripetitivo.