python: urllib2 urlopen isteği ile çerez nasıl gönderilir


83

Url'yi açmak ve sunucuya belirli çerez metni göndermek için urllib2'yi kullanmaya çalışıyorum. Örneğin, siteyi açmak istiyorum Belirli bir çerez ile satranç problemlerini çözün , örneğin arama = 1. Nasıl yaparım?

Aşağıdakileri yapmaya çalışıyorum:

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

Şimdiden teşekkürler

Yanıtlar:


112

Çerez sadece başka bir HTTP başlığıdır.

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

İsteğinize HTTP üstbilgilerini eklemenin diğer yolları için urllib2 örneklerine bakın .

Çerezleri nasıl kullanacağınızın daha fazla yolu var. Cookielib gibi bazı modüller web tarayıcısı gibi davranmaya çalışır - daha önce hangi çerezleri aldığınızı hatırlayın ve sonraki isteklerde bunları otomatik olarak tekrar gönderin.


9
Birden fazla çereziniz varsa, bunları noktalı virgülle ayrılmış tek bir başlık değerinde birleştirmeniz gerekir. Örneğin, adında bir çerez değerleri sözlüğünüz cookievalsvarsa kullanın opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Greg Glockner

Ya urlopen için başka parametreler kullanıyorlarsa?
Andrew

56

Belki cookielib.CookieJar kullanmak size yardımcı olabilir. Örneğin, form içeren bir sayfaya gönderi gönderirken:

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

DÜZENLE:

Piotr'ın yorumundan sonra biraz ayrıntıya gireceğim. Dokümanlardan:

CookieJar sınıfı, HTTP tanımlama bilgilerini depolar. Tanımlama bilgilerini HTTP isteklerinden çıkarır ve bunları HTTP yanıtlarında döndürür. CookieJar örnekleri, gerektiğinde içerilen tanımlama bilgilerini otomatik olarak sona erdirir. Alt sınıflar ayrıca bir dosyadan veya veritabanından tanımlama bilgilerini depolamak ve almaktan sorumludur.

Dolayısıyla, CookieJarörneğinizle ne talep ederseniz edin , tüm çerezler otomatik olarak işlenir. Tarayıcınızın yaptığı gibi :)

Yalnızca kendi deneyimlerime dayanarak konuşabilirim ve çerezler için% 99 kullanım durumum bir çerez almak ve daha sonra bu oturumdaki tüm sonraki isteklerle birlikte göndermemdir. Yukarıdaki kod tam da bunu ele alıyor ve bunu şeffaf bir şekilde yapıyor.


6
@PiotrDobrogost haklısınız, bu kodla belirli bir çerez göndermiyorum :) POST sırasında bir tane alacağımı varsayıyorum ve CookieJaro andan itibaren ilgili tüm alan adlarında bunu benim için halledecek.
Morten Jensen

2
OP açıkça (…) belirli bir tanımlama bilgisi metni (…) göndermeyi belirtir , dolayısıyla bu bir yanıt değildir.
Piotr Dobrogost

13

Requests adlı mükemmel HTTP Python kitaplığına bir göz atmak isteyebilirsiniz . HTTP ile ilgili her görevi urllib2'den biraz daha kolay hale getirir. Gönderen Çerezler hızlı başlangıç rehberi bölüm:

Kendi çerezlerinizi sunucuya göndermek için çerezler parametresini kullanabilirsiniz:

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

1
Bu dayanıyor urllib3o urllib3 gibi bağlantıları ve devam ederse çerezler, başlıkları havuzlama destekler, - bkz Requests Session. Bu güzel!
Serge S.

5

Cookielib kullanın . Bağlantılı doküman sayfası, sonunda örnekler sunar. Ayrıca burada bir eğitim bulacaksınız .


Öğreticide, çerezi sunucudan aldıktan sonra kaydediyorlar değil mi?
Oleg Tarasenko

Her ikisi de sunucudan alınan çerezleri kaydediyor ve onları sunucuya geri gönderiyor, çünkü çerezler genellikle bu şekilde çalışıyor. Sıra dışı bir şey yapmak istiyorsanız, kütüphanede biraz daha derine inmeniz gerekecek. Yapmak istediğiniz her şeyi destekleyeceğinden oldukça eminim.
Marcelo Cantos

1

urllib2Modül Python 3'te birkaç modüle bölündüğü için bu cevap çalışmıyor . Yapmanız gereken

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.