Выполнение HTTP-запросов через Python Requests модуль не работает через прокси, где curl работает? Зачем? - PullRequest
11 голосов
/ 13 декабря 2011

Используя эту команду curl, я могу получить требуемый ответ от Bash

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

Я уже видел этот другой пост о прокси с модулем запросов

И это помогло мне сформулировать мой код на Python, но мне нужно сделать запрос через прокси.Тем не менее, даже при предоставлении соответствующих прокси-серверов это не работает.Возможно, я просто чего-то не вижу?

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

Запросы настолько элегантны и удивительны, но как они могут не работать в этом случае?

Ответы [ 2 ]

9 голосов
/ 11 января 2012

Проблема на самом деле заключается в стандартных библиотеках доступа к URL в python - urllib / urllib2 / httplib. Я не могу вспомнить, какая библиотека является точным виновником, но для простоты, давайте просто назовем это urllib. К сожалению, в urllib не реализован метод HTTP Connect, который необходим для доступа к сайту https через прокси-сервер http (s). Мои попытки добавить функциональность с помощью urllib не увенчались успехом (прошло много времени с тех пор, как я пытался). Так что, к сожалению, единственный вариант, который я знаю, - это использовать pycurl для этого случая.

Тем не менее, есть решение, которое является относительно чистым и представляет собой почти тот же API, что и запросы Python, но вместо стандартных библиотек Python используется бэкэнд Pycurl.

Библиотека называется human_curl . Я использовал его сам и добился отличных результатов.

1 голос
/ 03 августа 2012

Считая приведенный выше ответ, мы попробовали human_curl

human_curl выдал ошибки, такие как неизвестные ошибки, в то время как urllib3 выдал правильные ошибки, такие как истекло время ожидания запроса, максимальное количество попыток превышено с помощью URL.

Итак, мы вернулись к urllib3, urllib3 является потокобезопасным. Мы счастливы с urllib3

Единственная проблема, теперь мы получаем это "Превышено максимальное количество попыток", Мы не можем решить это, Предположение, что это может быть связано с сервером / прокси, Но не уверен.

...