[MalaWiki] [TitleIndex] [WordIndex]

PowerBrowsingBfi

Go back to PowerBrowsing

, - " ^ " - , . _ . , - " ^ " - , . _ . , - " ^ " - , . _ . , - " ^ " - , . 
~WhatYouSeeIsWhatYouChose~WhatYouSeeIsWhatYouChose~WhatYouSeeIsWhatYouChose~ 
 
                               POWERBROWSING 
                                  v1.1.0 
                              +mala, 20040715 

~WhatYouSeeIsWhatYouChose~WhatYouSeeIsWhatYouChose~WhatYouSeeIsWhatYouChose~ 
, - " ^ " - , . _ . , - " ^ " - , . _ . , - " ^ " - , . _ . , - " ^ " - , . 

1.  INTRO
1.1 Come navigate ora? 
1.2 Come funziona, invece?
1.3 Note
2.  TECNOLOGIE
2.1 Perche' conoscere HTTP? 
2.2 Perche' conoscere HTML? 
3.  PB TECHNIQUES: tools and basics
3.1 Alternative browser
3.2 Leecher e Teleporter
3.3 Spider e scraper
3.4 Proxy-like software
4.  PB TECHNIQUES: advanced
4.1 Impara a cercare
4.2 Esperimenti con curl
4.3 Oneliner con wget e linx
4.4 Fight Against Flash
5.  Bot Basics
5.1 Detecting Web Patterns
5.2 Website navigation with bots
5.3 Data Extraction
6.  Perl PowerBrowsing Tools
6.1 Perche' Perl? 
6.2 Perl Packages 
6.3 LWP::Simple
6.4 LWP::UserAgent
7.  Condividete i vostri dati
7.1 Il Web e RSS
7.2 La mail
7.3 Il package Net::Blogger
7.4 TWO
8.  Esempi


=============================================================================  
1. INTRO  
-----------------------------------------------------------------------------  

Cos'e' il powerbrowsing? Il testo che leggete attorno al titolo costituisce
una buona spiegazione di questa parola: accedere ai contenuti del Web vedendo
solo quello che decidete di vedere. Anche se questa puo' sembrare una 
operazione semplice da portare a termine, in realta' non lo e' affatto e,
sicuramente, in futuro diventera' sempre piu' complessa, a meno che non
diventiate dei "powerbrowser".
Questo testo cerca di spiegare come funziona attualmente il Web e come
potete fare powerbrowsing, utilizzando strumenti gia' pronti o creandone
di nuovi per venire incontro alle vostre esigenze.


1.1 Come navigate ora? 
-----------------------------------------------------------------------------  

Come naviga, ora, la maggior parte di voi? Molto probabilmente utilizzate il
browser predefinito del vostro sistema operativo, il che nella maggior parte
dei casi significa Internet Explorer. La possibilita' di personalizzare il 
modo in cui vedete i contenuti delle pagine Web e' limitata dalle opzioni 
che il browser vi mette a disposizione, quindi probabilmente scaricate sempre
tutte le immagini presenti in un sito e i contenuti attivi tipo Flash e 
applet Java, vedete sempre piu' pubblicita' all'interno delle pagine Web e
vi capita di dover chiudere tonnellate di popup quando visitate alcuni siti.

Sono sicuro, pero', che i piu' permalosi fra voi si staranno scandalizzando
per la mia generalizzazione, perche' usano un altro browser, anzi magari
addirittura un altro sistema operativo! Lasciatemi indovinare, pero': voi
seguite comunque i link che il browser (qualunque esso sia) vi mostra, vedete
le pagine all'interno di finestre scelte da lui e accedete solo agli URL che 
lui decide di farvi vedere. In alcuni casi, per raggiungere le informazioni
che vi interessano dovete seguire dei percorsi prefissati all'interno di un
sito (un po' come negli Autogrill... e ogni sito, naturalmente, ha la sua
"noce di pepe"). E per finire, scaricate sempre e comunque molto piu' codice 
HTML di quanto non ve ne serva in realta': magari non lo vedete, ma state 
certi che il vostro modem se ne accorge!

Ma in fin dei conti perche' preoccuparsi? Magari non e' esattamente quello 
che desideravate, ma i modem son sempre piu' veloci e poi questo e' quello 
che c'e' e non si puo' mica cambiarlo piu' di tanto...


1.2 Come funziona, invece?
-----------------------------------------------------------------------------  

Ehi, sveglia! Ho una notizia per voi: un computer NON E' una televisione! Si
suppone che esso faccia quello che _voi_ gli chiedete, non quello che _altri_
gli dicono di fare. Inoltre, le cose non sono sempre come vi appaiono: prima
della fine di questo testo, vi renderete conto che e' possibile accedere 
direttamente a cio' che il browser di solito non vi mostra e nascondere cio' 
che invece siete solitamente costretti a vedere.

Ora, pensate alla possibilita' di scaricare un decimo dei dati che di solito
scaricate, saltando pubblicita' e popup, conservando tutte le informazioni
che vi interessano (e solo quelle) sul vostro computer, con la possibilita'
di rivederle, una volta scollegati, in modo semplice, personalizzato e piu'
efficace. Pensate al fatto che, una volta che queste informazioni stanno sul
vostro PC, voi potete scrivere dei programmi che le elaborano per produrre
nuove informazioni ancora piu' interessanti. Infine, valutate la possibilita'
di mettere questi dati a disposizione di chiunqe, magari in modo automatico.
Tutto questo assieme e' cio' che io chiamo powerbrowsing!


1.3 Note
-----------------------------------------------------------------------------  

Forse alcuni di voi storceranno il naso leggendo espressioni come "fare 
powerbrowsing" o "essere dei powerbrowser". Ebbene, questa e' (forse neanche
la peggiore) conseguenza del fatto che questo testo e' nato originariamente
come semplice serie di slide, da presentare in lingua inglese. Quindi, vi
prego, portate pazienza :)

Parlando di conseguenze, mi sembra il caso di citarne altre: innanzitutto, la
presentazione doveva essere rivolta a un pubblico vario e cosi' e' anche il
testo che state leggendo. Questo significa che mentre alcuni di voi potranno
trovare una parte del tutorial interessante e il resto incomprensibile, altri
invece potranno annoiarsi per un bel po' prima di leggere qualcosa che li
stimoli, mentre altri ancora non troveranno fra queste righe nulla che valga 
la pena ricordare. A tutti quanti consiglio di saltare le parti meno gradite
e, in caso non rimanga nulla, poco male per voi: avete sicuramente speso meno
tempo a leggere di quanto io ce ne abbia messo per scrivere tutto.

