2011-12-13 3 views
11

내가 배쉬Python을 통한 HTTP 요청 요청 curl이 수행하는 요청 모듈이 프록시를 통해 작동하지 않습니까? 왜?

에서
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

을 찾고 응답을 얻을 수 있어요이 curl 명령을 사용하여 그리고 그것은 나 파이썬으로 내 코드를 공식화 도움하지만 난 프록시를 통해 요청을해야 . 그러나 적절한 프록시를 제공하는 동안에도 작동하지 않습니다. 아마도 나는 무언가를 보지 않고있는 것일까 요?

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

또한 동일한 python 콘솔에서 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

필자는 Mac에서 pycurl을 너무 많이 사용하지 않고 설치하거나 사용할 수 있음을 알고 있습니다. 난 그냥 꽤 굉장하고 깨끗한 요청을 사용하여보다 우아한 솔루션에 대한 노력했다. 생각해 줘서 고마워. – dalanmiller

+0

요청에 사용할 프록시 설정은 여기에서 잘 작동합니다. 이상적으로 우리는 당신의 시선을 재현 할 수 있습니다 ... 그렇지 않으면 우리에게 왜 그것이 작동하지 않는지를 말하면 유일한 다른 옵션입니다. 요청에서 스택 추적을 얻고 있습니까? 컬 (curl)/요청 (requests) 사이에서 관찰되는 다른 효과에 대해서만 달라야한다는 것을 추측 할 수 있기 때문에 네트워크를 모니터하고 실제 요청을 확인할 수도 있습니다. –

답변

8

문제는 실제로 파이썬의 표준 URL 액세스 라이브러리 - urllib/urllib2/httplib에 있습니다. 나는 정확한 라이브러리를 기억할 수는 없지만 간단하게하기 위해 urllib이라고 부르 자. 불행히도 urllib은 http 프록시를 통해 https 사이트에 액세스하는 데 필요한 HTTP 연결 메소드를 구현하지 않습니다. urllib를 사용하여 기능을 추가하려는 나의 노력은 성공적이지 못했습니다 (시도한 이후로 오랜 시간이 걸렸습니다). 불행히도 내가 아는 유일한 옵션은이 경우 pycurl을 사용하는 것입니다.

그러나 실제로는 Python 요청과 거의 동일한 API 인 비교적 깨끗한 솔루션이 있지만 파이썬 표준 라이브러리 대신 pycurl 백엔드를 사용합니다.

라이브러리는 human_curl입니다. 나는 그것을 직접 사용했고 큰 결과를 얻었습니다.

+1

+1 for human_curl. 그 보석에 대해 몰랐어. –

+1

올바르지 않습니다. urllib2 **는 HTTP 연결 (http://bugs.python.org/issue1424152)을 지원하지만 요청은 2.0까지 지원하지 않습니다 (https://github.com/kennethreitz/requests/pull/1515). – schlamar

+0

+1 멋진 lib! 내 문제 해결 – c24b

1

는 대답보다 Believeing ​​우리는 urllib3 시간이 초과 요청처럼, 맥스는 URL과 초과 재시도 오류를 수정 준 반면

human_curl이 , 알 수없는 오류와 같은 오류를 준 human_curl했습니다.

그래서 우리는 urllib3으로 돌아갔습니다. urllib3은 thread로부터 안전합니다. 우리는 지금 우리가 그것이 서버/프록시, 그러나 확실하지와 함께 할 수 있습니다 추측 , 우리는 그것을 해결하지 못할, "최대 초과 재시도"얻을 urllib3

문제 만 만족.

+1

직장에서 요청을 사용하고 있으며 https 연결을 통한 통신을 포함하여 모든 것이 잘 작동하는 것 같습니다. 또한 우리는 http 요청을 디버깅하기 위해 프록시를 사용합니다. 문제에 관해 밝히면 도움이 될 것입니다. – Ifthikhan