Table of Contents

14h00 - Fil rouge « Parcours XPath et Manipulation du DOM »

Navigation rapide : Lundi / Mardi / Mercredi / Jeudi / Vendredi Mémos : Perl / Python / Ruby

1

Il s'agit de se connecter une première fois au serveur de listes, pour initier le processus d'authentification.

On utilisera ici les modules urllib, lxml et lxml.html

  1. lancer une requête pour récupérer la page d'accueil du serveur de listes 'https://listes.example.com/sympa
  2. analyser la réponse renvoyée
    1. extraire de l'en-tête de la réponse le cookie sympa_session, et le sauvegarder pour plus tard
    2. extraire du corps de la réponse le premier formulaire (lxml.html)
  3. poster ce formulaire (ce qui correspond au click du bouton Connexion)
  4. regarder ce que l'on obtient

python

 1: #!/usr/bin/python
 2:
 3: import urllib
 4: import sys
 5: import lxml
 6: import lxml.html
 7:
 8: url="https://listes.example.com/sympa"
 9:
10: # on charge l'url du site
11: f=urllib.urlopen(url)
12:
13: if f.code != 200:
14:     print "Erreur %s"%f.code
15:
16: print "code: %s"%f.code
17: print "url finale : %s"%f.url
18: print "headers : %s"%f.headers
19:
20: # on récupère le cookie de Sympa
21: sympa_cookie=f.headers.getheader('Set-Cookie')
22: print "Le cookie obtenu est : %s"%sympa_cookie
23:
24: # on analyse le code avec lxml et on passe l'url d'origine
25: doc=lxml.html.document_fromstring(f.read(),base_url=url)
26:
27: # on récupère le premier formulaire
28: form=doc.forms[0]
29:
30: print "Contenu du formulaire : %s"%lxml.html.tostring(form)
31: # on soumet le formulaire
32: # clic sur connexion
33: result = lxml.html.submit_form(form)
34:
35: print "code: %s"%result.code
36: print "url finale : %s"%result.url
37: print "headers : %s"%result.headers

2

Comme on vient de le voir, le module urllib suit tout seul les redirections. Par contre, il ne sait pas gérer les Cookies. Nous allons voir comment utiliser urllib2 et cookielib pour gérer les cookies.

Lancez deux requètes successives à la page https://listes.example.com/sympa et affichez le cookie sympa_session.

python

 1: import urllib2
 2:
 3: url="https://listes.example.com/sympa"
 4:
 5: f=urllib2.urlopen("https://listes.example.com/sympa")
 6: print f.headers.getheader('Set-Cookie')
 7: f.close()
 8:
 9: f=urllib2.urlopen("https://listes.example.com/sympa")
10: print f.headers.getheader('Set-Cookie')
11: f.close()

Recommencez en ajoutant la gestion des cookies à urllib2.

python

 1: import urllib2
 2: import cookielib
 3:
 4: url="https://listes.example.com/sympa"
 5: cj=cookielib.CookieJar()
 6: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
 7: urllib2.install_opener(opener)
 8:
 9: f=urllib2.urlopen("https://listes.example.com/sympa")
10: print f.headers.getheader('Set-Cookie')
11: f.close()
12:
13: f=urllib2.urlopen("https://listes.example.com/sympa")
14: print f.headers.getheader('Set-Cookie')
15: f.close()
16:
17: for cookie in cj:
18:     print "%s=%s"%(cookie.name,cookie.value)

3

La page obtenue en 1 contient plusieurs formulaires. Nous allons soumettre le formulaire fm1 contenu dans cette page, après avoir rempli les champs contenus dans le fichier cas_credential.yaml.

cas_credential.yaml

1: username: leonardo.davinci
2: password: joconde

Affichez l'URL finale obtenue et les headers.

python

 1: import urllib
 2: import urllib2
 3: import cookielib
 4: import sys
 5: import re
 6: import lxml
 7: import lxml.html
 8: import yaml
 9:
