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.

mandom
la source

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.

Harley Holcombe
la source
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)
Boden Garman
la source
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