अजगर: urllib2 urlopen अनुरोध के साथ कुकी कैसे भेजें


83

मैं urlib2 का उपयोग url खोलने और सर्वर पर विशिष्ट कुकी पाठ भेजने के लिए कर रहा हूँ। उदाहरण के लिए, मैं एक विशिष्ट कुकी, जैसे खोज = 1 के साथ साइट को हल करना चाहता हूं । मैं यह कैसे करुं?

मैं निम्नलिखित करने की कोशिश कर रहा हूं:

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

अग्रिम में धन्यवाद

जवाबों:


112

कुकी सिर्फ एक और HTTP हैडर है।

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

अपने अनुरोध में HTTP शीर्ष लेख जोड़ने के अन्य तरीकों के लिए urllib2 उदाहरण देखें ।

कुकीज़ को संभालने के तरीके और भी हैं। कूकीलिब जैसे कुछ मॉड्यूल वेब ब्राउज़र की तरह व्यवहार करने की कोशिश करते हैं - याद रखें कि आपको पहले क्या कुकीज़ मिली थीं और निम्नलिखित अनुरोधों में स्वचालित रूप से उन्हें फिर से भेजें।


9
यदि आपके पास एक से अधिक कुकीज़ हैं, तो आपको उन्हें एक शीर्ष लेख के मूल्य में शामिल करना होगा, जिसे अर्धविराम द्वारा अलग किया जाएगा। उदाहरण के लिए, यदि आपके पास कुकी मूल्यों का शब्दकोश है cookievals, तो उपयोग करें opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items())))
ग्रेग ग्लॉकर

क्या होगा अगर वे अन्य params को urlopen का उपयोग कर रहे हैं?
एंड्रयू

56

शायद cookielib.CookieJar का उपयोग करने से आपको मदद मिल सकती है। उदाहरण के लिए, जब एक फॉर्म वाले पेज पर पोस्ट किया जाता है:

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

संपादित करें:

पियोट्र की टिप्पणी के बाद मैं थोड़ा विस्तार करूँगा। डॉक्स से:

कुकीज वर्ग HTTP कूकीज को संग्रहीत करता है। यह HTTP अनुरोधों से कुकीज़ निकालता है, और उन्हें HTTP प्रतिसादों में देता है। कुकीज उदाहरणों में आवश्यक होने पर स्वचालित रूप से निहित कुकीज़ समाप्त हो जाते हैं। उपवर्ग एक फ़ाइल या डेटाबेस से कुकीज़ को संग्रहीत करने और पुनः प्राप्त करने के लिए भी जिम्मेदार हैं।

तो जो भी अनुरोध आप अपने CookieJarउदाहरण के साथ करते हैं , सभी कुकीज़ स्वचालित रूप से नियंत्रित की जाएंगी। अपने ब्राउज़र की तरह Kinda :)

मैं केवल अपने स्वयं के अनुभव से बोल सकता हूं और कुकीज़ के लिए मेरा 99% उपयोग-मामला कुकी प्राप्त करना है और फिर उस सत्र में सभी बाद के अनुरोधों के साथ इसे भेजने की आवश्यकता है। ऊपर दिए गए कोड को बस संभालता है, और यह इतनी पारदर्शिता से करता है।


6
@PiotrDobrogost आप सही हैं, मैं इस कोड के साथ एक विशिष्ट कुकी नहीं भेजता हूं :) मैं मान रहा हूं कि जब पोस्टिंग होगी तो मुझे एक प्राप्त होगा, और CookieJarउदाहरण तब से सभी प्रासंगिक डोमेन पर मेरे लिए इसे संभाल लेगा।
मोर्टन जेनसन

2
ओपी स्पष्ट रूप से विशिष्ट कुकी पाठ (…) भेजने के लिए कहता है (…) तो यह एक उत्तर नहीं है।
पियोत्र डोब्रोगोस्ट

13

आप अनुरोध नामक उत्कृष्ट HTTP पायथन पुस्तकालय पर एक नज़र डालना चाहते हैं । यह urlib2 की तुलना में HTTP से जुड़े प्रत्येक कार्य को थोड़ा आसान बनाता है। से कुकीज़ वाली मार्गदर्शिका की धारा:

अपनी खुद की कुकीज़ सर्वर पर भेजने के लिए, आप कुकीज़ पैरामीटर का उपयोग कर सकते हैं:

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

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

1
यह आधारित है urllib3, यह urllib3 जैसे कनेक्शन के पूलिंग का समर्थन करता है, और कुकीज़, हेडर - व्यू को बनाए रखता है Requests Session। यह खूबसूरत है!
सर्ज एस।

5

कुकिलिब का उपयोग करें । लिंक किए गए डॉक्टर पृष्ठ अंत में उदाहरण प्रदान करते हैं। आपको यहां एक ट्यूटोरियल भी मिलेगा ।


ट्यूटोरियल में वे सर्वर से प्राप्त करने के बाद कुकी को बचा रहे हैं न?
ओलेग तारासेंको

वे सर्वर से प्राप्त कुकीज़ को सहेज रहे हैं और उन्हें सर्वर पर वापस लौटा रहे हैं, क्योंकि यह आमतौर पर कुकीज़ कैसे काम करती है। यदि आप साधारण से हटकर कुछ करना चाहते हैं, तो आपको पुस्तकालय में थोड़ी गहराई खोदना होगा। मुझे पूरा यकीन है कि आप जो भी करना चाहते हैं उसका समर्थन करेंगे।
मार्सेलो कैंटोस

1

यह जवाब काम नहीं कर रहा है क्योंकि urllib2मॉड्यूल को पायथन 3 में कई मॉड्यूल में विभाजित किया गया है। आपको करने की आवश्यकता है

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.