python: urllib2 wie man ein Cookie mit einer URLopen-Anfrage sendet

82

Ich versuche, urllib2 zu verwenden, um die URL zu öffnen und bestimmten Cookie-Text an den Server zu senden. ZB möchte ich die Site öffnen Löse Schachprobleme mit einem bestimmten Cookie, zB search = 1. Wie mache ich es?

Ich versuche Folgendes zu tun:

import urllib2
(need to add cookie to the request somehow)
urllib2.urlopen("http://chess-problems.prg")

Danke im Voraus

Oleg Tarasenko
quelle

Antworten:

111

Cookie ist nur ein weiterer HTTP-Header.

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")

In den urllib2-Beispielen finden Sie weitere Möglichkeiten zum Hinzufügen von HTTP-Headern zu Ihrer Anforderung.

Es gibt weitere Möglichkeiten, mit Cookies umzugehen. Einige Module wie cookielib versuchen, sich wie ein Webbrowser zu verhalten. Denken Sie daran, welche Cookies Sie zuvor erhalten haben, und senden Sie sie bei folgenden Anfragen automatisch erneut.

Messa
quelle
9
Wenn Sie mehrere Cookies haben, müssen Sie diese in einem einzigen Headerwert verbinden, der durch ein Semikolon getrennt ist. Wenn Sie beispielsweise ein Wörterbuch mit Cookie-Werten aufgerufen haben cookievals, verwenden Sie opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Greg Glockner
Was ist, wenn sie andere Parameter zum URL-Öffnen verwenden?
Andrew
56

Vielleicht kann Ihnen die Verwendung von cookielib.CookieJar helfen. Zum Beispiel beim Posten auf einer Seite, die ein Formular enthält:

import urllib2
import urllib
from cookielib import CookieJar

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# input-type values from the html form
formdata = { "username" : username, "password": password, "form-id" : "1234" }
data_encoded = urllib.urlencode(formdata)
response = opener.open("https://page.com/login.php", data_encoded)
content = response.read()

BEARBEITEN:

Nach Piotrs Kommentar werde ich etwas näher darauf eingehen. Aus den Dokumenten:

Die CookieJar-Klasse speichert HTTP-Cookies. Es extrahiert Cookies aus HTTP-Anforderungen und gibt sie in HTTP-Antworten zurück. CookieJar-Instanzen verfallen bei Bedarf automatisch in enthaltenen Cookies. Unterklassen sind auch für das Speichern und Abrufen von Cookies aus einer Datei oder Datenbank verantwortlich.

CookieJarUnabhängig davon, welche Anforderungen Sie an Ihre Instanz stellen, werden alle Cookies automatisch verarbeitet. Ein bisschen wie dein Browser :)

Ich kann nur aus eigener Erfahrung sprechen und mein 99% iger Anwendungsfall für Cookies besteht darin, ein Cookie zu erhalten und es dann mit allen nachfolgenden Anfragen in dieser Sitzung zu senden. Der obige Code behandelt genau das und dies transparent.

Morten Jensen
quelle
6
@PiotrDobrogost Sie haben Recht, ich sende kein bestimmtes Cookie mit diesem Code :) Ich gehe davon aus, dass ich beim POST ein Cookie erhalte und die CookieJarInstanz es von nun an für mich auf allen relevanten Domains erledigt .
Morten Jensen
2
Das OP gibt eindeutig an (…), dass ein bestimmter Cookie-Text gesendet werden soll (…), daher ist dies keine Antwort.
Piotr Dobrogost
13

Vielleicht möchten Sie einen Blick auf die hervorragende HTTP-Python-Bibliothek namens Requests werfen . Es macht jede Aufgabe mit HTTP ein bisschen einfacher als urllib2. Aus dem Abschnitt " Cookies " der Kurzanleitung:

Um Ihre eigenen Cookies an den Server zu senden, können Sie den Cookie-Parameter verwenden:

>>> cookies = dict(cookies_are='working')

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
Piotr Dobrogost
quelle
1
Es basiert auf urllib3, unterstützt das Pooling von Verbindungen wie urllib3 und behält Cookies und Header bei - siehe Requests Session. Es ist wunderschön!
Serge S.
5

Verwenden Sie Cookielib . Die verknüpfte Dokumentseite enthält am Ende Beispiele. Sie finden auch ein Tutorial finden hier .

Marcelo Cantos
quelle
Im Tutorial speichern sie Cookies, nachdem sie sie vom Server erhalten haben, nicht wahr?
Oleg Tarasenko
Beide speichern vom Server abgerufene Cookies und geben sie an den Server zurück, da Cookies normalerweise so funktionieren. Wenn Sie etwas Außergewöhnliches tun möchten, müssen Sie etwas tiefer in die Bibliothek eintauchen. Ich bin mir ziemlich sicher, dass es alles unterstützt, was Sie tun möchten.
Marcelo Cantos
1

Diese Antwort funktioniert nicht, da das urllib2Modul in Python 3 auf mehrere Module aufgeteilt wurde. Sie müssen dies tun

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
Solal
quelle