python: urllib2 jak wysłać ciasteczko z prośbą o urlopen

83

Próbuję użyć urllib2 do otwarcia adresu URL i wysłania określonego tekstu cookie do serwera. Np. Chcę otworzyć witrynę Rozwiązywanie problemów szachowych z określonym plikiem cookie, np. Search = 1. Jak mam to zrobić?

Próbuję 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ękuję

Oleg Tarasenko
źródło

Odpowiedzi:

112

Cookie to po prostu kolejny nagłówek HTTP.

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

Zobacz przykłady urllib2, aby poznać inne sposoby dodawania nagłówków HTTP do żądania.

Istnieje więcej sposobów obsługi 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 kolejnych żądaniach.

Messa
źródło
9
Jeśli masz wiele plików cookie, musisz połączyć je w pojedynczej wartości nagłówka, oddzielonej średnikiem. Na przykład, jeśli masz słownik wartości plików cookie o nazwie cookievals, użyj opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Greg Glockner
A co jeśli używają innych parametrów do urlopen?
Andrew,
56

Może skorzystanie z cookielib.CookieJar może Ci pomóc. Na przykład podczas publikowania 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()

EDYTOWAĆ:

Po komentarzu Piotra trochę rozwinę. Z dokumentów:

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

Więc cokolwiek wyślesz do swojej CookieJarinstancji, wszystkie pliki cookie będą obsługiwane automatycznie. Tak jak twoja przeglądarka :)

Mogę mówić tylko z własnego doświadczenia, a moim przypadkiem używania plików cookie w 99% jest otrzymanie pliku cookie, a następnie wysłanie go przy wszystkich kolejnych żądaniach w tej sesji. Powyższy kod obsługuje właśnie to i robi to w sposób przejrzysty.

Morten Jensen
źródło
6
@PiotrDobrogost masz rację, nie wysyłam konkretnego ciasteczka z tym kodem :) Zakładam, że dostanę taki przy POST-owaniu i CookieJarinstancja będzie obsługiwała go za mnie od tej pory na wszystkich odpowiednich domenach.
Morten Jensen
2
OP wyraźnie stwierdza (…), aby wysłać określony tekst cookie (…), więc to nie jest odpowiedź.
Piotr Dobrogost
13

Możesz rzucić okiem na doskonałą bibliotekę HTTP Python o nazwie Requests . To sprawia, że ​​każde zadanie związane z HTTP jest trochę łatwiejsze niż urllib2. W sekcji Pliki cookie przewodnika szybkiego startu:

Aby wysłać własne pliki cookies na serwer, możesz skorzystać z parametru cookies:

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
Piotr Dobrogost
źródło
1
Jest oparty na urllib3, obsługuje pule połączeń, takie jak urllib3, i utrzymuje pliki cookie, nagłówki - patrz Requests Session. To jest piękne!
Serge S.
5

Użyj cookielib . Połączona strona dokumentu zawiera przykłady na końcu. Znajdziesz tu także tutorial tutaj .

Marcelo Cantos
źródło
W tutorialu zapisują plik cookie po otrzymaniu go z serwera, prawda?
Oleg Tarasenko
Oboje zapisują pliki cookie pobrane z serwera i zwracają je z powrotem na serwer, ponieważ zwykle tak działają pliki cookie. Jeśli chcesz zrobić coś niezwykłego, musisz zagłębić się w bibliotekę. Jestem prawie pewien, że będzie wspierać wszystko, co chcesz zrobić.
Marcelo Cantos
1

Ta odpowiedź nie działa, ponieważ urllib2moduł został podzielony na kilka modułów w Pythonie 3. Musisz to zrobić

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
Solal
źródło