Izgleda da je ovo tjedan 5 lajnera u pythonu. Anywho, radim neki backend za jedan hax0rski portal. U biti, radim neuspješnu reinkarnaciju Metafeeda-a u vidu naslovnice za site Razmjena vještina. Svečana prezentacija bi trebala biti na “Ništa se neće dogoditi”. Nakon toga siguran sam da će to biti vaš prvi (ako ne i jedini) feed uz koji ćete ujutro pijuckati kavu.
Daklem… jedna od stvari koja mi treba za backend portala je operacija “uzmi mi random sliku sa images.google.com”. Mislio sam da će biti nekog HTML parsanja sa BeautifulSoup ali moj dragi Google me lijepo iznenadio. Pljunu natrag gomilu JavaScripta koji izgenerira stranicu u samom Browseru. Koristeći najobičniji regular expression uzmem sadržaj tog JavaScript Arraya (kao string). Zgodno je što je u ovom slučaju sintaksa za Array polja u JavaScriptu identična Pythonovim listama pa iskoristim običan Pythonov eval da od toga dobijem Pythonovu listu. Da sam i imao želju za Djeda Mraza (iliti lika sa Coca-Coline reklame) ne bi bilo ovako lako na kraju.
Naravno, cijela ova fora će raditi dok Google ne odluči promjeniti sintaksu. Cilj skripte je pokazati ukratko kako sam rješio problem dobivanja URL-a slike (a i da popunim blog ovom trivijalijom). Zbog toga i nisam onečistio code sa provjerama u slučaju grešaka i neispravnih rezultata. Baš mi nešto i ne radi num argument za podešavanje broja rezultata na stranici. Zato koristim argument -p koji mi kaže na koju stranicu rezultata da odem.
Upotreba:
skini.py -p 4 krava muzara skini.py -r svinjska gripa
Skripta skini.py:
#!/usr/bin/python
import urllib2, urllib, re, sys, getopt, random
def fetchURL(query, start = 0): req = urllib2.Request('http://images.google.com/images?hl=en&q=%s&gbv=2&aq=f&oq=&aqi=g10&start=%s' % (urllib.quote_plus(query), start)) req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1pre) Gecko/20090701 Ubuntu/8.10 (intrepid) Shiretoko/3.5.1pre') req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') req.add_header('Accept-Language', 'en-us,en;q=0.5') req.add_header('Accept-Encoding', 'deflate') req.add_header('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7') req.add_header('Connection', 'close') r = urllib2.urlopen(req) data = r.read() return data
def parseImages(data): p = re.compile(";dyn\.setResults\(\[(.+)\]\);\<\/script\>") m = p.search(data) lst = eval(m.group(1)) return lst
if __name__ == '__main__': try: optlist, args = getopt.getopt(sys.argv[1:], 'rp:') except getopt.GetoptError, err: print "skini.py [-p <page number>] [-r] args\n" print str(err) sys.exit(-1) start, isRandom = 0, False for arg, value in optlist: if arg == '-p': start = value if arg == '-r': isRandom = True data = fetchURL(' '.join(args), start = start) images = parseImages(data) if not isRandom: for img in images: print img[3] else: print random.choice(images)[3]