10: # une fonction pour que lxml.html utilise nos paramètres d'urllib2 plutôt que les paramètres par défaut
11: def open_url(method, url, values):
12:     if not url:
13:         raise ValueError("cannot submit, no URL provided")
14:         if method == 'GET':
15:                 if '?' in url:
16:                         url += '&'
17:                 else:
18:                         url += '?'
19:                 url += urllib.urlencode(values)
20:                 data = None
21:         else:
22:                 data = urllib.urlencode(values)
23:     return urllib2.urlopen(url,data)
24:
25:
26: url="https://listes.example.com/sympa"
27:
28: cj=cookielib.CookieJar()
29: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
30:
31: urllib2.install_opener(opener)
32:
33: # on installe nos paramètres dans lxml.html
34: lxml.html.open_http_urllib=open_url
35:
36: r1=urllib2.urlopen(url)
37: # on récupère le cookie de Sympa
38: sympa_cookie=r1.headers.getheader('Set-Cookie')
39: # on analyse le code avec lxml et on passe l'url d'origine
40: doc=lxml.html.document_fromstring(r1.read(),base_url=url)
41: # on récupère le premier formulaire
42: form=doc.forms[0]
43:
44: # on soumet le formulaire
45: result = lxml.html.submit_form(form)
46:
47: #print result
48: print "code: %s"%result.code
49: print "headers: %s"%result.headers
50:
51: cas_cookie=result.headers.getheader('Set-Cookie')
52:
53: for form in lxml.html.parse(result).getroot().forms:
54:     if 'id' in form.fields:
55:         if form.fields['id']=="fm1":
56:             break
57:
58: # on lit les données d'authentiification dans le fichier cas_credential.yaml
59: source_yaml=open('cas_credential.yaml')
60: credentials=yaml.load(source_yaml.read())
61: for i in credentials.keys():
62:     form.fields[i]=credentials[i]
63:
64: result = lxml.html.submit_form(form)
65:
66: # on recupere les cookies !
67:
68: print "code %s"%result.code
69: print "url %s"%result.url
70: print "headers : %s"%result.headers

4

Nous sommes authentifiés sur le server sympa ! Pour le vérifier, on va extraire de la page retournée le contenu de la division id=Identity, qui doit contenir l'identité du visiteur. Affichez également les valeurs de tous les cookies obtenus.

python

 1: import urllib
 2: import urllib2
 3: import cookielib
 4: import sys
 5: import re
 6: import lxml
 7: import lxml.html
 8: import yaml
 9:
10: # une fonction pour que lxml.html utilise nos paramètres d'urllib2 plutôt que les paramètres par défaut
11: def open_url(method, url, values):
12:     if not url:
13:         raise ValueError("cannot submit, no URL provided")
14:         if method == 'GET':
15:                 if '?' in url:
16:                         url += '&'
17:                 else:
18:                         url += '?'
19:                 url += urllib.urlencode(values)
20:                 data = None
21:         else:
22:                 data = urllib.urlencode(values)
23:     return urllib2.urlopen(url,data)
24:
25:
26: url="https://listes.example.com/sympa"
27:
28: cj=cookielib.CookieJar()
29: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
30:
31: urllib2.install_opener(opener)
32:
33: # on installe nos paramètres dans lxml.html
34: lxml.html.open_http_urllib=open_url
35:
36: r1=urllib2.urlopen(url)
37: # on récupère le cookie de Sympa
38: sympa_cookie=r1.headers.getheader('Set-Cookie')
39: # on analyse le code avec lxml et on passe l'url d'origine
40: doc=lxml.html.document_fromstring(r1.read(),base_url=url)
41: # on récupère le premier formulaire
42: form=doc.forms[0]
43:
44: # on soumet le formulaire
45: result = lxml.html.submit_form(form)
46:
47: #print result
48: print "code: %s"%result.code
49: print "headers: %s"%result.headers
50:
51: cas_cookie=result.headers.getheader('Set-Cookie')
52:
53: for form in lxml.html.parse(result).getroot().forms:
54:     if 'id' in form.fields:
55:         if form.fields['id']=="fm1":
56:             break
57:
58: # on lit les données d'authentiification dans le fichier cas_credential.yaml
59: source_yaml=open('cas_credential.yaml')
60: credentials=yaml.load(source_yaml.read())
61: for i in credentials.keys():
62:     form.fields[i]=credentials[i]
63:
64: result = lxml.html.submit_form(form)
65:
66: tree=lxml.html.parse(result).getroot()
67: print (tree.xpath('//div[@id="Identity"]')[0]).text
68:
69: # on recupere les cookies !
70: for cookie in cj:
71:     print cookie.name+"="+cookie.value