Infine, mi sembra assolutamente d'obbligo citare il libro "Spidering Hacks",
di Tara Calishain e Kevin Hemenway (aka Morbus Iff), edito da O'Reilly, che
mi ha dato diverse idee interessanti e che chiunque abbia intenzione di 
creare dei bot secondo me dovrebbe leggere (e, perche' no, anche ACQUISTARE, 
se ritenete che l'autore lo meriti). Esso, tra l'altro, ha anche delle note
molto interessanti riguardanti la netiquette dei bot, che condivido e che
purtroppo non ho avuto tempo di inserire in questa versione del testo.


=============================================================================  
2. TECNOLOGIE
-----------------------------------------------------------------------------  

Per essere in grado di capire cosa succede all'interno del vostro PC quando
scaricate una pagina Web, dovreste conoscere le tecnologie a cui si appoggia
tutto il Web. All'interno di questo testo verranno date per scontate le basi
di HTTP e HTML, tuttavia cerchero' di spiegare almeno i concetti principali
con cui verrete in contatto. 
Poiche', pero', cio' che scrivo potrebbe avere anche dei riferimenti a dei
concetti piu' avanzati, eccovi un paio di link a siti che potreste trovare
utili:
  
http://www.w3.org/MarkUp/    (everything you need to know about HTML)  
http://www.w3.org/Protocols/ (everything you need to know about HTTP)  


2.1 Perche' conoscere HTTP? 
-----------------------------------------------------------------------------  

In realta' non tutti i dettagli relativi a questo protocollo vi saranno
indispensabili. Tuttavia, piu' avanti nel testo sentirete parlare di alcuni
concetti, piu' o meno legati al protocollo HTTP, e conoscerne gia' il 
significato vi aiutera' a capire meglio cosa saranno in grado di fare i 
vostri bot in Perl. Inoltre, sapere quali dati il vostro computer scambia
con i server a cui si collega vi aiutera' a creare dei bot piu' stabili e,
soprattutto, sicuri.

GET e POST
----------
I "metodi" GET e POST sono i primi due termini che prenderemo in esame: essi
corrispondono ai due diversi modi in cui il vostro browser richiede dati al 
server. Senza entrare troppo nei dettagli, le caratteristiche principali dei
due metodi sono le seguenti:

- GET puo' essere utilizzato sia per richiedere una pagina statica sia per
  inviare parametri a una pagina generata dinamicamente (CGI, PHP e cosi'
  via). L'URL classico di una GET e' quello del tipo

  http://www.sito.web/pagina.php?parametro1=valore1&parametro2=valore2

  che ogni tanto vi capita di leggere nella barra degli indirizzi del vostro
  browser. La quantita' di dati che potete inviare con una GET e' abbastanza
  limitata, inoltre e' bene tenere presente che i parametri inviati con una
  GET vengono solitamente salvati (anche) all'interno dei log del server Web.

- POST viene utilizzato solo nel caso in cui si desideri inviare dei dati al
  server Web. La quantita' di byte che potete inviare e' superiore a quella
  di una GET e nei log del server verra' salvato solo l'URL a cui POSTate
  dati, e non i dati stessi. Questo particolare e' da tenere a mente se, ad
  esempio, desiderate creare dei bot che si logghino automaticamente dentro 
  a un sito: tenete presente, tuttavia, che se la connessione e' in chiaro 
  la vostra login e la vostra password non saranno necessariamente al sicuro.

Referer
-------
Fra i vari parametri che vengono solitamente passati insieme a una richiesta
GET o POST, se arrivate a una pagina seguendo un link i browser solitamente 
inviano al server anche il referer, cioe' l'URL del sito da cui state 
provenendo. In questo modo e' possibile per il server verificare che voi 
stiate effettivamente eseguendo un certo script dal sito stesso e non in 
locale, oppure creare delle statistiche in base a quanti utenti provengono 
da quale sito. 

User-Agent 
----------
Lo User Agent e' il software che si collega per vostro conto al server e che
dialoga con esso richiedendo pagine Web e ricevendole in risposta. In realta'
tale nome e' utilizzato piu' che altro per la stringa con cui il programma 
(che puo' essere un browser o un'altro tipo di applicazione) si identifica 
con il server. A volte, proprio in base a questa stringa alcune applicazioni 
vengono tagliate fuori da siti che, ufficialmente, sono "ottimizzati" per un 
particolare browser. I browser piu' intelligenti (se ve lo state chiedendo,
NO, Internet Explorer non e' tra questi) consentono di identificarsi in modi
differenti, e se avete intenzione di scrivere qualche applicazione seria per
il Web dovreste contemplare anche voi questa possibilita'.

Cookie 
------
I cookie sono dei file di testo che vengono salvati automaticamente dal 
browser sul vostro disco. Essi contengono informazioni di vario genere, il
piu' delle volte relative alle vostre precedenti connessioni a un sito o alla
vostra autenticazione. Per questo motivo, i cookie sono spesso mal visti da 
chi (a ragione) desidera proteggere la propria privacy. Tuttavia, essi sono
usati praticamente ovunque e alcuni siti non funzionano se l'applicazione che
si collega ad essi non li supporta.

Proxy 
-----
I proxy sono programmi che "girano" le richieste che partono dalle vostre 
applicazioni Web ai server desiderati e restituiscono al client le risposte 
di questi server. Il loro funzionamento puo' essere riassunto da questo
schema:


    +---------+                +---------+                +---------+
    |         |   richiesta    |         |   richiesta    |         |
    |         |--------------->|         |--------------->|         |
    | CLIENT  |                |  PROXY  |                | SERVER  |
    |         |<---------------|         |<---------------|         |
    |         |   risposta     |         |   risposta     |         |
    +---------+                +---------+                +---------+


L'utilita' dei proxy e' dovuta a vari motivi: 

- al client potrebbe essere precluso l'accesso al server, ma non al proxy: in
  questo caso, le applicazioni che girano sul client potrebbero ugualmente
  comunicare col server tramite il proxy

- alcuni proxy hanno una cache, all'interno della quale vengono salvati i
  file richiesti piu' di frequente. Se, allora, la connessione fra client e
  proxy e' molto piu' veloce di quella fra client e server allora si possono
  scaricare i file in cache molto piu' rapidamente

- alcuni proxy non rivelano al server il vero mittente della richiesta, in
  modo da poter rendere la connessione anonima per il client

- piu' avanti, vedremo come e' possibile sfruttare i proxy per ottenere altri
  vantaggi, addirittura piu' interessanti.


2.2 Perche' conoscere HTML? 
-----------------------------------------------------------------------------  

Perche' tutto quello che il vostro browser vi fa vedere ha un suo sorgente
HTML, scritto a mano da qualcuno, generato da un programma oppure da uno 
script. Anzi, oltre a conoscere semplicemente le basi di HTML dovreste essere 
in grado di capire se del codice viene generato automaticamente o meno, in 
modo da poter utilizzare tag ricorrenti per spezzettare il contenuto di una 
pagina ed estrapolarne i contenuti. 

Poiche' all'interno dei siti dinamici i form la fanno da padroni, un po' di
tempo dovreste dedicarlo anche per capire come funziona questa tecnologia. In
realta' non si tratta di nulla di complicato, tuttavia un po' di esperienza 
sul campo vi permettera' non solo di padroneggiare la sintassi, ma anche di 
comprendere appieno il funzionamento di un sito. E senza particolari tecniche
intrusive, ma solo grazie alla conoscenza di form e html (e magari un po' di 
cervello), sarete in grado di far fare a uno script molto piu' di quanto si 
ritenga normalmente possibile.


=============================================================================  
3. PB TECHNIQUES: tools and basics
-----------------------------------------------------------------------------  

Di strumenti gia' pronti per fare powerbrowsing ce n'e' un sacco in giro,
disponibili gratuitamente (o, se proprio insistete, anche a pagamento), per
qualsiasi sistema operativo. Descriverli uno per uno sarebbe praticamente 
impossibile, ma possiamo perlomeno cercare di raggrupparli per tipologia e
descrivere le caratteristiche principali di ogni categoria.


3.1 Alternative browser
-----------------------------------------------------------------------------  

I browser alternativi sono, fondamentalmente, tutti quelli diversi da una 
qualsiasi versione di Internet Explorer. Sebbene non siano la soluzione 
definitiva ad ogni problema, essi sono comunque un primo passo verso la 
liberazione del vostro sistema dai contenuti non richiesti, come ad esempio
i banner pubblicitari, i menu in flash e le finestre popup.

Opera, ad esempio, vi permette di attivare o disattivare il caricamento di 
tutte le immagini di una pagina (o di tutte quelle che non sono presenti in 
cache, nella fattispecie i banner) con un semplice clic, mentre per eseguire
la stessa operazione con Internet Explorer dovete perdervi all'interno dei 
menu di configurazione. Lo stesso browser vi permette anche di attivare o
disattivare al volo Javascript o altri contenuti dinamici presenti nelle
pagine Web. Allo stesso modo, infine, potete impostare una modalita' di
visualizzazione personalizzata delle pagine, con caratteri e colori scelti 
da voi anziche' quelli decisi da chi ha creato il documento originale.

Fra i browser grafici, ultimamente si parla molto bene anche di Firebird. Io
ancora non l'ho provato, quindi mi aspetto feedback numerosi e "powerbrowsing
hints" riguardanti questo browser. Ad ogni modo, senza andare troppo lontano,
anche Mozilla e' per vari motivi una scelta migliore di MSIE: rispetto ai
browser piu' recenti, inoltre, esso garantisce una maggiore compatibilita'
con buona parte dei siti Web, al prezzo pero' di una maggiore pesantezza nel
codice.

Se, invece, quello che vi interessa e' solo il testo di una pagina Web,
potete considerare la possibilita' di utilizzare un browser testuale come 
lynx o links o w3c: la velocita' con cui le pagine, private di tutti i 
contenuti pesanti, verranno scaricate vi sorprendera'. Inoltre, come potrete 
vedere in seguito, la possibilita' di richiamare il contenuto di una pagina 
Web dalla linea di comando apre la strada a diversi utilizzi piu' efficaci,
anche se forse meno convenzionali, delle informazioni provenienti dal Web.


3.2 Leecher e Teleporter
-----------------------------------------------------------------------------  

I termini con cui viene definita questa categoria di programmi derivano
rispettivamente da "leech" (sanguisuga) e da "teleport" (letteralmente
teletrasporto, ma e' anche il nome di un programma -Teleport Pro- usato per 
il mirroring locale dei siti Web). Queste applicazioni permettono di salvare
grandi quantita' di file sul vostro disco, effettuando la copia completa di
un sito Web o prelevandone solamente i contenuti che a voi interessano.

Anche in questo caso, c'e' stato un tale proliferare di applicazioni che e'
praticamente impossibile stare dietro a tutte. Personalmente, quelle con cui
mi son trovato meglio nel corso degli anni sono state Teleport Pro e GetRight
per Windows, wget, curl e lynx sotto Linux. In realta', la distinzione fra
Windows e Linux si e' andata affievolendo, in quanto le applicazioni di un OS
girano ora senza problemi anche sull'altro: il risultato e' che ora i tool 
che uso piu' di frequente sono wget, lynx e GetRight (comodissimo per il suo
"GetRight browser", che si collega a una pagina e ne visualizza tutti i file
collegati permettendo di scaricare solo quelli che veramente interessano).

Un approfondimento a parte merita lynx: esso, pur essendo un browser, e' 
finito anche in questa categoria poiche', grazie agli switch -source e -dump 
e alla possibilita' di essere concatenato con altri programmi, e' in grado di
funzionare anche come leecher e di recuperare file o informazioni in modo
molto efficiente (piu' avanti, nella sezione 4.3, potrete vederne alcuni 
esempi).


3.3 Spider e scraper
-----------------------------------------------------------------------------  

Visto che fino a qualche mese fa neanch'io avevo presente questa distinzione,
ho deciso di recuperare (grosso modo) la definizione che avevo letto su 
"Spidering Hacks" e che mi illumino':

- gli "spider" sono programmi che recuperano dati dal Web in modo automatico.
  Solitamente, essi sono piu' intelligenti dei teleporter (nel senso che non
  si limitano a seguire tutti i link che trovano, ma possono selezionarli in
  base a qualche particolare algoritmo) e tendono a scaricare l'intero 
  contenuto delle pagine;

- gli "scraper" sono programmi che estraggono solo alcune parti specifiche 
  dalle pagine Web. In realta' spesso essi devono comunque scaricare ogni
  pagina per intero, tuttavia i dati salvati riguardano solo le informazioni
  "interessanti" e non l'intero contenuto delle pagine.

Trovare in giro spider e scraper pronti da utilizzare non e' semplicissimo,
tuttavia ce n'e' qualcuno degno di nota: ad esempio, liberopop (con tutte le
sue varianti) e' un programma che consente di scaricare tramite il proprio
client di posta elettronica i messaggi ricevuti su una casella email di
libero, provider che da un po' di tempo ha lasciato il solo accesso Web per
la consultazione della posta. La cosa che mi e' piaciuta maggiormente di
liberopop e' la sua struttura (ehi, ma e' uguale a quella dei proxy!)


     +---------+             +----------+             +---------+
     |         | rich POP3   |          |  rich HTTP  |         |
     |         |------------>|   POP3   |------------>|         |
     | CLIENT  |             | EMULATOR |             | SERVER  |
     |         |<------------|          |<------------|   WEB   |
     |         | risp POP3   |          |  risp HTTP  |         |
     +---------+             +----------+             +---------+


praticamente identica a quella di un mio vecchio programma (ANO - Another
Non-working Offline forum reader), che consentiva la consultazione, tramite 
il proprio client di posta, dei forum via Web. Un'evoluzione di ANO e' TWO 
(The Working Offline forum reader), uno scraper che verra' descritto piu' in 
dettaglio nella sezione 7.2.


3.4 Proxy-like software
-----------------------------------------------------------------------------  

I programmi di questa categoria sfruttano l'architettura di un server proxy 
per ottenere risultati diversi da quelli che normalmente ci si aspetterebbe
da un'applicazione del genere. Grazie alla loro posizione intermedia fra
client e server, infatti, essi possono operare sui dati le operazioni piu'
diverse, ad esempio filtrando le informazioni provenienti dal server e 
conservando solo cio' che vi interessa, oppure modificando al volo l'aspetto 
delle pagine che scaricate; allo stesso modo, essi possono elaborare le 
informazioni che voi mandate al server per riutilizzarle in un secondo tempo,
automatizzando le classiche procedure di inserimento dati all'interno di un
form o la navigazione di un sito.

Un esempio del primo tipo di proxy (quello, cioe', che rielabora i dati che
provengono dal server) e' costituito da Proxomitron, una piccola applicazione
per Windows che vi permette di filtrare le pagine Web, eliminando tutto cio'
che non vi va (banner pubblicitari, popup, javascript, spyware) e cambiandone
l'aspetto anche in modo radicale. Poiche' l'applicazione ha il grosso limite
di funzionare solo con il sistema operativo di Microsoft, un gruppo di 
valenti reverser sta lavorando a un progetto, chiamato Philtron, che mira a 
replicare il funzionamento di proxomitron e ad aggiungergli nuove funzioni.
Il linguaggio scelto per lo sviluppo e' PHP e il gruppo si sta coordinando
all'interno dei forum 

http://fravia.2113.ch/phplab/mbs.php3       (PHPLabs)
http://fravia.2113.ch/phplab/mbs.php3/mb001 (Seeker's messageboard)

Per quanto riguarda il secondo tipo di proxy, un esempio' e' offerto da Web 
Scraping Proxy: quest'applicazione Perl e' in grado di "registrare" tutto 
cio' che voi fate all'interno di un sito, quindi crea automaticamente il
codice sorgente di un bot in perl che replichera' tutte le vostre azioni. Per
avere qualche informazione in piu' su questo programma, potete dare uno
sguardo al sito

http://www.research.att.com/~hpk/wsp

oppure vedere il relativo "hack" (il numero 30) su Spidering Hacks.


=============================================================================  
4. PB TECHNIQUES: advanced
-----------------------------------------------------------------------------  

Le tecniche di powerbrowsing piu' avanzate non si limitano all'utilizzo, per
quanto avanzato, di un singolo programma, ma tendono a sfruttare sia le 
conoscenze acquisite dai navigatori sia le potenzialita' di uno o piu' tool
(gia' esistenti o creati ad hoc). In questo modo i risultati che si ottengono
sono dei nuovi strumenti, decisamente piu' potenti ed efficaci. Procedendo
verso gli esperimenti piu' complessi, inoltre, potrete notare come ci 
sposteremo lentamente dal semplice scaricamento di file al piu' generale
(e, per quanto mi riguarda, piu' interessante) recupero di _informazioni_.

Chiaramente, l'abilita' del powerbrowser gioca qui un ruolo fondamentale e i
risultati saranno tanto migliori quanto maggiore sara' la vostra esperienza.
Tuttavia, gia' con le poche, semplici indicazioni che seguono potrete trovare
e scaricare molto piu' facilmente cio' che piu' vi interessa. 

A proposito degli esempi, tenete presente che come tali essi non hanno la
presunzione di essere particolarmente utili nella pratica. Anzi, data la
rapidita' con cui le informazioni sul Web cambiano alcuni di essi potrebbero
non funzionare neanche piu'. Non scoraggiatevi: leggeteli, capiteli, provate
a riadattarli e avrete sicuramente qualcosa in piu' che poche righe di 
codice.


4.1 Impara a cercare
-----------------------------------------------------------------------------  

Come sicuramente avrete gia' intuito, per riuscire a vedere solo cio' che 
desiderate e' anche necessario, prima, _trovare_ cio' che desiderate. In 
altri casi, invece, sapete gia' dove si trova quel file che volevate 
scaricare, ma per qualche motivo non volete collegarvi al sito in cui e' 
salvato (ad esempio, perche' e' a pagamento): anche in questo caso, saper 
cercare vi aiutera' a trovare siti alternativi da cui scaricare lo stesso 
file.

Un primo consiglio che darei a chiunque e' quello di visitare Searchlores
(http://searchlores.org). All'interno di questo sito potete trovare
moltissimi tutorial dedicati alla ricerca e alle tecnologie del Web, in un 
ambiente che e' completamente libero da pubblicita', banner e schifezze 
varie. In particolare, vi consiglio di dare un'occhiata ai "search webbits",
stringhe di ricerca costruite ad hoc per particolari categorie di file o 
informazioni. 

Fra queste, il trucco dell'"index of" regna ancora sovrano, nonostante alcuni
siti commerciali cerchino gia' di sfruttarlo a loro vantaggio. In pratica, si
tratta di restringere la ricerca a quelle directory che rimangono aperte sul
Web e che, essendo nient'altro che dei lunghi elenchi di file, presentano 
sempre la scritta iniziale "Index of <nomedirectory>" e un link alla "parent
directory".

A questo punto, se ad esempio volete scaricare delle suonerie per cellulare
senza pagare una lira, perche' perdersi fra dialer e siti a pagamento quando
potete scaricare tutte le canzoni che desiderate in formato midi? Per trovare
i siti che le contengono, e' sufficiente dare in pasto a google la seguente
stringa:

    "index of" "parent directory" ringtones .mid

Un altro esempio riguarda i video divertenti, di quelli che si scarica quando
non si sa piu' come passare il tempo in ufficio. Con la stringa

    "index of" "parent directory" fun .mpg

(sostituite .mpg con il vostro formato video preferito) potete trovare tutti
i video che desiderate e, se vi va bene, anche diversi siti che vengono 
aggiornati periodicamente con nuovo materiale divertente.

Se, invece, volete provare lo stesso trucco con le mp3, probabilmente vi
ritroverete con un sacco di risultati sbagliati, che vi rimandano a siti
commerciali. Questo perche', come gia' vi avevo anticipato, una volta che si
comincia ad usare frequentemente un trucco "da questa parte", esso viene 
utilizzato anche "dall'altra" per attirare la gente dove in realta' non ha
la minima intenzione di andare. Per fortuna, indipendentemente da quante
fregature cerchino di rifilarci noi saremo sempre un passo avanti ;)

Abbastanza banalmente, se volete togliere il grosso dei risultati "fuffa" 
dalla vostra ricerca, potete provare ad eliminare le estensioni classiche
delle pagine web. Se poi vedete che ancora ottenete troppi risultati, potete
aggiungere qualche filtro su dei termini specifici:

    "index of" "parent directory" .mp3 Iron Maiden -.html -.htm -faq

Qui, ad esempio, siamo alla ricerca delle mp3 degli Iron Maiden, togliendo le
pagine HTML (che sicuramente non ci interesseranno) e i risultati che 
contengono la parola FAQ, poiche' nelle FAQ di un qualche neswgroup si era 
parlato di Iron Maiden e di mp3 e qualcuno ha avuto l'ottima idea di 
mirrorarle praticamente ovunque.

Se, infine, avete anche un'idea del titolo della canzone, potete provare a
inserirne l'ultima parola, attaccata all'estensione, oppure aggiungerne una
parte alle stringhe di ricerca:

    "index of" "parent directory" Metallica frantic.mp3 -.html -.htm


Un altro suggerimento che posso darvi sulla ricerca e' quello di sfruttare i
webtracker. Diversi siti Web utilizzano dei tracker per poter studiare le
statistiche relative agli accessi: quello che non tutti sanno, pero', e' che
diversi tracker commerciali sono aperti a tutti e consentono di controllare,
fra le altre cose, anche i referrer. Ad esempio, provate a dare un'occhiata
al mio webtracker:

http://extremetracking.com/open?login=alam

Come descritto in precedenza, i referrer sono gli URL da cui provenivano gli
utenti che hanno raggiunto un particolare sito, nel nostro caso quello che
utilizza il webtracker. Naturalmente, buona parte dei referrer saranno molto
probabilmente siti riguardanti lo stesso argomento: a questo punto, e' 
sufficiente cercare su google l'argomento di vostro interesse e il nome di
un webtracker (o il suo URL, o una stringa che lo identifichi) per poter
cominciare a scavare all'interno di una miniera di link potenzialmente
interessanti.

L'ultimo consiglio, se siete in cerca di un file particolare e specialmente
se e' coperto da copyright, e' quello di dare prima di tutto un'occhiata ai 
canali peer to peer: il download sara' molto probabilmente piu' lento di
quello da un normale sito web, tuttavia la probabilita' di trovare un film
o un libro anche solo a partire da un paio di parole del suo titolo e' molto
piu' alta. 

Se cercando file di una certa categoria incorrete spesso in nomi di gruppi 
che "rilasciano" periodicamente questi file, segnateveli: la volta 
successiva, avrete molte piu' probabilita' di trovare cio' che cercate 
usando questi nomi fra le stringhe di ricerca. Allo stesso modo, seguendo
(con un po' di attenzione) i link trovati all'interno dei classici file .nfo
mi e' capitato di trovare delle community monotematiche, decisamente piu'
specializzate e ricche di contenuti di qualsiasi motore di ricerca.


4.2 Esperimenti con curl
-----------------------------------------------------------------------------  

Puo' capitare che all'interno di un sito sia presente un lungo elenco di
file dello stesso tipo, tutti quanti con un identico prefisso seguito poi da 
un numero incrementale. In caso l'elenco dei file sia visibile da Web 
(attraverso una pagina HTML, oppure perche' la directory in cui i file son 
salvati e' accessibile), il metodo piu' comodo rimane sempre wget:

wget -m -np http://url.del.sito/directory/

Eventualmente, e' possibile specificare l'estensione dei file che desiderate
scaricare:

wget -m -np -A <estensione> http://url.del.sito/directory/

Purtroppo, spesso l'accesso diretto alle directory e' precluso e molti siti
non mettono a disposizione un indice dei file, ma obbligano gli utenti a
scaricare almeno tante pagine (con immagini inutili, banner e popup) quanti
sono i file che si desidera scaricare. Per questo tipo di download, l'utility
piu' pratica da usare e' curl.

Curl permette di specificare, all'interno della linea di comando, uno o piu'
URL, specificando le parti variabili fra parentesi graffe o le sequenze di
caratteri alfanumerici fra parentesi quadre. Ad esempio,

http://url.del.sito/directory/file[1-100].txt
http://url.del.sito/directory/file[001-100].txt
http://url.del.sito/directory/file[a-z].txt
http://url.del.sito/directory/file[1-4]part{One,Two,Three}.txt

Vi permettono di scaricare tutti i file che iniziano allo stesso modo e che
continuano con, rispettivamente

- i numeri da 1 a 100
- i numeri da 1 a 100 (preceduti da zeri per ottenere sempre 3 cifre)
- le lettere da "a" a "z"
- i numeri da 1 a 4, seguiti da "partOne", "partTwo", "partThree"

Curl ha moltissime opzioni oltre a quelle descritte. Esso supporta inoltre
vari protocolli (HTTP, HTTPS, FTP, GOPHER, DICT, TELNET, LDAP, FILE) e puo'
essere utilizzato anche per l'upload di file (per saperne di piu', lanciate
"man curl" dalla shell). Tuttavia, esso ha ancora qualche limitazione: ad
esempio, non e' ancora in grado di gestire in modo efficiente i nomi di file
che contengono delle date. Se eseguite questo comando

curl -LO http://url.del.sito/fumettodelgiorno/[2000-2004][01-12][01-31].gif

scaricherete si' tutte le immagini che vi interessano, ma invierete al server
piu' richieste di quanto non sia necessario, cercando ad esempio di prelevare 
il file del 30 febbraio o quello del 31 giugno... 

Per ovviare a questo problema ci sono diverse tecniche: fra queste, ve ne
sono alcune che vedrete nella prossima sezione e che vi permettono di 
scaricare quotidianamente i vostri fumetti preferiti.


4.3 Oneliner con wget e lynx
-----------------------------------------------------------------------------  

All'interno di questa sezione, avrete la possibilita' di vedere alcuni
oneliner creati partendo da wget e lynx. Essi partono da un progetto, che
avevo battezzato "Browsing the Web from the command line", a cui avevano
partecipato un po' di amici sul forum di RET (http://www.reteam.org). Il
progetto e' inattivo da tempo, ma essendo stato accorpato all'interno di
PowerBrowsing siete naturalmente liberi di partecipare, mandando commenti,
richieste o nuovi esperimenti. Grazie in anticipo :)

Il primo oneliner che prenderemo in considerazione consente di scaricare la
strip del giorno dal sito kevinandkell.com (ma non sara' molto diverso per
gli altri siti) recuperando la data odierna tramite il comando "date". Per
avere piu' informazioni su date, lanciate un "date --help" al prompt. Il
comando e' il seguente:

#============================================================================
wget http://www.kevinandkell.com/`date +"%Y"`/strips/kk`date +"%Y%m%d"`.gif 
#============================================================================

Notate come viene chiamato date entrambe le volte: esso e' racchiuso fra
backquote (in questo modo l'output del comando finisce a completare la
stringa dell'URL) e gli viene passato il parametro +"", all'interno del
quale viene specificato il formato della data desiderato. I codici usati per
specificare il formato sono i seguenti (presi pari pari dall'help):

  %Y   year (1970...)
  %m   month (01..12)
  %d   day of month (01..31)

Quindi, eseguendo questo comando ad esempio il 2 Aprile 2004 wget cercherebbe
di scaricare il file

http://www.kevinandkell.com/2004/strips/kk20040402.gif 

Una delle cose piu' belle di questo genere di comandi e' che, in un attimo, 
potete fare in modo che essi vengano eseguiti automaticamente ad ogni avvio
del vostro PC, oppure ogni giorno se il computer e' sempre acceso: avrete
cosi', sempre pronti sul vostro disco, tutti i file che desiderate. Se fra i
siti che decidete di controllare periodicamente ce ne sono alcuni che non
vengono aggiornati tutti i giorni, potete modificare il comportamento del
vostro script, eventualmente aggiungendo del codice per avvisarvi che in un
particolare giorno il download non e' stato eseguito:

#============================================================================
if [ `date +"%w"` -lt 6 ] && \ 
   [ $((`date +"%w"` % 2)) = 1 ]; 
then wget http://www.goats.com/comix/`date +"%y%m"`/goats`date +"%y%m%d"`.png; 
else echo no goats today; 
fi; 
#============================================================================

In questo script, il comando date con il parametro "%w" restituisce il giorno
della settimana (da 1 a 7). Se il giorno e' minore di 6 (cioe' non sabato o
domenica) oppure se e' dispari (quindi solo se e' lunedi', mercoledi' o
venerdi') allora l'immagine viene scaricata regolarmente; in caso contrario,
il programma avverte che oggi non ci sono immagini. Lo stesso giorno usato
per l'esempio precedente, cioe' il 2 Aprile 2004, il programma scaricherebbe
il file

http://www.goats.com/comix/0404/goats040402.png 


In entrambi gli esempi precedenti abbiamo usato wget nel modo piu' semplice
possibile, cioe' passandogli direttamente l'URL da scaricare. Esso, pero',
offre la possibilita' di eseguire autonomamente operazioni molto piu'
avanzate e, per darvene una prova, ecco il seguente esempio:

#============================================================================
wget -A mpg,mpeg,avi,asf -r -H -l 2 -nd -t 1 http://url.you.like 
#============================================================================

Qui wget e' utilizzato da solo, pero' con diversi switch. La loro descrizione
e' la seguente:

  -A comma-separated list of accepted extensions 
  -r recursive web-suck 
  -H go to foreign hosts when recursive 
  -l 2 maximum recursion depth = 2 
  -nd don't create directories 
  -t 1 set number of retries to 1 

Proviamo ad interpretare le singole descrizioni e ad unirle per comprendere
il funzionamento di questo comando: wget si collega alla pagina specificata,
segue ricorsivamente i link (-r) al massimo per una profondita' di 2 (-l 2),
uscendo eventualmente dal sito principale per collegarsi a server esterni 
(-H); quindi salva, all'interno della stessa directory (-nd), tutti i file
che hanno estensione mpg, mpeg, avi, asf. Ora, se pensate a quei siti pieni 
di link ad altri siti, a loro volta pieni di video gratuiti, capirete perche'
questo comando e' stato ribattezzato "wget-powered porn"!

Si parlava di collezioni di link: e se volessimo semplicemente estrarre tutti
i link da una pagina senza seguirli ma, eventualmente, per salvarli dentro a
un file di testo? Per questo possiamo usare lynx, insieme a qualche altro
tool:

#============================================================================
lynx -dump http://www.reteam.org/links.html \
    | sed 's/^ *[0-9]*\. [^h]*//' \
    | grep '^http'  
#============================================================================

Qui vengono utilizzati tre programmi, l'output di ognuno dei quali viene
passato come input al successivo:

- lynx scarica la pagina specificata e ne gira il dump a sed (tenete presente
  che il "dump" di lynx contiene, in fondo al testo, l'elenco di tutti i 
  link, http e non, presenti in una pagina)

- sed allinea a sinistra tutti i link di tipo http ed elimina tutti gli altri

- grep estrae solo le righe che cominciano con "http"

In questo modo, con una sola riga di comandi, abbiamo estratto tutti i link
presenti in una pagina, recuperando delle informazioni in piu' rispetto a
quelle che avevamo in precedenza e senza neanche il bisogno di aprire un
browser. Certo, lynx ci ha dato un aiuto non da poco, fornendoci una pagina
che presentava gia' l'elenco dei link, ma non sempre le cose sono cosi'
semplici: un'operazione piu' avanzata, ma non per questo particolarmente piu'
difficile da portare a termine, e' la seguente.

#============================================================================
lynx -nolist -dump 'http://www.reteam.org/board/viewforum.php?f=3' \
    | grep -2 "Browsing the web" \
    | tail -1 \
    | awk '{ print $1 }'  
#============================================================================

In questo caso i programmi usati sono quattro:

- lynx si collega all'indirizzo specificato, che e' quello di un forum, e
  scarica una pagina con l'elenco dei thread del forum

- grep estrae il thread che contiene le parole "Browsing the web" con un
  "contesto" di 2 righe (cioe' prende 2 righe prima e 2 righe dopo quella
  in cui trova la stringa "Browsing the web")

- tail recupera l'ultima riga del contesto, cioe' la seconda dopo il subject

- awk scrive la prima parola che trova all'interno di questa riga

Naturalmente, per creare una sequenza di programmi come questa non e'
sufficiente conoscerne il funzionamento, ma bisogna anche sapere come e'
strutturato il forum e come, all'interno del sorgente delle varie pagine Web,
vengono salvati i dati "statici" (cioe' quelli che non cambiano mai) e
"dinamici" (quelli, come il mittente di un messaggio o l'oggetto di un post,
che cambiano sempre). Come gia' anticipato, questa e' un'abilita' che si puo'
guadagnare solo con l'esperienza, quindi prima di darvi alcune linee guida
procedero' con un altro esempio, spiegato piu' in dettaglio: la battaglia
contro Flash!


4.4 Fight Against Flash
-----------------------------------------------------------------------------  

Perche' combattere contro Flash? Flash e' una buona tecnologia dal punto di
vista della comunicazione, permette di ottenere buoni effetti grafici senza
pesare troppo sui download ed e' compatibile almeno con i browser piu' 
diffusi.

In effetti, Flash non e' un problema, lo sono i suoi programmatori quando ne
abusano: se si tratta di costruire siti esclusivamente promozionali, fatti al
100% in flash, posso anche capire che crearne una versione esclusivamente in 
modalita' testo non abbia senso; quando, pero', all'interno di un sito 
informativo compare un inutile menu in flash, senza codice alternativo per
supportare i browser meno diffusi, allora questo diventa un problema. E se
per fortuna ultimamente la moda dei menu in flash sta leggermente calando,
basta cercare su google file tipo "menu.swf", "leftmenu.swf" o "navmenu.swf"
per capire quanto ancora siano diffusi.

E' un problema per diversi motivi: innanzitutto, fatta eccezione per il menu
in flash il resto del sito potrebbe anche interessarmi, quindi non e' mia
intenzione spegnere il computer e lasciar perdere; inoltre, a causa del
famigerato menu non solo i browser testuali come lynx non possono accedere
ai contenuti del sito, ma anche i dispositivi speciali come ad esempio le
barre braille. E, se nel mio caso basterebbe piegarmi ad utilizzare un altro
browser, c'e' chi questa scelta non ce l'ha e allora i contenuti del sito gli
sono completamente preclusi. Questo e' il motivo per cui, secondo me, e' bene
combattere contro flash ora e, piu' in generale, contro tutto quello che 
limitera' in qualche modo l'utilizzo di internet in futuro. 

In realta', la mia tecnica combattiva non e' particolarmente aggressiva: ho
semplicemente cercato di capire il funzionamento dei file flash e di estrarre
da essi piu' informazioni possibili, nel tentativo di ricostruire i contenuti
dei menu incriminati. Per fare questo ho utilizzato tre approcci, in ordine
di difficolta' -e di efficacia- crescente. Ancora non ho trovato una 
soluzione universale, ma son sicuro che lavorando su questi esempi saprete
fare di meglio ;)

Il modo piu' semplice per estrarre informazioni da un file swf e' quello di
visualizzarne le stringhe con il comando "strings". Supponendo che il file su
cui stiamo lavorando sia un menu, quello che ci interessa maggiormente sono i
link ai contenuti: possiamo allora passare in ingresso a strings il file swf
e redirigerne l'output al comando grep, che estrarra' solo le stringhe 
contententi "http":

lynx -source http://www.reteam.org/top.swf | strings | grep http  

Questo primo approccio fornisce gia' qualche risultato e con alcuni menu 
funziona perfettamente, tuttavia tralascia diversi altri tipi di link. Ad
esempio, nei siti che contengono anche link gestiti da codice javascript e'
necessario modificare la stringa passata a grep:

lynx -source http://www.mypetskeleton.com/mpsmain.swf | strings | grep http

lynx -source http://www.mypetskeleton.com/mpsmain.swf | strings \
| grep javascript  

Lavorando sulle stringhe e' possibile reperire diverse altre informazioni,
ma ancora il problema dei link non e' risolto: infatti, questo approccio va
un po' alla cieca, cercando nel mucchio se trova qualcosa di interessante ma
senza la certezza che sia effettivamente cio' che desideriamo. Per ovviare al
problema ho dato un'occhiata a diversi swf, cercando di capire in che formato
venissero salvati i collegamenti al loro interno: in tutti i flash che ho
esaminato, ogni link era rappresentato dalla sequenza di byte

0x00 0x83 0xLEN 0x00 "string" 0x00 

dove LEN e' la lunghezza della stringa, e 0x il prefisso usato per indicare
che tutti i valori son salvati in esadecimale.

A questo punto, e' stato un attimo creare un piccolo script in perl che mi
estraesse da un file tutti i link, utilizzando una regular expression. Se non
sapete cosa sia una regular expression, correte a studiare! In caso contrario
eccovi il sorgente dello script:

#============================================================================
#!/usr/bin/perl 
 
undef $/; # enable slurp mode 
$_ = <>; 
 
# SYNTAX IS: 0x00 0x83 0xlen 0x00 "string" 0x00 
while (/\x00\x83.\x00(.*?)\x00/gs){ 
        print "$1\n"; 
}  
#============================================================================

Si', e' gia' finito (capito perche' dovete studiarvi le regexp?). In realta',
non e' altro che un ciclo che dice "finche' trovi sequenze di byte come
quella descritta in precedenza, estrai la parte "string" e visualizzala".
L'utilizzo, supponendo sempre che il file swf sia da qualche parte nel Web,
e' il seguente:

lynx -dump http://web.site.url/menuname.swf | perl flash.pl 

Ad esempio:

lynx -dump http://www.reteam.org/top.swf | perl flash.pl 

Grazie allo script che abbiamo costruito siamo ora in grado di ricostruire
l'elenco completo dei collegamenti presenti nel menu, tuttavia non possiamo
recuperare il testo presente sui pulsanti, anche perche' talvolta esso viene
sostituito da delle immagini. Come possiamo, allora, sapere in anticipo dove
ci porteranno i link che abbiamo estratto?

Lo script che segue e' un estrattore di link _con prospezione_: esso segue
per conto nostro i collegamenti che ha trovato nel file Flash, estraendo (se
lo trova) il titolo delle pagine Web che visita e utilizzandolo per ricreare
un menu in HTML.

-- Flash Lookahead Link Extractor
#============================================================================
#!/usr/bin/perl 
 
use LWP::Simple; # used to get linked pages 
use URI::URL;    # used to absolutize URLs 
 
sub rel2abs { 
        my ($rel,$base) = @_; 
        my $uri = URI->new_abs($rel, $base); 
        return $uri->as_string; 
} 
 
$url   = $ARGV[0]; 
$flash = get($url) || die "Couldn't download $ARGV[0]"; 

# SYNTAX IS: 0x00 0x83 0xlen 0x00 "string" 0x00 
while ($flash =~ /\x00\x83.\x00(.*?)\x00/gs){ 
  my $nextitle; 
  my $link = rel2abs ($1,$url); 
  my $nextpage = get ($link); 
  if ($nextpage =~ /<title>(.*?)<\/title>/i){ 
    $nextitle = $1; 
  }else{ 
    $nextitle = $link; 
  } 
  print qq|<a href="$link">$nextitle</a><br>\n|; 
}  
#============================================================================

Questo sorgente e' un po' piu' complicato del precedente, ma vi assicuro che
non c'e' da sapere molto di piu' per comprenderne il funzionamento: intanto,
l'utilizzo dello script da shell e' il seguente

perl flash2.pl http://url.you.like/menu.swf 

Notate che in questo caso fornite l'URL direttamente allo script anziche' 
passare da lynx: in questo modo, il programma sara' in grado di utilizzare
l'URL base per rendere assoluti i link che trovera' all'interno del file
flash, in caso questi siano relativi. Quest'operazione e' svolta dalla sub
rel2abs, che a sua volta utilizza un comando gia' pronto e contenuto nella
libreria URI::URL. L'altro package utilizzato e' LWP::Simple, che avrete
occasione di vedere piu' in dettaglio in seguito: per ora, vi basti sapere
che esso vi mette a disposizione il comodissimo comando "get", a cui e'
sufficiente passare un URL per avere il sorgente HTML della corrispondente 
pagina Web. All'interno dello script, tale codice sorgente viene salvato 
nella variabile $nextpage, sulla quale viene applicata la regular expression 
che estrae il titolo della pagina qualora esso esista.


=============================================================================  
5. Bot Basics
-----------------------------------------------------------------------------  

Durante la nostra guerra a Flash abbiamo visto il primo esempio di robot (o
piu' semplicemente bot) scritto in Perl: esso naviga per conto nostro dentro
a un sito, seguendo i link estratti da un menu in flash, e ricostruisce lo
stesso menu in HTML, associando ad ogni link il titolo della corrispondente
pagina Web.

Ma cosa identifica un bot e cosa dev'essere in grado di fare uno di questi
programmi? A prescindere da cenni storici o definizioni rigorose, un bot che
si rispetti deve perlomeno essere in grado di mettere a disposizione degli
utenti le funzioni tipiche degli spider e degli scraper: esso deve, cioe',
essere in grado di muoversi all'interno di un sito (seguendo i collegamenti
da una pagina all'altra, riempiendo form, autenticandosi e cosi' via) e di
scaricare intere pagine Web o parte di esse, estraendo le informazioni piu'
importanti e tralasciando tutto cio' che non interessa all'utente.

Naturalmente un bot non e' in grado, da solo, di riconoscere "cio' che e'
interessante", ne' sa prediligere alcuni link rispetto ad altri. Il robot in
generale e' una macchina all'interno della quale l'uomo e' in grado di fare
cio' che desidera: quindi, anche in questo caso, e' necessario innazitutto un
intervento umano, per sondare i siti a cui il robot dev'essere in grado di
collegarsi e per decidere cosa esso dovra' considerare degno di nota e cosa 
invece dovra' ignorare.


5.1 Detecting Web Patterns
-----------------------------------------------------------------------------  

L'intervento umano nella fase di creazione di un bot e' fondamentale: la
macchina, infatti, non ha modo di lavorare direttamente sulla realta', ma 
opera solo su un modello che l'uomo crea in base a un'interpretazione 
personale di questa realta'. Ad esempio, mentre noi siamo in grado di 
riconoscere, fra i messaggi di un forum, l'oggetto di un messaggio (quindi 
percepiamo la _semantica_ della pagina, indipendentemente da come essa e' 
codificata), un bot puo' solamente capire che l'oggetto e' compreso fra 
alcune parti di codice HTML (quindi esso lavora a livello _sintattico_, 
strettamente dipendente dalla codifica della pagina). 

Naturalmente, tutto il lavoro che si sta facendo con il Web semantico serve 
proprio a rendere accessibile il Web tanto alle macchine quanto agli uomini,
e anche l'impiego dell'intelligenza artificiale nel campo dei wrapper puo'
portare a risultati discreti... ma questa e' un'altra storia: per ora, tenete
presente che, ancora per un po' di tempo, buona parte del lavoro la dovrete 
fare comunque voi.

Cosa sono i Web Patterns di cui si parla nel titolo? Essi non sono altro che
particolari schemi, individuabili all'interno dei contenuti di una o piu'
pagine Web, piuttosto che nei percorsi che siamo soliti seguire quando,
cliccando da un link all'altro, ci muoviamo all'interno di un sito. Essi sono
esattamente cio' che ci serve comprendere per poter istruire un bot a fare 
cio' che noi facciamo abitualmente, cioe' 

1) visitare un sito e
2) estrarre informazioni da esso

