Comment utiliser Python pour se connecter à une page Web et récupérer les cookies pour une utilisation ultérieure?


146

Je veux télécharger et analyser une page Web en utilisant python, mais pour y accéder, j'ai besoin de quelques cookies. Par conséquent, je dois d'abord me connecter via https à la page Web. Le moment de connexion implique l'envoi de deux paramètres POST (nom d'utilisateur, mot de passe) à /login.php. Lors de la demande de connexion, je souhaite récupérer les cookies de l'en-tête de réponse et les stocker afin de pouvoir les utiliser dans la demande de téléchargement de la page Web /data.php.

Comment ferais-je cela en python (de préférence 2.6)? Si possible, je souhaite uniquement utiliser des modules intégrés.

Réponses:


147
import urllib, urllib2, cookielib

username = 'myuser'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('http://www.example.com/login.php', login_data)
resp = opener.open('http://www.example.com/hiddenpage.php')
print resp.read()

resp.read()est le html simple de la page que vous souhaitez ouvrir, et vous pouvez utiliser openerpour afficher n'importe quelle page à l'aide de votre cookie de session.


1
Est-ce sûr? Cela ne permettra-t-il pas aux renifleurs de paquets de voir les mots de passe en clair? L'utilisation de Https serait-elle plus sûre?
— Heartinpiece

2
@Heartinpiece Oui, si le serveur le propose, vous devez utiliser HTTPS.
— Harley Holcombe

Merci ... mais imaginons que nous nous sommes connectés et que nous voulons poster qc ... comment définir coockie dans ce fil pour les données de publication?
— MLSC

Je recommande vivement d'utiliser la bibliothèque de requêtes si vous écrivez du code volumineux. (expérience personnelle)
— swapnil jariwala

157

Voici une version utilisant l'excellente bibliothèque de requêtes :

from requests import session

payload = {
    'action': 'login',
    'username': USERNAME,
    'password': PASSWORD
}

with session() as c:
    c.post('http://example.com/login.php', data=payload)
    response = c.get('http://example.com/protected_page.php')
    print(response.headers)
    print(response.text)

3
Est-ce 'action': 'login'vraiment nécessaire dans cet exemple ou s'agit-il simplement d'un paramètre supplémentaire envoyé avec la demande?
— Ted le

1
@Ted Cette partie est absolument nécessaire.
— Sanghyun Lee

@Ted Peut-être que cela est requis dans cet exemple particulier. Ce n'était pas nécessaire dans mon programme.
— Highstaker

C'est le meilleur que je connaisse. Vous pourriez avoir des données selon le site Web.
— Jithin Pavithran
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.