Download delle immagini da Flickr
Ciao a tutti qualche giorno fa volevo provare ad utilizzare il programma Metapixel per realizzare dei fotomosaici come mostrato qui. Affinchè il risultato sia il migliore possibile è necessario avere a disposizione un numero molto elevato di immagini che poi saranno composte per andare a creare il mosaico. Il problema che si presentava a questo punto era: dove trovo tante immagini?
Ho quindi pensato al sito Flickr dove gli utenti mettono a disposizione immagini/foto da loro realizzate… la ricerca delle foto può essere fatta per soggetto ritratto o anche per licenza con la quale vengono messe a disposizione. Ovviamente il mio interesse si è indirizzato verso quelle che sono state licenziate con le Creative Commons. Ho notato che tutte le pagine che mostravano le immagini avevano questo URL:
http://www.flickr.com/search/?q=&l=cc&ct=0&mt=all&adv=1#page=
e guardando il sorgente della pagina le immagini erano indicate da questo tag:
<div class="ResultsThumbsChild"> <div style="position:relative"> <span class="photo_container pc_t"><a href="xxx" title="yyy"><img src="zzz" width="100" height="67" alt="www" class="pc_img" border="0" /></a></span> <a href="xxx" onclick="return F.explore_search.show_detail(this,event,'3673363334')" title="More information" class="search-moreinfo search-moreinfo-small" style="margin-right:8px"><img src="http://l.yimg.com/g/images/spaceout.gif" /></a> </div> <p class="ResultsThumbsChild">From <a href="xxx">xxx</a></p> </div>
Dove la parte che mi interessava (cioè quella che aveva il link all’immagine) era:
img src="zzz"
ho quindi pensato di scrivere un piccolo script in python in modo che andasse a leggere il sorgente della pagina e scaricasse tutte le immagini che erano linkate. Queste sono le pagine da cui ho preso spunto per creare lo script:
Questo è quello che ne è uscito (ho messo i commenti direttamente nel codice per spiegare cosa fa), file parsehtml.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from sgmllib import SGMLParser # definisco la classe che si occuperà di leggere il file html # e salvare i link alle immagini class PARSER(SGMLParser): def reset(self): SGMLParser.reset(self) #vettore che conterrà i link self.linkimage = [] #funzione che legge il file e cerca tutti i tag con img def start_img(self, attrs): #per tutti i tag img leggo il campo src src = [v for k, v in attrs if k=='src'] for line in src: # se il campo src contiene farm allora lo salvo perchè è # un'immagine che mi interessa if (line.find("farm") != -1): #aggiungo il link all'immagine nel vettore della classe self.linkimage.extend(src) |
file main.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import parsehtml, os, urllib # scarico tutte le immagini delle prime 100 pagine for i in range(1,101): # apro una connessione e scarico la pagina con quell'url, ad ogni iterazione del ciclo prendo una pagina diversa sock = urllib.urlopen("http://www.flickr.com/search/?q=&l=cc&ct=0&mt=all&adv=1#page=" + str(i)) # mi faccio stampare la pagina che sto analizzando, # in realtà non serve a nulla ma è utile per capire a che punto sono arrivato print "http://www.flickr.com/search/?q=&l=cc&ct=0&mt=all&adv=1#page=" + str(i) # creo la classe che andrà ad analizzare la pagina parser = parsehtml.PARSER() # associo alla classe la pagina che ho appena scaricato parser.feed(sock.read()) sock.close() parser.close() # per ogni link che è stato messo nel vettore scarica l'immagine corrispondente # per fare il download utilizzo un programma installato sul sistema chiamato aria2c # e salvo tutto nella cartella images for src in parser.linkimage: os.system('aria2c -d images ' + src) |
salvando i file nella stessa cartella, creando la cartella images e lanciando il programma con il classico:
python main.py
il vostro pc farà il download di tutte le immagini nelle prime 100 pagine mentre voi vi fate la vostra rossa (birra) preferita.
Ciao Alberto





