Nel primo caso, la domanda che ci dobbiamo porre e': si puo' trovare un modo
per far seguire automaticamente dei collegamenti a un programma? Certamente
si', lo dimostrano tutti i software in grado di eseguire il mirroring di un
sito Web. Ma e' anche possibile far SCEGLIERE alcuni collegamenti a un bot, 
e se si' quali?

In alcuni casi la risposta e' semplice: nel caso, descritto in precedenza, 
del "wget-powered porn" avevamo chiesto di seguire qualsiasi link e di 
salvare tutti i video a una distanza massima di due collegamenti. Questo
perche' sapevamo che la struttura dei siti su cui desideravamo usare wget era
la seguente:


         Sito contentente      1    Sito contenente     2     File
        link ad altri siti --------> link a video   --------> Video


In altri casi, la risposta e' piu' complessa: potremmo, ad esempio, trovarci
a voler scaricare tutte le immagini da una galleria dove ogni thumbnail ha 
un link all'immagine, e dove in fondo alla pagina c'e' un link alla pagina
successiva, il tutto senza sapere a priori quante pagine dobbiamo visitare.
In questo caso, dovremo dire al bot di collezionare tutti e soli i file che
corrispondono alle immagini desiderate, e di seguire i link che portano alla
pagina successiva finche' ne trovano, o finche' non trovano un particolare
terminatore (ad esempio, il link alla prima pagina del gruppo).

