J'essaie d'ouvrir une page de connexion (GET), de récupérer les cookies fournis par le serveur Web, puis de soumettre une paire nom d'utilisateur/mot de passe pour me connecter au site (POST).
En regardant cette question/réponse Stackoverflow , je pense que je ferais simplement ce qui suit:
import requests
import cookielib
URL1 = 'login Prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()
r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")
Cependant, dans r
, il y a set-cookie
dans l'en-tête, mais cela ne change pas dans l'objet jar
. En fait, rien n'est inséré dans jar
comme l'indique la réponse de la question liée.
Je contourne cela dans mon code en ayant un dict d'en-têtes et après avoir fait le GET ou le POST, en utilisant ceci pour gérer le set-cookie
entête:
headers['Cookie'] = r.headers['set-cookie']
Passer ensuite l'en-tête dans les méthodes de requêtes. Est-ce correct ou existe-t-il une meilleure façon d'appliquer le set-cookie
?
Ignorez le cookie-jar, laissez requests
gérer les cookies pour vous. Utilisez plutôt un objet session , il conservera les cookies et les renverra au serveur:
with requests.Session() as s:
r = s.get(URL1)
r = s.post(URL2, data="username and password data payload")
Il y a une classe incluse appelée session
qui gère automatiquement ce genre de chose pour vous. Vous pouvez en créer une instance, puis appeler à la place get
et set
directement sur cette instance.
import requests
URL1 = 'login Prompt page'
URL2 = 'login submission URL'
session = requests.Session()
r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")
Une autre méthode qui a fonctionné pour moi (sans utiliser objets de session ) est la suivante (testée dans v2.18.4
).
jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...
Notez que le code ci-dessus échouera en présence de redirections qui sont gérées de manière transparente par la bibliothèque Requests . Dans un tel cas, vous devez également mettre à jour votre pot avec les cookies envoyés dans les réponses de redirection. Par exemple. en faisant quelque chose comme ceci:
if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses
for historicResponse in response.history:
jar.update(historicResponse.cookies)