python: urllib2 jak wysłać plik cookie za pomocą żądania urlopen

Próbuję użyć urllib2, aby otworzyć adres url i wysłać konkretny tekst cookie na serwer. Np. chcę otworzyć stronę rozwiązać problemy szachowe , za pomocą określonego pliku cookie, np. search=1. Jak to zrobić?

Staram się wykonać następujące czynności:

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

Z góry dzięki

Author: Oleg Tarasenko, 2010-07-26

4 answers

Cookie to tylko kolejny nagłówek HTTP.

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

Zobacz urllib2 przykłady aby dowiedzieć się, jak dodać nagłówki HTTP do żądania.

Jest więcej sposobów na obsługę plików cookie. Niektóre moduły, takie jak cookielib , starają się zachowywać jak przeglądarka internetowa - pamiętaj, jakie pliki cookie otrzymałeś wcześniej i Automatycznie wysyłaj je ponownie w następujących żądaniach.
 110
Author: Messa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 14:51:38

Może używając cookielib.CookieJar może Ci pomóc. Na przykład, gdy publikujesz na Stronie Zawierającej formularz:

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()

EDIT:

Po komentarzu Piotra trochę rozbuduję. Z docs:

Klasa CookieJar przechowuje pliki cookie HTTP. Wyodrębnia pliki cookie z HTTP żądań i zwraca je w odpowiedziach HTTP. CookieJar automatycznie wygasają zawarte pliki cookie, gdy jest to konieczne. Podklasy to odpowiedzialny również za przechowywanie i pobieranie cookies z pliku lub baza danych.

Więc niezależnie od tego, jakie żądania wyślesz ze swoją instancją CookieJar, wszystkie pliki cookie będą obsługiwane automatycznie. Trochę jak twoja przeglądarka:)

Mogę mówić tylko z własnego doświadczenia i moim 99% przypadkiem użycia plików cookie jest otrzymanie pliku cookie, a następnie wysłanie go ze wszystkimi kolejnymi żądaniami w tej sesji. Powyższy kod obsługuje tylko to i robi to przejrzyście.

 56
Author: Morten Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 19:38:26

Możesz rzucić okiem na doskonałą bibliotekę Pythona HTTP o nazwie Requests . Sprawia, że każde zadanie związane z HTTP jest nieco łatwiejsze niż urllib2. Z sekcji Cookies poradnika quickstart:

Aby wysłać własne pliki cookie na serwer, możesz użyć parametru cookies:

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
 13
Author: Piotr Dobrogost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-02 20:07:32

Użyj cookielib . Podlinkowana strona dokumentu zawiera przykłady na końcu. Znajdziesz również tutorial tutaj.

 5
Author: Marcelo Cantos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-26 12:39:25