web-dev-qa-db-fra.com

Python Demandes - Gestion des cookies

J'essaie d'obtenir du contenu automatiquement d'un site à l'aide de demandes (et de BS4)

J'ai un script qui obtient un cookie:

def getCookies(self):
    username = 'username'
    password = 'password'
    URL = 'logonURL'
    r = requests.get(URL, auth=('username', 'password'))
    cookies = r.cookies

le vidage des cookies ressemble à:

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie ASP.NET_SessionId=yqokjr55ezarqbijyrwnov45 for URL.com/>, <Cookie BIGipServerPE_Journals.lww.com_80=1440336906.20480.0000 for URL.com/>, <Cookie JournalsLockCookie=id=a5720750-3f20-4207-a500-93ae4389213c&ip=IP address for URL.com/>]>

Mais quand je passe l'objet de la cookie à l'URL suivante:

 soup = Soup(s.get(URL, cookies = cookies).content)

sa ne fonctionne pas - je peux voir en déversant la soupe que je ne donne pas au serveur Web mes informations d'identification correctement

J'ai essayé d'exécuter une session de demande:

def getCookies(self):
    self.s = requests.session()
    username = 'username'
    password = 'password'
    URL = 'logURL'
    r = self.s.get(URL, auth=('username', 'password'))

et j'ai la même joie.

J'ai regardé l'en-tête via Livehttp à FF lorsque je visiterai la deuxième page et voir une forme très différente:

Cookie: WT_FPC=id=264b0aa85e0247eb4f11355304127862:lv=1355317068013:ss=1355314918680; UserInfo=Username=username; BIGipServerPE_Journals.lww.com_80=1423559690.20480.0000; PlatformAuthCookie=true; Institution=ReferrerUrl=http://logonURL.com/?wa=wsignin1.0&wtrealm=urn:adis&wctx=http://URL.com/_layouts/Authenticate.aspx?Source=%252fpecnews%252ftoc%252f2012%252f06440&token=method|ExpireAbsolute; counterSessionGuidId=6e2bd57f-b6da-4dd4-bcb0-742428e08b5e; MyListsRefresh=12/13/2012 12:59:04 AM; ASP.NET_SessionId=40a04p45zppozc45wbadah45; JournalsLockCookie=id=85d1f38f-dcbb-476a-bc2e-92f7ac1ae493&ip=10.204.217.84; FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il9mMGU5N2M3Zi1jNzQ5LTQ4ZjktYTUxNS1mODNlYjJiNGNlYzUtNEU1MDQzOEY0RTk5QURCNDFBQTA0Mjc0RDE5QzREMEEiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI+PElkZW50aWZpZXI+dXJuOnV1aWQ6ZjJmNGY5MGItMmE4Yy00OTdlLTkwNzktY2EwYjM3MTBkN2I1PC9JZGVudGlmaWVyPjxJbnN0YW5jZT51cm46dXVpZDo2NzMxN2U5Ny1lMWQ3LTQ2YzUtOTg2OC05ZGJhYjA3NDkzOWY8L0luc3RhbmNlPjwvU2VjdXJpdHlDb250ZXh0VG9rZW4+

J'ai rédigé le nom d'utilisateur, le mot de passe et les URL de la question pour des raisons évidentes.

Est-ce que je manque quelque chose d'évident? Existe-t-il un moyen différent/approprié de capturer le cookie - la méthode actuelle que j'utilise ne fonctionne pas.

ÉDITER:

Ceci est une version autonome du code Sinessed:

s = requests.session()
username = 'username'
password = 'password'
URL = 'logonURL.aspx'
r = s.get(URL, auth=('username', 'password'))
URL = r"URL.aspx"
soup = Soup(s.get(URL).content)

en lisant une vidage de la soupe, je peux voir dans le HTML que sa dise que je n'ai pas accès - cette chaîne n'apparaît que via navigateur lorsque vous n'êtes pas connecté.

14
Jay Gattuso

J'ai eu un problème similaire et j'ai trouvé de l'aide dans cette question. Le pot de session était vide et pour obtenir le cookie, je devais utiliser une session.

session = requests.session()
p = session.post("http://example.com", {'user':user,'password':password})
print 'headers', p.headers
print 'cookies', requests.utils.dict_from_cookiejar(session.cookies)
print 'html',  p.text
23
arhuaco

Vous devez réutiliser l'objet session objet, pas le cookiejar associé. Utilisez self.s Pour toutes les demandes que vous faites.

Si vos demandes échouent toujours lors de la réutilisation de la session, elles échoueront pour une raison différente, non pas parce que vous ne retournez pas correctement les cookies.

Notez que si vous avez besoin d'utiliser auth=('username', 'password'), l'authentification est basée sur HTTPAUTH, non basée sur les cookies. Vous devez passer dans la même authentification pour tous les appels. La session des demandes peut aussi faire cela pour vous aussi:

s = requests.session(auth=('username', 'password'))

Si, toutefois, la page de connexion est un formulaire avec un champ Nom d'utilisateur et mot de passe, vous devez appeler la cible de formulaire à la place. Vérifiez si le formulaire est POST ou obtenez-vous et vérifiez les noms de champ:

s.post(loginTarget, {usernamefield=username, passwordfield=password, otherfield=othervalue})

et ne pas utiliser l'authentification HTTP du tout.

7
Martijn Pieters