E se invece volessimo salvare tutti i messaggi di un forum? In questo caso,
avremmo molto probabilmente una situazione simile a quella della gallery,
ma con una gerarchia piu' profonda (Forum->Thread->Messaggi) e senza la
possibilita' di distinguere le informazioni che desideriamo in base a una
estensione. 

Come potete capire da questi esempi, essere in grado di riconoscere i pattern
navigazionali (cioe' i particolari schemi di navigazione all'interno di un
sito) puo' aiutare drasticamente nella progettazione di un bot. Naturalmente, 
come nel caso delle tecniche avanzate di PowerBrowsing, anche qui una certa 
esperienza e' indispensabile. Pur essendo implementati diversamente da un 
sito all'altro, i pattern navigazionali restano piu' o meno sempre gli 
stessi: questo significa che, col tempo, il lavoro in carico a voi sara' 
sempre piu' facile da portare a termine.

Come accennato in precedenza, oltre ai pattern relativi alla navigazione
esistono degli schemi ricorrenti anche a livello dei contenuti delle pagine 
Web, all'interno di uno stesso sito o anche fra siti diversi. Essere in grado
di individuare questi pattern vi permette di istruire il vostro bot ad 
estrarre da ogni pagina solo le informazioni che sono veramente interessanti.

Ad esempio, della generica pagina HTML di un forum (quella, cioe', contenente
il messaggio) vorremo probabilmente conservare solo il mittente, l'oggetto,
la data e il contenuto del messaggio. Nella pagina completa, invece, sono
solitamente presenti immagini, banner, codice HTML per la generazione delle
tabelle e cosi' via, fino a raggiungere una quantita' di dati anche 100 volte
superiore. Se, pero', prima e dopo le parti del messaggio che ci interessano
ricorre sempre lo stesso codice HTML, allora possiamo creare dei wrapper in
grado di riconoscere ed estrarre i vari elementi in base alle stringhe di 
codice a loro associate.

Se, nei vecchi siti fatti completamente a mano, si poteva supporre -ma non 
dare per certa- una certa ripetitivita' all'interno del codice HTML, nei siti
dinamici che ci troviamo ora a visitare tutto il codice fisso e' SICURAMENTE
sempre identico a se stesso, in quanto generato da una macchina. Questo ci
aiuta tantissimo in fase di creazione dei wrapper, in quanto ci basta vedere
il codice HTML di una generica pagina (ad esempio, di un messaggio in un
forum) per individuare le parti che non variano mai.

Come accennato in precedenza, grazie al diffondersi degli standard ora 
possiamo individuare pattern costanti anche fra un sito e un altro: basti
pensare alle news, disponibili in formato RSS, oppure a diversi BLOG che
mettono addirittura a disposizione un'API, o ancora a software come quelli
dei forum che, pur essendo scritti in linguaggi differenti, mantengono spesso
la medesima struttura e a volte generano codice HTML quasi identico.

Terminato il nostro compito di identificazione dei pattern, dobbiamo istruire
il nostro bot a riprodurli (nel caso della navigazione) o a rilevarli (nel
caso dei wrapper). Nelle prossime due sezioni avrete modo di leggere alcune
considerazioni, ancora indipendenti dal linguaggio di programmazione, che
forse potranno aiutarvi a progettare i vostri bot.


5.2 Website navigation with bots
-----------------------------------------------------------------------------  

Per quanto riguarda la navigazione, queste sono le operazioni che un bot 
dovrebbe essere in grado di portare a termine senza difficolta':

