2010-03-11 19 views
7

तो मैं urllib3 में देख रहा हूं क्योंकि इसमें कनेक्शन पूलिंग है और थ्रेड सुरक्षित है (इसलिए प्रदर्शन बेहतर है, विशेष रूप से क्रॉलिंग के लिए), लेकिन दस्तावेज है ... कम से कम कहने के लिए न्यूनतम। urllib2 है build_opener इसलिए की तरह कुछ:पायथन urllib3 और कुकी समर्थन को संभालने के लिए कैसे?

#!/usr/bin/python 
import cookielib, urllib2 
cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
r = opener.open("http://example.com/") 

लेकिन urllib3 कोई build_opener विधि है, तो एक ही रास्ता मैं अब तक पता लगा है मैन्युअल रूप से शीर्ष लेख में यह डाल करने के लिए है:

#!/usr/bin/python 
import urllib3 
http_pool = urllib3.connection_from_url("http://example.com") 
myheaders = {'Cookie':'some cookie data'} 
r = http_pool.get_url("http://example.org/", headers=myheaders) 

लेकिन मैं कर रहा हूँ उम्मीद है कि एक बेहतर तरीका है और आप में से एक मुझे बता सकता है कि यह क्या है। इसके अलावा कोई इसे "urllib3" के साथ टैग कर सकता है।

+0

@bigredbob, टैग के रूप में आप से पूछा जाना चाहिए। मैंने urllib3 के स्रोतों को देखा है और ऐसा लगता है कि 'ओपनर' ऑब्जेक्ट्स सहित urllib2 में से कोई भी बदलाव और मोड़ नहीं है, इसलिए मुझे संदेह है कि आपके लिए एक जादू की छड़ी है। आइए आशा करते हैं कि यह समय के साथ परिपक्व हो जाए, क्योंकि यह अभी तक बहुत ही बेकार है! -) –

उत्तर

9

आप सही हैं, अभी यह करने का कोई बेहतर तरीका नहीं है। यदि आपके पास एक संगत सुधार है तो मैं पैच को स्वीकार करने से खुश हूं।

ध्यान में रखना एक बात है, urllib3 के HTTPConnectionPool को एक विशिष्ट होस्ट के लिए "कनेक्शन का पूल" होना चाहिए, जैसा कि एक राज्यव्यापी ग्राहक के विपरीत है। उस संदर्भ में, वास्तविक पूल के बाहर कुकीज़ की ट्रैकिंग को रखने के लिए यह समझ में आता है।

  • shazow (urllib3 के लेखक)
+0

अगर मुझे पता था कि इसे कैसे पैच करना है, तो मुझे अच्छा लगेगा, लेकिन मैं अच्छा नहीं हूं। यह जानना अच्छा है कि मैं कम से कम गलत नहीं कर रहा हूं। – bigredbob

1

आपको 'Cookie''Set-Cookie', 'Set-Cookie' वेब सर्वर द्वारा सेट करने की आवश्यकता है।

और कुकीज हेडर में से एक हैं, इसलिए ऐसा करने में कुछ भी गलत नहीं है।

+0

हाँ, जो एक टाइपो था, लेकिन मेरा सवाल अभी भी खड़ा है, मुझे एक बेहतर तरीका चाहिए (यानी अंतर्निर्मित इन्स का उपयोग करना)। – bigredbob

2

वहाँ कई कुकी में कोई समस्या नहीं है?

कुछ सर्वर एकाधिक सेट-कुकी शीर्षलेख लौटाते हैं, लेकिन urllib3 हेडर को एक टोकरे में संग्रहीत करता है और एक निर्देश एक ही कुंजी के साथ एकाधिक प्रविष्टियों की अनुमति नहीं देता है।

httplib2 की एक ही समस्या है।

या हो सकता है नहीं: यह पता चला है कि httplib पैकेज में HTTPMessage वर्ग के readheaders विधि - जो दोनों urllib3 और httplib2 उपयोग - निम्न टिप्पणी: साथ

यदि एक से अधिक शीर्ष लेख फ़ील्ड एक ही नाम होते हैं, वे RFC 2616 सेकंड 4.2 में नियमों के अनुसार संयोजित किया जाता है:

Appending each subsequent field-value to the first, each separated 
    by a comma. The order in which header fields with the same field-name 
    are received is significant to the interpretation of the combined 
    field value. 

तो कोई हेडर खो जाते हैं।

हालांकि, हेडर वैल्यू के भीतर अल्पविराम होने पर कोई समस्या है। मैंने अभी तक यह नहीं पता लगाया है कि क्या हो रहा है, लेकिन आरएफसी 2616 ("हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल - एचटीटीपी/1.1") और आरएफसी 2 9 65 ("HTTP स्टेट मैनेजमेंट मैकेनिज्म") को स्किमिंग से मुझे इंप्रेशन मिलता है कि हेडर के भीतर कोई भी कॉमा मूल्य उद्धृत किया जाना चाहिए।

+0

आरएफसी 6265 का कहना है कि सेट-कुकी को इसे संभालने के लिए विशेष आधार होना चाहिए। httplib python 2 में ऐसा नहीं कर रहा है ... http://bugs.python.org/issue1660009 – reteptilian

2

आपको अनुरोध पुस्तकालय का उपयोग करना चाहिए। यह urllib3 का उपयोग करता है लेकिन कुकीज़ को तुच्छ जोड़ने जैसी चीज़ें बनाता है।

https://github.com/kennethreitz/requests

import requests 
r1 = requests.get(url, cookies={'somename':'somevalue'}) 
print(r1.content) 
+0

देखें क्या यह मेरे ब्राउज़र में कुकी जोड़ना है? यदि हां, तो कुछ कारण क्या हैं जो काम नहीं करेंगे? मैंने अपाचे सर्वर, विंडोज 10, पायथन 2.75 पर चल रही अपनी स्थानीय वेबसाइट पर इसका परीक्षण किया। –

1

आप इस प्रकार का कोड का उपयोग कर सकते हैं:

def getHtml(url): 
    http = urllib3.PoolManager() 
    r = http.request('GET', url, headers={'User-agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36','Cookie':'cookie_name=cookie_value'}) 
    return r.data #HTML 

आप cookie_name की जगह और cookie_value

संबंधित मुद्दे