2011-12-13 13 views
11

Utilizzando questo comando ricciolo sono in grado di ottenere la risposta che sto cercando da BashFare richieste HTTP tramite il modulo Python Requests non funziona tramite proxy dove arriccia? Perché?

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

e mi ha aiutato a formulare il mio codice in Python, ma ho bisogno di fare una richiesta tramite un proxy . Tuttavia, pur fornendo i proxy appropriati, non funziona. Forse non sto vedendo qualcosa?

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

Inoltre, nella stessa console python posso usare urllib per fare una richiesta se ha successo.

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

Persino le richieste di prova su un indirizzo non-https non funzionano.

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

Le richieste sono così eleganti e fantastiche ma come potrebbe non riuscire in questo caso?

+0

http://pycurl.sourceforge.net/ –

+1

So che probabilmente potrei installare e utilizzare pycurl sul mio Mac senza troppi problemi (o probabilmente nessuno). Stavo solo cercando la soluzione più elegante di usare Requests, che è davvero fantastica e pulita. Grazie per il suggerimento però. – dalanmiller

+0

Configurare un proxy per l'uso con le richieste funziona bene qui. Idealmente potremmo riprodurre ciò che vedete ... altrimenti dirci perché non funziona è l'unica altra opzione. Stai ottenendo una traccia dello stack dalle richieste? È anche possibile monitorare la rete e verificare le richieste effettive, dal momento che posso solo supporre che devono essere diverse per un effetto diverso da osservare tra arricciatura/richieste. –

risposta

8

Il problema si trova in realtà con le librerie di accesso url standard di python - urllib/urllib2/httplib. Non riesco a ricordare quale libreria sia il colpevole esatto, ma per semplicità, chiamiamola urllib. Sfortunatamente, urllib non implementa il metodo HTTP Connect che è necessario per accedere a un sito https tramite un proxy http (s). I miei sforzi per aggiungere la funzionalità usando urllib non hanno avuto successo (è passato un po 'di tempo da quando ho provato). Quindi, sfortunatamente, l'unica opzione che so funzionare è usare pycurl per questo caso.

Tuttavia, esiste una soluzione relativamente pulita che è quasi esattamente la stessa API delle richieste python, ma utilizza un backend pycurl invece delle librerie standard Python.

La libreria è denominata human_curl. L'ho usato io stesso e ho avuto ottimi risultati.

+1

+1 per human_curl. Non sapevo di quella gemma. –

+1

Questo non è corretto. urllib2 ** ** supporta la connessione HTTP (http://bugs.python.org/issue1424152) mentre la richiesta non la supporta fino alla versione 2.0 (https://github.com/kennethreitz/requests/pull/1515). – schlamar

+0

+1 grande lib! Risolto i miei problemi – c24b

1

believeing ​​sopra risposta che abbiamo provato human_curl

human_curl ha dato errori, come errori sconosciuto, mentre urllib3 dato correggere gli errori come Richiesta scaduta, Max tentativi superato con l'URL.

Quindi, siamo tornati a urllib3, urllib3 è thread-safe. Siamo felici con urllib3

unico problema ora abbiamo capito "Max tentativi superato", non possiamo risolverlo, indovinando potrebbe essere a che fare con il server/proxy, ma non è sicuro.

+1

Sto usando le richieste al lavoro e tutto sembra funzionare bene, comprese le comunicazioni via connessioni https. Inoltre utilizziamo i proxy per il debug delle richieste http. Se riesci a far luce sul tuo problema, potrei essere in grado di aiutarti. – Ifthikhan

Problemi correlati