C’est quoi le plan;
Aujourd’hui, comment instrumenter un browser pour lui faire cracher un rendu de page web sur une debian le tout en console.
On va utiliser un truc nommé selenium qui est vieux comme le monde mais dont personne n’avait pensé à m’en parler avant. Et ce truc permettra de piloter un firefox. Pour se passer d’installation de debian graphique et pouvoir tout de meme le piloter on va utiliser xvfb qui est un serveur X “frame buffer”.. Bref un faux serveur X qui fait le rendu en ram sans l’afficher.
C’est partis
Primo on va installer quelque paquets nécessaires, et aussi firefox depuis un repository de linuxmint (ces psychorigides de debianistes n’aiment pas le licencing de Ffox ).
Première étape, installer la clef du repo (ayez confiiiiannnce, nooon ne le faite pas !).
sudo gpg --keyserver pgp.mit.edu --recv-keys 3EE67F3D0FF405B2 sudo gpg --export 3EE67F3D0FF405B2 > 3EE67F3D0FF405B2.gpg sudo apt-key add ./3EE67F3D0FF405B2.gpg sudo rm ./3EE67F3D0FF405B2.gpg
Ensuite on va ajouter ce repo dans notre liste de source de paquets (/etc/apt/source.list)
deb http://packages.linuxmint.com debian import
Et on est pret pour installer tout ce qu’il nous faut.
sudo apt-get update sudo apt-get install firefox xvfb libasound2 libdbus-glib-1-2 libgtk2.0-0
Et bien sur selenium qui va bien depuis PIP (on est sous debian hein…)
pip install -U selenium
Voila tout est pret.
Formidable selenium
C’est partis, on va piloter notre browser via python (Selenium supporte d’autre languages mais sérieux quoi, python ca me va) Voici le petit script qui va permettre de capturer un site web, il est dispo dans mon git à broll httpgrab.py.
#!/usr/bin/env python # coding=utf-8 import sys,os from selenium import webdriver # Functions def getparam(count): if len(sys.argv) != count+1: print 'My command' print 'To Use: '+ sys.argv[0]+ ' my params' sys.exit(1) else: return sys.argv[1],sys.argv[2] # Main Code ##### def main(): page, name = getparam(2) print ("get %s to %s" % (page,name)) print ("Start FFox") seleniumobj = webdriver.Firefox() print ("Get Page") seleniumobj.get(page) print ("Save Page") seleniumobj.save_screenshot(name) seleniumobj.quit() if __name__ == '__main__': main()
On le voit, c’est 3 lignes de code (firefox(), get(), save_screenshot()). Et quand on le lance c’est via xvfb-run qui va démarre le faux X pour notre firefox.
$ xvfb-run ./get_pageimg.py http://www.perdu.com perdu.png get http://www.perdu.com to perdu.png Start FFox Get Page Save Page
Et Bingo !
Phantomjs fait aussi du bon boulot, avec ce script de surcroit : https://github.com/maaaaz/webscreenshot