- dato un URL, scaricare la pagina Web corrispondente (l'operazione, come 
  potrete vedere nel prossimo capitolo, e' banale, specialmente in Perl)

- estrarre da una pagina i collegamenti desiderati, in base a particolari 
  condizioni all'interno dell'URL: ad esempio, il nome del file deve finire 
  con .gif, oppure tutti i file devono appartenere alla directory /textfiles/
  o ancora essere tutti generati dallo script viewthread.php?f=1&thread=...
  Quest'operazione puo' essere portata a termine in modo semplice tramite
  delle regular expression

- estrarre da una pagina i collegamenti desiderati, in base a particolari
  condizioni all'interno del testo taggato: ad esempio, si sceglieranno solo
  i link visualizzati come "Next", oppure quelli che iniziano con "Document".
  Anche in questo caso, le regular expression aiutano nella fase di verifica

- seguire i collegamenti estratti fino a un certo livello di profondita': ad
  esempio, seguire tutti i link presenti in un lungo elenco e dai siti 
  visitati scaricare tutte le immagini

- seguire i collegamenti estratti all'infinito, o fino a una particolare
  condizione: ad esempio, continuare a "cliccare su Next" finche' tale link
  e' presente

- raccogliere i collegamenti estratti per poterli usare in un secondo tempo,
  dall'ultima pagina visitata oppure da tutte quelle attraverso cui si e'
  passati: ad esempio, si deve poter seguire i link per tre livelli di
  profondita' e poi collezionare tutti i collegamenti a immagini, oppure
  seguire tutti i link a "Next" in un forum e, per OGNI pagina incontrata,
  collezionare tutti i collegamenti a messaggi

Se mai deciderete di programmare bot in Perl, tenete presente che buona
parte di questo lavoro e' gia' stata fatta dal sottoscritto: nel capitolo
dedicato agli esempi, troverete la descrizione (e il link al sorgente) di un
package, chiamato "common", che contiene proprio delle funzioni in grado di
portare a termine le operazioni descritte.


5.3 Data extraction
-----------------------------------------------------------------------------  

Per quanto riguarda l'estrazione dei dati, il sistema che in assoluto ho
trovato piu' comodo e' quello che fa uso delle Regular Expression. In realta'
ne esistono altri, che si appoggiano a XPath o a librerie specializzate nel
parsing dei testi. Nel prossimo capitolo faro' un accenno a tali librerie, ma
non ne parlero' in dettaglio: se lo desiderate, potete trovare informazioni a
proposito su Spidering Hacks... o in giro sul Web.

Le regexp consentono di "tagliare" il testo spezzettandolo in varie porzioni:
con una RE del tipo

  /<condizioni iniziali>.*?<condizioni finali>/gsi

dove 

  - le condizioni iniziali e finali sono codice HTML che circonda cio' che ci
    interessa

  - .*? e' una regular expression che matcha (cioe' viene soddisfatta da) la
    piu' piccola porzione di testo compresa fra le due condizioni

  - i "modificatori" gsi consentono di effettuare una ricerca iterata (g),
    case-insensitive (i) e trattando tutto il testo come una riga singola (s)

possiamo

  - dividere un testo in blocchi, ad esempio un thread nei messaggi che lo
    costituiscono oppure un lungo elenco di generici elementi nei singoli
    elementi che lo costituiscono (wrapper HEAD-TAIL)

  - estrarre da una riga una o piu' stringhe di testo (wrapper LEFT-RIGHT)


Poiche' i siti Web sono spesso soggetti a cambiamenti (per fortuna, quelli
generati in automatico da dei programmi lo sono un po' di meno), e' buona
norma creare i vostri Wrapper in modo parametrico: essi, cioe', devono essere
in grado di estrarre del testo in base a delle stringhe, che voi gli passate
di volta in volta, contenenti le regular expression da utilizzare. Quando il
sito cambiera', vi sara' sufficiente modificare la regexp per far funzionare
nuovamente il vostro bot (vedete, fra gli esempi del capitolo 8, quello 
relativo ai cinema).


=============================================================================  
6. Perl PowerBrowsing Tools
-----------------------------------------------------------------------------  

All'interno di questo capitolo parleremo di strumenti per il PowerBrowsing
scritti in Perl. Piu' precisamente, avrete la possibilita' di imparare a
creare dei bot che si collegano per conto vostro a dei siti Web, scaricando
i file che desiderate ed estraendo da questi le informazioni che vi sembrano
piu' interessanti; il tutto gestendo automaticamente tutte le procedure
collaterali quali l'identificazione col server, l'autenticazione, la gestione
dei cookie e dei referrer. 

La prima sezione del capitolo spiega la scelta di Perl come linguaggio di
programmazione per i bot. Nelle successive, avrete la possibilita' di vedere 
uno scorcio delle librerie dedicate al Web che Perl ci mette a disposizione, 
quindi un'analisi un po' piu' dettagliata dei principali oggetti e metodi da
utilizzare per creare i vostri bot.


6.1. Perche' Perl? 
-----------------------------------------------------------------------------  

Perche' usare Perl per creare dei bot? In realta' il potere espressivo di
molti linguaggi di programmazione ormai e' quasi equivalente, ma sicuramente
ognuno di essi si distingue ancora dagli altri per alcune sfumature, piu' o
meno rilevanti a seconda della particolare applicazione che si desidera
sviluppare.

E' proprio una di queste sfumature, insieme alla passione che personalmente
nutro per questo linguaggio, che mi ha portato a decidere di usare proprio
Perl: la potentissima gestione dei testi tramite regular expression, infatti,
ci permette di creare in pochi minuti dei wrapper che, in altri linguaggi,
sarebbero stati probabilmente piu' complicati da programmare.

A questo dobbiamo aggiungere la grandissima disponibilita' di librerie pronte
all'uso, che ci aiuta (come vedremo in seguito) a trasformare i nostri 
semplici bot che recuperano dati in programmi che _condividono_ informazioni
attraverso i formati piu' diffusi. Inoltre, alcune di queste librerie (come
ad esempio la stessa LWP::Simple, che useremo per i primi bot) sono cosi' 
facili da usare che chiunque sara' in grado di programmare con esse.

