Una riga sola (ma a volte un po’ lunga)

mineentrance_sepia_

A volte sono un collezionista di dati e scavo scavo e scarico scarico e leggo o analizzo o studio sì e no l’1% di quel che scarico, sicché a volte la notte mi prende l’ansia, non essendo immortale, di non riuscire ad assorbire tutto ciò che ho accumulato. Una certezza, visto che il tasso di consumo è decisamente inferiore al tasso di produzione.

Mi avvalgo dei soliti strumenti che non dovrebbero mai mancare nella scatola degli attrezzi dello scavista e del collezionatore (oltre ad una shell come bash e a un browser): wget, curl, awk, perl, lynx… Quali usare dipende dalla difficoltà dell’obiettivo e anche dalla fantasia del momento; ma spesso mi bastano lynx, awk e wget.

Visto che su questo blog la parola one-liner già compare (per esempio qui, ma anche altrove), la userò: si tratta di fare semplici one-liner.

Tanto per battere un colpo e per fare degli esempi, gli ultimi one-liner fatti oggi.

Prima il più “complicato”. Le directory e i file sono visibili grazie al fatto che non è proibito il directory listing. Però chi ha organizzato il materiale ha creato una cartella per ogni lezione, e in ciascuna cartella troviamo due PDF, SlidesNN.pdf e SmallNN.pdf, dove NN corrisponde al nome della cartella che a sua volta corrisponde al numero della lezione (suppongo) scritto sempre con due cifre. È bastata una sbirciatina a due cartelle diverse per stabilire questo schema; naturalmente ciò non garantisce che sia valido per tutte… ma per induzione diciamo che sia così. (Alla fine si scopre che la 29 fa eccezione: poco male, si fa una wget mirata e buona notte.)

for i in `seq 0 1 29`; do k=$(printf "%02d" $i); \
  wget http://BASE/$k/Small$k.pdf ; \
done

(Oppure si può scrivere for((i=0; i < 30; i++)). Ho scritto BASE e sono andato accapo per non far venire la riga troppo lunga… ma comunque resta un one-liner :-D)

Non ho potuto usare curl perché http://.../[00-29]/Small[00-29].pdf avrebbe generato molte richieste GET che sarebbero state un buco nell’acqua. Di solito è cosa buona e giusta mettere delle pause (sleep); alle volte è anche necessario aggiungere header HTTP vari per fare in modo che wget non sia bloccato… Non è fair play e dicono che bisogna rispettare il robots.txt, quindi lo dico pure io.

Però certe volte un po’ di user agent spoofing è irrinunciabile per poter accedere a certe risorse, cioè per evitare l’user agent sniffing: per esempio in alcuni casi se vi fingete un crawler di Google potete accedere a più cose, perché il vostro compito è di indicizzarle in modo che gli utenti le trovino, clicchino e generino un po’ di traffico — per scoprire che per accedere alla risorsa completa dovete iscrivervi…

Un altro approccio poteva essere l’uso di wget con la sua funzionalità di mirror; dopo aver scaricato tutto avrei dovuto spostare i vari PDF per metterli in una sola cartella — così volevo — e cancellare tutto il resto.

L’altro esempio sfrutta un trucchetto preso direttamente da un classico (penso che si possa definire tale); finisce tutto così:

lynx -dump BASE | \
awk '/.pdf$/ && !/Lexical/ {print $2}' | \
xargs -n1 wget

(Come prima, ho scritto BASE e sono andato accapo per non sformattare il blog…)

Perché !/Lexical/? Solo perché alcune slide già le avevo scaricate — avrei potuto togliere l’esclusione ma l’ho voluta tenere come esempio di filtro leggermente più elaborato della sola regexp /.pdf$/.

Naturalmente i dettagli vanno di volta in volta adattati al caso specifico, che deve essere studiato… Non si fa prima a scaricare i file dal browser? No. Non si fa prima a scaricare i file dal browser usando un download manager, un’estensione, un plug-in o qualcosa del genere? Quando ciò è effettivamente possibile, forse sì… ma è anche meno divertente.

L’approccio via script (one-liner o che) permette di automatizzare il download di risorse da pagine il cui contenuto viene aggiornato (mantenendo lo “schema” invariato).

Per esempio il giornale Metro permette di scaricare i PDF; si potrebbe fare uno script che parte ad un orario stabilito e controlla se il PDF del giorno corrente è scaricabile; se sì lo scarica…

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: