2011-12-13 14 views
11

इस कर्ल आदेश मैं प्रतिक्रिया मैं बैशपाइथन अनुरोध मॉड्यूल के माध्यम से HTTP अनुरोध करना प्रॉक्सी के माध्यम से काम नहीं कर रहा है जहां कर्ल करता है? क्यूं कर?

से
curl -v -u z:secret_key --proxy http://proxy.net:80 \ 
-H "Content-Type: application/json" https://service.com/data.json 

I have already seen this other post on proxies with the Requests module

रहा हूँ प्राप्त करने के लिए कर रहा हूँ का उपयोग करते हुए और यह मुझे अजगर में मेरी कोड तैयार मदद की लेकिन मैं एक प्रॉक्सी के माध्यम से एक अनुरोध बनाने की जरूरत है । हालांकि, उचित प्रॉक्सी की आपूर्ति करते समय भी यह काम नहीं कर रहा है। शायद मैं कुछ नहीं देख रहा हूँ?

>>> requests.request('GET', 'https://service.com/data.json', \ 
>>> headers={'Content-Type':'application/json'}, \ 
>>> proxies = {'http' : "http://proxy.net:80",'https':'http://proxy.net:80'}, \ 
>>> auth=('z', 'secret_key')) 

इसके अलावा, उसी पायथन कंसोल पर मैं अनुरोध करने के लिए urllib का उपयोग कर सकता हूं, यह सफल हो गया है।

>>> import urllib 
>>> urllib.urlopen("http://www.httpbin.org").read() 
---results--- 

यहां तक ​​कि केवल एक गैर-https पते पर अनुरोध करने का प्रयास करने में विफल रहता है।

>>> requests.get('http://www.httpbin.org') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/Library/Python/2.6/site-packages/requests/api.py", line 79, in get 
    return request('get', url, **kwargs) 
File "/Library/Python/2.6/site-packages/requests/api.py", line 66, in request 
    prefetch=prefetch 
File "/Library/Python/2.6/site-packages/requests/sessions.py", line 191, in request 
    r.send(prefetch=prefetch) 
File "/Library/Python/2.6/site-packages/requests/models.py", line 454, in send 
    raise ConnectionError(e) 
requests.exceptions.ConnectionError: Max retries exceeded for url: 

अनुरोध इतने सुरुचिपूर्ण और भयानक हैं लेकिन यह इस उदाहरण में विफल कैसे हो सकता है?

+0

http://pycurl.sourceforge.net/ –

+1

मुझे पता है कि मैं शायद अपने मैक पर बहुत अधिक परेशानी के बिना सेटअप और उपयोग कर सकता हूं (या शायद किसी भी तरह)। मैं सिर्फ अनुरोधों का उपयोग करने के अधिक सुरुचिपूर्ण समाधान के लिए जाने की कोशिश कर रहा था जो कि बहुत ही बढ़िया और साफ है। यद्यपि सुझाव के लिए धन्यवाद। – dalanmiller

+0

अनुरोधों के साथ उपयोग के लिए प्रॉक्सी सेट अप करना ठीक है। आदर्श रूप से हम आपके देखने को पुन: उत्पन्न कर सकते हैं ... अन्यथा हमें बताएं कि यह क्यों काम नहीं करता है, यह एकमात्र अन्य विकल्प है। क्या आप अनुरोधों से एक स्टैक ट्रेस प्राप्त कर रहे हैं? आप अपने नेटवर्क की निगरानी भी कर सकते हैं और वास्तविक अनुरोधों की जांच कर सकते हैं, क्योंकि मैं केवल अनुमान लगा सकता हूं कि उन्हें कर्ल/अनुरोधों के बीच एक अलग प्रभाव के लिए अलग होना चाहिए। –

उत्तर

8

समस्या वास्तव में पाइथन के मानक यूआरएल एक्सेस पुस्तकालयों - urllib/urllib2/httplib के साथ निहित है। मुझे याद नहीं है कि कौन सी लाइब्रेरी सटीक अपराधी है, लेकिन सादगी के लिए, चलो बस इसे urllib कहते हैं। दुर्भाग्यवश, urllib HTTP कनेक्ट विधि को लागू नहीं करता है जो http (http) प्रॉक्सी के माध्यम से किसी https साइट तक पहुंचने के लिए आवश्यक है। Urllib का उपयोग करके कार्यक्षमता जोड़ने के मेरे प्रयास सफल नहीं हुए हैं (यह कोशिश करने के बाद से कुछ समय हो गया है)। तो दुर्भाग्यवश, मुझे लगता है कि एकमात्र विकल्प मैं काम करने के लिए जानता हूं इस मामले के लिए pycurl का उपयोग करना है।

हालांकि, एक ऐसा समाधान है जो अपेक्षाकृत साफ है जो लगभग उसी एपीआई को पायथन अनुरोध के रूप में है, लेकिन यह पायथन मानक पुस्तकालयों के बजाय एक पिकुरल बैकएंड का उपयोग करता है।

लाइब्रेरी को human_curl कहा जाता है। मैंने इसे स्वयं इस्तेमाल किया है और इसके अच्छे परिणाम हुए हैं।

+1

+1। उस मणि के बारे में नहीं पता था। –

+1

यह सही नहीं है। urllib2 ** करता है ** समर्थन HTTP कनेक्ट (http://bugs.python.org/issue1424152), जबकि अनुरोध 2.0 जब तक यह पुष्टि नहीं करता है (https://github.com/kennethreitz/requests/pull/1515)। – schlamar

+0

+1 महान lib! मेरी समस्याओं को हल – c24b

1

जवाब ऊपर believeing ​​हम human_curl की कोशिश की

human_curl अज्ञात त्रुटियां तरह त्रुटियों दिया था, जबकि urllib3 त्रुटियों को सही समय समाप्त अनुरोध की तरह, मैक्स यूआरएल के साथ पार कर पुनः दे दी है।

तो, हम urllib3 पर वापस गए, urllib3 थ्रेड-सुरक्षित है। हम अब हम इसे "मैक्स को पार कर पुनः", हम नहीं कर सकते इसे हल, अनुमान यह सर्वर/प्रॉक्सी, लेकिन यकीन नहीं के साथ क्या करना हो सकता है urllib3

केवल समस्या से खुश हैं।

+1

मैं काम करते हैं और सब कुछ पर अनुरोध का उपयोग कर रहा ठीक काम करने के लिए, https कनेक्शन पर संचार सहित लगता है। इसके अलावा हम http अनुरोधों को डीबग करने के लिए प्रॉक्सी का उपयोग करते हैं। यदि आप अपनी समस्या पर कुछ प्रकाश डाल सकते हैं, तो मैं आपकी मदद कर सकता हूं। – Ifthikhan

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