Infine, dobbiamo aggiungere altre due caratteristiche notevoli: prima di 
tutto la portabilita', indispensabile per poter permettere a tutti di fare
esperimenti indipendentemente dal sistema operativo usato, quindi la presenza
di letteratura al riguardo (e devo dire che "Spidering Hacks", in questo 
caso, e' stato determinante).

Naturalmente, tutto quello che e' servito a me per motivare la decisione di
utilizzare Perl non vieta a voi di utilizzare un altro linguaggio. Anzi, mi
piacerebbe vedere altre implementazioni di bot e verificare se esse siano
piu' o meno semplici o potenti di quelle che descrivero' in seguito.


6.2. Perl Packages 
-----------------------------------------------------------------------------  

Perl mette a disposizione diverse librerie per l'accesso al Web e per la
gestione dei principali oggetti con cui i vostri bot avranno a che fare. 
Anche se di queste librerie avrete occasione di usare frequentemente solo un
paio (LWP::Simple e LWP::UserAgent), eccovi una breve descrizione delle altre
piu' comunemente usate:

LWP
    Conosciuta anche come libwww-perl, e' un gruppo di moduli per l'accesso
    al Web

LWP::Simple
    E' la libreria piu' semplice che potete utilizzare per scaricare pagine
    dal Web: fra le funzioni che mette a disposizione, c'e' la classica "get"
    (che avete gia' visto nella sezione 4.4), la "getprint", che visualizza
    automaticamente a schermo cio' che scarica e la "getstore" che, invece,
    salva automaticamente i documenti scaricati

LWP::UserAgent
    E' una libreria piu' avanzata per l'accesso al Web (la vedremo piu' in
    dettaglio in seguito)

HTTP::Request
HTTP::Response 
    Sono oggetti utilizzati per gestire piu' in dettaglio le richieste da
    inviare al server e le risposte che provengono da esso
    
HTTP::Message
HTTP::Headers 
    Sono classi che offrono metodi aggiuntivi ad HTTP::Response

URI
    E' una classe che mette a disposizione metodi per operare sugli indirizzi
    Web, ad esempio per rendere assoluto un URL relativo o per estrarre da un
    link il nome di dominio o gli elementi del path

URI::Escape 
HTML::Entities
    Offono funzioni per l'escaping e l'unescaping, rispettivamente, degli URL
    e del testo estratto da un documento HTML, consentendo la gestione di
    caratteri non standard quali spazi negli URL o lettere accentate nel
    codice HTML

HTML::TokeParser, HTML::TreeBuilder, WWW::Mechanize 
    Le prime due classi sono specializzate nel lavoro di parsing dell'HTML e
    offrono metodi alternativi alle regular expression per l'estrazione di
    informazioni dai documenti; l'ultima classe consente di automatizzare
    l'interazione coi siti Web, riempiendo form, seguendo link e cosi' via.
    Tutte e tre assieme possono contribuire a semplificare e a rendere piu'
    robusti i vostri bot, tuttavia non vengono (per ora) trattate all'interno
    di questo testo.


6.3. LWP::Simple
-----------------------------------------------------------------------------  

LWP::Simple e' la piu' semplice libreria che potete utilizzare per collegarvi
al Web tramite Perl. Essa infatti mette a disposizione il comando "get", che
scarica la pagina presente all'URL specificato e ne restituisce il contenuto,
pronto per essere salvato in una variabile. La sintassi e', appunto,

$contenuto = get ($URL);

Al contenuto potete applicare una regular expression, per verificare alcune
condizioni: ad esempio, il prossimo script e' in grado, in poche righe, di
dirvi se nel momento in cui lo eseguite c'e' uno stream di Radio Bandita 
online.

#============================================================================
use LWP::Simple;                         # questa e' la libreria da usare

my $url = 'http://radio.autistici.org/'; # questo e' l'url che controlleremo

# scarica $url e salva il contenuto in $content 
my $content = get($url); 

# se si verifica un errore esci
die "Non son riuscito a scaricare $url" unless defined $content; 

# ora cerca all'interno del contenuto
if ($content =~ m/bandita/i) { 
    print "Radio Bandita sta strimmando!\n"; 
} else {  
    print "Non c'e' buona musica online.\n";  
} 
#============================================================================

LWP::Simple mette a disposizione anche altre funzioni, come ad esempio 
"getprint" e "getstore", il cui utilizzo e' pero' piu' specifico e meno
frequente rispetto alla semplice get. Tuttavia, la getprint in particolare
puo' tornare utile per gli oneliners, in caso non si abbia a disposizione 
lynx: infatti, il comando

  perl -MLWP::Simple -e 'getprint "http://3564020356.org";'

e' equivalente a

  lynx -source http://3564020356.org


6.4. LWP::UserAgent
-----------------------------------------------------------------------------  

LWP::UserAgent e', naturalmente, una libreria decisamente piu' complessa 
rispetto a LWP::Simple, ma offre anche numerose funzioni aggiuntive a volte
indispensabili per un bot che si rispetti. Grazie ad essa, infatti, potrete
identificare il vostro UserAgent con il server, aggiungere il campo "Referer"
fra gli header della richiesta, eseguire il POST dei dati di un form, gestire
i cookie e connettervi tramite un proxy.

-- LWP::UserAgent - 01 - Basics
#============================================================================
#!/usr/bin/perl -w 
use LWP 5.64; # usa LWP e verifica che la versione sia abbastanza recente

my $url = 'http://radio.autistici.org/'; 

# crea un nuovo useragent 
my $ua = LWP::UserAgent->new; 

# esegui la GET dell'URL specificato
my $response = $ua->get($url); 

# se si verifica un errore esci 
#(notare la gestione piu' accurata degli errori)
die "Non riesco a scaricare $url: ", $response->status_line 
    unless $response->is_success; 

# ora cerca all'interno del contenuto
if ($response->content =~ m/bandita/i) { 
    print "Radio Bandita sta strimmando!\n"; 
} else {  
    print "Non c'e' buona musica online.\n";  
} 
#============================================================================

Quello che avete appena visto e' il piu' semplice esempio di programma che 
potete scrivere usando LWP::UserAgent. Esso e' un'evoluzione del precedente
script creato con LWP::Simple: non e' molto piu' complessa dell'originale, ma
gia' vediamo un'organizzazione piu' avanzata: innanzitutto, viene creato un
oggetto di tipo UserAgent che gestira' d'ora in poi le comunicazioni con il
server; poi, viene richiesto all'UA di eseguire una GET dell'url specificato
e di salvarne il risultato nella variabile $response; tale variabile non
contiene piu' il solo contenuto della pagina HTML, ma e' un vero e proprio
oggetto in grado di dire se l'operazione e' andata a buon fine o no (tramite 
il metodo is_success) e di fornire il contenuto della pagina (content) oppure
l'eventuale codice di errore (status_line). 

Lo stesso comando get, usato nella sua versione piu' semplice, vi permette di
specificare altri parametri: ad esempio, potete aggiungere degli header
personalizzati, contenenti la stringa di identificazione del vostro User
Agent, i tipi di file che accettate, il set di caratteri e il linguaggio che
preferite. Per fare cio', e' sufficiente salvare questi dati all'interno di
un array e passarlo come secondo parametro al metodo get:

-- LWP::UserAgent - 02 - Identify your bot
#============================================================================
my @ns_headers = ( 
    'User-Agent' => 'MaLaBot 1.0', 
    'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, 
                 image/pjpeg, image/png,  */*', 
    'Accept-Charset' => 'iso-8859-1,*', 
    'Accept-Language' => 'en-US', 
); 
 
$response = $browser->get($url, @ns_headers); 
#============================================================================

Puo' capitare che alcuni siti si rifiutino di ricevere dei dati da voi, a
meno che questi non provengano da particolari URL: per effettuare questo
controllo i server verificano il vostro referer, quindi puo' tornarvi utile
sapere come modificarlo a mano. Per fare cio', dovete lavorare sull'oggetto
"request", creandolo in base al tipo di richiesta (GET o POST) che desiderate
fare, quindi aggiungendo il referer tramite l'omonimo metodo. L'esempio che
segue vi mostra le operazioni da compiere, nel caso di una POST a un form (in
questo caso, $POST_URL e $REFERER_URL sono delle variabili che contengono, 
rispettivamente, l'URL a cui intendete inviare la richiesta e l'indirizzo da
cui avete deciso di provenire).

-- LWP::UserAgent - 03 - custom referers
#============================================================================
# create request object, passing method 
my $req = HTTP::Request->new(POST => "$POST_URL"); 
    # this is used for post 
    $req->content_type('application/x-www-form-urlencoded'); 
    # line to post 
    $req->content("lang=it&descrizione=$letters&numero=&CheckExt=N"); 
    # referer URL 
    $req->referer("$REFERER_URL"); 
 
my $res = $ua->request($req); 
#============================================================================

Nell'esempio precedente avete visto come POSTare i dati di un form. In
particolare, abbiamo usato una stringa (quella specificata dal metodo 
"content" dell'oggetto "Request") di elementi concatenati l'uno con l'altro. 
Esiste tuttavia un altro metodo, che consiste nel passare al metodo "post"
dell'oggetto "UserAgent", insieme all'URL di destinazione, un hash (un array 
contenente le coppie chiave/valore) dei parametri da inviare.

-- LWP::UserAgent - 04 - post form data
#============================================================================ 
my $ua = LWP::UserAgent->new; 

my $url = 'http://url.of.the.form/path/form.php'; 
 
my $response = $ua->post( $url, 
    [ 'param1' => $value1,
      'param2' => $value2,
      'param3' => $value3,
      'param4' => $value4,
    ] 
); 
#============================================================================

Ricordate (ci ho sbattuto la testa per un po' prima di scoprirlo) che spesso
in seguito a una POST potreste venire redirezionati a un'altra pagina.
Affinche' il vostro UA vi restituisca la pagina a cui siete interessati (e
non quella che contiene semplicemente la redirect alla pagina che vi 
aspettate) e' necessario che, prima della richiesta, inseriate la seguente
di codice

  push @{ $ua->requests_redirectable }, 'POST'; 

che non fa altro che dire allo user agent che anche le POST sono delle
richieste per le quali e' necessario seguire automaticamente i redirect.

Per la vostra autenticazione all'interno di alcuni siti (o anche solo per il
semplice accesso ad altri) e' talvolta necessario che il vostro UserAgent sia
in grado di gestire i cookie. Niente di piu' semplice: potete usare uno dei
due seguenti metodi per abilitare l'UA all'utilizzo dei cookie.

-- LWP::UserAgent - 05 - use cookies
#============================================================================
use HTTP::Cookies; 

$ua->cookie_jar( HTTP::Cookies->new( # or HTTP::Cookies::Netscape 
    'file' => '/some/where/cookies.lwp',  # where to read/write cookies 
    'autosave' => 1,                      # save it to disk when done 
)); 
#----------------------------------------------------------------------------
$kj = new HTTP::Cookies; 
$kj->load("cookies.txt"); 
$ua->cookie_jar($kj); # activate cookie jar for the useragent 
#============================================================================

Ultimo, ma non per ordine di importanza (se state lavorando in un ufficio e
state dietro a un proxy, queste righe saranno per voi fondamentali), l'UA
creato con LWP::UserAgent e' in grado di connettersi attraverso dei proxy. Si
puo' usare il proxy impostato come variabile d'ambiente (env_proxy), in modo
da non doverlo riconfigurare, oppure impostarne uno a mano, scegliendo anche
il protocollo per cui lo si desidera utilizzare.

-- LWP::UserAgent - 06 - connect through a proxy
#============================================================================
$ua->env_proxy; 
#----------------------------------------------------------------------------
$ua->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/'); 
#============================================================================

E' tutto, per ora: questi esempi non sono certamente completi, ne' pretendono
di chiarire tutti i dubbi che vi potranno venire quando deciderete di creare
il vostro primo bot. Credo pero' che essi possano semplificarvi un po' la
vita, almeno all'inizio, e son sicuro che lavorandoci un po' su (e, perche'
no, collaborando con qualcun altro, se non con il sottoscritto) potrete
ottenere dei risultati piu' che soddisfacenti.


=============================================================================  
7. Condividete i vostri dati
-----------------------------------------------------------------------------  

Ora che sapete creare dei bot che vanno in giro a recuperare informazioni per
conto vostro, la cosa piu' bella che potreste fare e' trovare un modo per
condividere queste informazioni con altre persone. Naturalmente, questa e'
una scelta che ognuno di voi dovrebbe fare spontaneamente, insieme anche alle
modalita' con cui decidete di effettuare questa condivisione (dal floppy disk
alla telepatia tutto e' concesso!).

In questa sezione vorrei piu' che altro offrire degli spunti per chi desidera
condividere quello che e' riuscito a raccogliere coi propri bot ma non ha
ancora idea di come farlo. 


7.1 Il Web e RSS
-----------------------------------------------------------------------------  

L'esempio minimale di condivisione che mi viene solitamente in mente e' lo
schermo del mio computer in modalita' testo, immagine che riesco a replicare
abbastanza fedelmente creando pagine web i cui contenuti sono racchiusi fra
le tag <PRE> e </PRE>.

Senza esagerare fino a questo punto, potete comunque creare dei siti Web 
leggeri, magari generati dinamicamente con PHP, esponendo cosi' le vostre
informazioni senza pero' perdere in usabilita': un piccolo motore di ricerca
e dei link per passare da una sezione all'altra dei vostri dati richiedono
relativamente poco tempo per l'implementazione, ma aggiungono molto alla
fruibilita' dei dati che mettete a disposizione.

Alternativamente, potete utilizzare il package Perl XML::RSS per pubblicare
i vostri contenuti in RSS: l'operazione e' assolutamente banale per voi e ha 
il vantaggio per l'utente di poter scegliere il client con cui visualizzarli.


7.2 La mail
-----------------------------------------------------------------------------  

Parlando di poter scegliere il client, non puo' non venirmi in mente il caro,
vecchio, comodo e strautilizzato client di posta elettronica: se si potesse
consumare, il mio ormai non esisterebbe praticamente piu'! E' diventato ormai
per me cosi' comodo da usare che, anche se non e' piu' supportato da anni, 
continuo a utilizzarlo. Essendo un programma per Windows, e' uno dei pochi
motivi per cui ancora faccio macchine con il dual boot.

Insomma, se anche gli altri utenti si trovano comodi quanto me con i loro
client di posta elettronica, perche' non riproporre loro i dati tramite mail?
Ricordo alcuni servizi (ora ce ne sono sempre meno, ma ce n'e' ancora) che
permettevano di vedere pagine Web via mail; altri visitavano regolarmente un 
sito per verificare se c'erano degli aggiornamenti e in caso mandavano un 
messaggio agli utenti iscritti per avvisarli; io ho creato uno script perl 
che, chiamato da procmail quando riceve un messaggio con un particolare 
subject, invia un messaggio di posta con l'elenco di tutti i film attualmente
in proiezione nella mia citta'.

Ci sono diversi modi per comunicare dati via mail: uno, forse piu' complesso
se non si ha un server a disposizone, e' quello di usare procmail per 
filtrare i messaggi in arrivo e rispondere automaticamente in base alla
presenza di particolari stringhe nel subject o nel corpo del messaggio; un
altro metodo, invece, e' quello di creare un server POP3 virtuale come quello
descritto nella sezione 3.3.  


7.3 Il package Net::Blogger
-----------------------------------------------------------------------------  

Fra le varie possibilita' di pubblicazione che avete a disposizione, una 
delle piu' semplici e versatili e' quella di utilizzare un blog. Semplice
perche' si tratta di utilizzare una libreria gia' pronta, che utilizza le API
usate dai blog piu' diffusi; versatile perche' nel momento in cui pubblicate
dati su un blog li mettete a disposizione in HTML ma anche in RSS, li avete
salvati in un DB all'interno del quale potete fare delle ricerche e molto
probabilmente non avete neanche bisogno di un server vostro per conservarli.
Infine, e non e' una cosa da poco, potrete utilizzare queste applicazioni 
sataniche per uno scopo finalmente UTILE!

Non mi dilunghero' in spiegazioni a proposito di questa libreria: potete
trovare la documentazione e' online e il codice sorgente si commenta da se'.
Tenete presente che la parte dedicata alla pubblicazione e' contenuta tutta
nelle ultime venti righe, mentre le precedenti sono dedicate prima alla
dichiarazione delle variabili, quindi al codice dello scraper (che, in questo
caso, e' lo stesso dell'esempio "Things I've learned from B-Movies"). Se
modificate le prime righe dello script, inserendo l'URL dell'API del vostro
blog, il suo nome, la vostra login e la password, avrete in pochi secondi il
vostro primo Bloggerbot funzionante.

#============================================================================
#!/usr/bin/perl

use Net::Blogger; # this is used to post articles 
use common;       # this is used for LWP related functions (getpage, exturl)

my $debug  = 1;
my $PROXY  = 'http://il.sito.del.tuo.blog/blog/nucleus/xmlrpc/server.php';
my $BLOG   = 'myblog';
my $LOGIN  = 'login';
my $PASS   = 'password';

my $TITLE  = "Things I've learned from B-movies";
my $CATEG  = "bot";

#------------------------------------------------------------------
# this is the scraper code

my $BADMOVIES_URL = 'http://www.badmovies.org/movies/';
my $LINK_FORMAT   = '/movies/.*?/index.html';
my @quotes;


my $idx_content = getpage ($BADMOVIES_URL);
my @movies = exturl ($idx_content,$LINK_FORMAT,'',$BADMOVIES_URL);
my $movies_size = @movies;
my $randurl = $movies[rand($movies_size-1)];

my $mov_content = getpage($randurl);

if ($mov_content =~ /<title>\s*Review for (.*?)\s*\n/si){
        $title = $1; chomp $title;
}

if ($mov_content =~ /learned\.gif>(.*?)<\/font><br>/si){
        my $learned = $1;
        while ($learned =~ /10>\s*(.*?)\s*\n/gsi){
                push @quotes,$1;
        }
}

my $quote_size = @quotes;
my $quote = $quotes[rand($quote_size-1)];
$DATA  = qq|$quote<br>|;
$DATA .= qq|(<a href="$randurl">$title</a>)|;

#------------------------------------------------------------------
# this is the blogger code

$blogger  = Net::Blogger->new(debug=>$debug);

$blogger->Proxy($PROXY);
$blogger->Username($LOGIN);
$blogger->Password($PASS);

# get blogid and assign it to the blogger
my $blogid = $blogger->GetBlogId(blogname=>$BLOG);
$blogger->BlogId($blogid);

# create post text
my $txt  = "<title>$TITLE</title>";
   $txt .= "<category>$CATEG</category>";
   $txt .= "$DATA";

# send and publish the new post
my $id = $blogger->newPost(postbody=>\$txt,publish=>1) 
         || die "Error: ".$b->LastError();
#============================================================================


7.4 TWO
-----------------------------------------------------------------------------

TWO (The Working Offline forum reader) e' un progetto al momento non molto
attivo, ma che ho portato avanti per tutto lo scorso anno e che ora entra a 
pieni meriti fra le tecniche avanzate di PowerBrowsing. Grazie a una 
struttura molto modulare, basata su dei plugin, esso consente il download
dei contenuti da forum Web di diverse tecnologie (al momento sono supportate
quattro diversi tipi di forum), il salvataggio all'interno di un database 
unificato e la consultazione dei messaggi tramite interfaccia Web HTML+PHP o
la condivisione tramite Web Service (con client gia' pronti, seppur minimali,
in Java, Perl e C).


+------+    +--------+
|FORUM1|    |___UA___|----+                 +---> HTML+PHP
|      |<-->|wrapper1|    |                 |
+------+    +--------+    |                 |
                          |     ______      |                   +--> Java
+------+    +--------+    |    <______>     |                   |
|FORUM2|    |___UA___|----+--> |      |-----+---> Web Service --+--> Perl
|      |<-->|wrapper2|    |    |  DB  |                |        |
+------+    +--------+    |    <______>                |        +--> C
                          |                            |
+------+    +--------+    |                            V
|FORUM3|    |___UA___|----+                         REGISTRY
|      |<-->|wrapper3|                                ...
+------+    +--------+


Uno dei vantaggi principali di TWO, oltre alla possibilta' di condividere le
informazioni scaricate con altre persone, e' quella di unire all'interno
dello stesso database dati provenienti da siti con tecnologie diverse: in
questo modo, e' possibile trovare con un'unica ricerca messaggi scritti in
forum differenti. Inoltre, lo spazio che le informazioni estratte dai forum
occupano su disco e' una piccolissima percentuale dei dati scaricati, cosi'
come questi ultimi rappresentano solo una parte di quanto si sarebbe dovuto
scaricare con un normale browser. 

Ma _quanto_ spazio esattamente e' in grado di guadagnare TWO? Quelli che
seguono sono i risultati di alcuni test (potete trovare la versione completa
nella documentazione di TWO):

------------------------------
Forum data size (KB)    92741
TWO's data size (KB)     7892
------------------------------
Saved space.(KB)........84849
Saved space (perc)........91%   <= !!!
==============================

Lo spazio risparmiato, naturalmente, non va solo a vantaggio vostro, ma anche
a quello di tutti coloro che scaricheranno quei dati dal vostro PC. Se, ad
esempio, cominciasse uno scambio di forum fra utenti, basterebbe comprimere
quegli 8 mega circa di database per ottenere un file delle dimensioni di un
floppy disk, e chiunque in pochi minuti (o secondi!) di download potrebbe 
arricchire la propria base dati con una quantita' incredibile di nuove
informazioni. Usando una tecnologia un po' piu' avanzata, se attraverso un 
registry piu' Web Service di TWO mettessero a disposizione diversi database, 
ogni utente della rete potrebbe effettuare ricerche distribuite su diversi 
forum nello stesso istante. 

Chiaramente, le migliorie che si possono apportare a TWO sono ancora numerose
e gli errori che si dovrebbero correggere sono, probabilmente, ancora troppi.
Il codice sorgente e' fornito "as is" e non escludo vi ci vorra' un po' per
capire come funziona e come migliorarlo. Tuttavia, se siete interessati, 
potete scaricare i sorgenti e la documentazione di TWO collegandovi 
all'indirizzo http://two.sf.net. Fatemi sapere se ci combinate qualcosa di
buono! ;)


=============================================================================  
8. Esempi
-----------------------------------------------------------------------------  

In questa sezione avrete la possibilita' di vedere e provare alcuni esempi.
Per motivi di spazio, ho deciso di non pubblicare il loro codice sorgente 
direttamente all'interno di questo testo, ma di mettere un collegamento al 
sito da cui potrete scaricarli. In caso non riusciate a collegarvi, potete
mandarmi una mail e vi inviero' un URL alternativo.

- Common lib
  http://3564020356.org/cgi-bin/perlcode.pl?file=common.pm
  
  common.pm e' un package che mi son creato quando stavo sviluppando TWO, per
  avere sempre a disposizione i comandi tipici per controllare la navigazione 
  di un bot:
  
  getpage e' molto simile alla get di LWP::Simple, tuttavia si appoggia in
    questo caso a LWP::UserAgent per ottenere qualche vantaggio in piu': essa
    e' infatti in grado di gestire i cookie, un proxy, l'identificazione
    dello UserAgent e tentativi multipli di accesso prima di dare per perso
    lo scaricamento di una pagina.
  
  exturl colleziona, all'interno di un array, tutti i link che si trovano
    all'interno di una pagina Web e che soddisfano una o piu' regular 
    expression nell'URL o nel testo taggato: questo permette di seguire link
    del tipo "tutti i file che finiscono in .txt" oppure "tutti i link il cui
    testo corrisponde a Next".

  walkpages e' una funzione ricorsiva che usa exturl per seguire una serie 
    di link specificati e collezionarne un'altra. Essa ha varie modalita' di
    funzionamento: puo' seguire link diversi a seconda della profondita' e
    collezionare solo quelli che trova nell'ultima pagina, oppure raccogliere
    collegamenti man man che naviga all'interno di un sito.
   
  walkpages_loop e' la versione ciclica di walkpages: essa segue cioe' gli
    stessi (o lo stesso) link all'infinito (o per una profondita' massima
    specificata) finche' trova risultati, collezionando man mano tutti i
    collegamenti da conservare che trova.


- Cinemaz
  http://3564020356.org/cgi-bin/perlcode.pl?file=cinema.pl
  NOTA: usa common.pm

  Cinemaz e' un programma che ho creato per uso personale, per ovviare alla
  struttura contorta del sito web http://www.monzacinema.it: per scegliere
  che film vedere, sapere in che cinema lo proiettano, gli orari e il numero
  di telefono per prenotare i click si sprecano!

  Il bot si collega alla pagina principale e scarica tutte le schede dedicate
  ai vari cinema, estraendone quindi il nome, il numero di telefono, il film
  proiettato e gli orari. Le informazioni vengono visualizzate in un file di
  testo spartano, ma contenente tutto il necessario. 

  Con un piccolo adattamento, sono riuscito ad usare lo stesso script con 
  procmail per poter ricevere, ovunque sia, una mail contenente lo stesso
  elenco ogni volta che mando al server un messaggio con subject "cinemaz" :)


- Things I've learned from B-Movies
  http://3564020356.org/cgi-bin/perlcode.pl?file=badmovies.pl
  NOTA: usa common.pm

  http://www.badmovies.com e' un sito molto divertente, contenente numerose
  recensioni a film di serie B. Una delle cose piu' simpatiche, all'interno
  di ogni scheda dedicata a un film, e' la sezione "Things I've learned from
  B-Movies", che contiene un elenco di frasi demenziali sulle lezioni che si
  imparano guardando questi film.

  Lo script, una volta lanciato, scarica l'elenco dei film con i relativi
  link alle schede, ne segue uno a caso, quindi estrae le frasi demenziali
  dalla sezione "Things I've learned from B-Movies" e, a seconda della
  modalita' con cui viene lanciato, le visualizza tutte o una a caso, a mo'
  di "fortune".


- Malacomix
  http://3564020356.org/cgi-bin/perlcode.pl?file=comics.pl

  Malacomix si connette al sito http://www.comics.com per farvi vedere, ogni
  giorno, le vostre strisce a fumetti preferite. Sfruttando la sintassi 
  comune con cui le pagine delle varie strisce sono salvate, e' sufficiente
  specificare nell'url i nomi delle strip che desiderate vedere per generare
  una pagina HTML contenente tutti i link alle immagini corrispondenti.


- Happy3 URL Extractor 
  http://3564020356.org/cgi-bin/perlcode.pl?file=happy3.pl

  Questo script e' stato creato per un preciso scopo: permettere a tutti di
  vedere _come desiderano_ (e non in una popup di dimensioni prefissate) o di
  scaricare sul proprio disco gli episodi di Happy Tree Friends. Lo script e'
  molto semplice, ma e' seguito a un lavoro di "flash reversing" un po' piu'
  avanzato. Magari un giorno, quando vi sarete ripresi da questo lungo testo,
  vi spieghero' anche questo ;)


2014-06-11 14:17