2011-12-13 23 views
11

Użycie tego polecenia curl jestem w stanie uzyskać odpowiedź szukam od BashWykonywanie żądań HTTP za pośrednictwem modułu zapytań Pythona nie działa za pośrednictwem serwera proxy w miejscu, w którym działa curl? Czemu?

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

I pomógł mi sformułować mojego kodu w Pythonie, ale muszę złożyć wniosek za pośrednictwem pełnomocnika . Jednak nawet podczas dostarczania odpowiednich serwerów proxy nie działa. Może po prostu nie widzę czegoś?

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

Co więcej, w tej samej konsoli pythona mogę użyć adresu urllib, aby żądanie zakończyło się pomyślnie.

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

Nawet próba wysłania żądania na adres inny niż https nie działa.

>>> 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: 

Żądania są tak eleganckie i niesamowite, ale jak może się w tym przypadku nie udać?

+0

http://pycurl.sourceforge.net/ –

+1

Wiem, że prawdopodobnie mógłbym zainstalować i używać pycurl na moim Macu bez większych problemów (lub prawdopodobnie w ogóle). Próbowałem po prostu wybrać bardziej eleganckie rozwiązanie używania Żądań, które jest całkiem niesamowite i czyste. Dziękuję za sugestię. – dalanmiller

+0

Konfigurowanie proxy do użytku z żądaniami działa dobrze tutaj. Idealnie moglibyśmy odtworzyć to, co widzenie ... inaczej mówiąc nam, dlaczego to nie działa, jest jedyną inną opcją. Czy otrzymujesz ślad stosu z żądań? Możesz również monitorować swoją sieć i sprawdzać rzeczywiste żądania, ponieważ mogę tylko zgadywać, że muszą być różne, aby zaobserwować inny efekt, który można zaobserwować między zawijaniem/żądaniami. –

Odpowiedz

8

Problem w rzeczywistości leży w standardowych bibliotekach dostępu do url Pythona - urllib/urllib2/httplib. Nie pamiętam, która biblioteka jest dokładnym winowajcą, ale dla uproszczenia, nazwijmy to po prostu urllib. Niestety, urllib nie implementuje metody HTTP Connect, która jest wymagana do uzyskania dostępu do strony https za pośrednictwem serwera proxy http (s). Moje wysiłki w celu dodania funkcji za pomocą urllib nie powiodły się (minęło trochę czasu odkąd próbowałem). Więc niestety jedyną dostępną opcją jest użycie pycurl w tym przypadku.

Istnieje jednak rozwiązanie, które jest względnie czyste, że jest prawie dokładnie tym samym interfejsem API co żądania Pythona, ale wykorzystuje backend Pycurl zamiast standardowych bibliotek Pythona. Ta biblioteka nazywa się human_curl. Użyłem go sam i miałem świetne wyniki.

+1

+1 dla human_curl. Nie wiedziałem o tym klejnocie. –

+1

To nie jest poprawne. urllib2 ** does ** obsługuje HTTP connect (http://bugs.python.org/issue1424152), podczas gdy żądanie nie obsługuje go do wersji 2.0 (https://github.com/kennethreitz/requests/pull/1515). – schlamar

+0

+1 świetna lib! Rozwiązałem moje problemy – c24b

1

Believeing ​​powyżej odpowiedzi staraliśmy human_curl

human_curl dał błędy jak nieznanych błędów, natomiast urllib3 dał poprawianie błędów jak Upłynął limit czasu żądania, Max prób przekroczenia z url.

Tak, wróciliśmy do urllib3, urllib3 jest wątkowo bezpieczne. Jesteśmy zadowoleni z urllib3

Jedyny problem teraz mamy to „Max prób przekroczenia”, my cant go rozwiązać, odgadywanie może mieć do czynienia z serwera proxy, /ale nie jestem pewien.

+1

Używam zgłoszeń w pracy i wszystko wydaje się działać dobrze, łącznie z połączeniami za pośrednictwem https. Ponadto używamy serwerów proxy do debugowania żądań HTTP. Jeśli możesz rzucić trochę światła na swój problem, być może będę w stanie Ci pomóc. – Ifthikhan