Executer du javascript sous python

Le crawling est un de mes passe-temps favoris, j’aime bien analyser le code des autres, voir leur petites astuces, piquer des données ici et là ;). quelques fois sur des sites où les données sont vraiment le coeur du business, les liens voir meme des données sont cryptés via des fonctions javascript ex:

<a href=”#” onclick="xxxx('LeVtIJpEJCIQeVsSVuWyUvkUdkWMkUoKK3WxfWiEdKWfGVzCQriSCVIIVWwJEStQlcVQMVQqnEJCnVBxyezsqilzsxdh')">page 2</a>

Le problème c’est que les crawlers n'exécutent pas du javascript, donc impossible de savoir où va ce lien sans le décrypter en javascript, ma première façon de faire était de reproduire la fonction de décryptage en python. Cette méthode devenait rapidement très lourde à maintenir, jusqu’à ce que je découvre python-spidermonkey.

Python-spidermonkey est tout simplement un pont vers spidermonkey, ce qui veut dire qu’on peut exécuter des fonctions javascript avec du python, ou même mixer entre les 2 langages (passer des variables du python au js ...). voici comment ça se passe.

>>> import spidermonkey
>>> rt = spidermonkey.Runtime()
>>> cx = rt.new_context()
>>> func = cx.execute('function(val) {return val*2}')
>>> func(3)
6

Il suffit alors d'appeller la fonction de décryptage et le tour est joué.

Pour les fans du php il existe un bridge spidermonkey pour php aussi http://pecl.php.net/package/spidermonkey/0.1.4.

A bientôt ;).

Commentaires (7):

Par Julien
Je pensais mettre plus de temps a comprendre cette technique. :) Je debute en Python et j'en apprends beaucoup ici. Un grand MERCI!!
Par paul
bonjour, Votre article m'a beaucoup intéressé. Pouvez vous m'en dire plus sur le fait de décrypter un lien à partir d'une page web, c'est à dire la façon dont je pourrais procéder ? Merci
Par Amine
Bonjour Paul, cela dépend de la librairie de crawling que tu utilises par exemple sous selenium ou Scrapy et [ce snippet][1] tu peut carement executer tout le javascript d'une page et y accéder à la dom via du code python ou java ... Sinon, si tu utilises les modules natifs de python (urllib) pour accéder à une page web à ce moment là tu devras recopier la fonction qui décode le lien dans cx.execute('function decodage') comme dans l'exemple précédant. [1]: http://snippets.scrapy.org/snippets/21/
Par paul
bonjour, Merci pour votre réponse, j'utilise Mechanize qui n'interprète pas le javascript. Est ce que le couplage selenium scrapy est plus efficace ? Car je souhaites également soumettre des formulaires... Qu'en pensez vous ?
Par Maxime Fromholtz
Bonjour, votre méthode pour intégrer du javascript dans un script en python m'intéresse vraiment. Pourriez-vous m'en dire un peu plus? Mon but étant d'intégrer une bibliothèque javascript gérant les fonctions de zoom d'un svg dans un script en python qui génère ce même svg. Merci d'avance
Par Amine
@Paul, A mon avis si tu veux crawler plusieurs sources je te conseilles vivement de passer à scrapy, il te permettra de bien structurer ton code, créer des alertes, des middleware, remplir des [formulaires][1] ... et il y a des gens bcp de snippets en ligne. sinon tu peux rester sur Mechanize. de toute façon spidermonkey marche avec toutes ces librairies. @maxime, je pense que tu te mélanges les pinceaux, une librairie SVG en javascript ne peut être utilisé coté serveur, car elle doit manipuler le DOM directement, ce qui n'est pas le cas coté serveur. si cela ne répond pas à ta question j'aimerai bien plus de précisions (nom de la librairie). [1]: http://doc.scrapy.org/en/latest/topics/request-response.html#formrequest-objects
Par Maxime Fromholtz
C'est plus que probable que je me mélange les pinceaux, j'ai commencé l'informatique il y a trois mois. Bref, j'ai trouvé la librairie SVGpan ici :http://code.google.com/p/svgpan/ et je voulais savoir si c'était faisable de l'intégrer dans un script python générant du svg à partir d'un fichier gml.

Ajouter un commentaire

Nom :*
Email :*
Site perso :
Commentaire :*
chargement