Выполнение HTTP-запросов через модуль запросов Python не работает через прокси-сервер, где работает curl? Зачем?
Используя эту команду 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:
Запросы настолько элегантны и удивительны, но как это может быть неудачно в этом случае?
Ответы
Ответ 1
Проблема на самом деле заключается в стандартных библиотеках доступа url для python - urllib/urllib2/httplib. Я не помню, какая библиотека является точным виновником, но для простоты позвольте просто называть ее urllib. К сожалению, urllib не реализует метод HTTP Connect, который необходим для доступа к сайту https через прокси-сервер http (s). Мои усилия по добавлению функций с использованием urllib не были успешными (прошло какое-то время с тех пор, как я пытался). К сожалению, единственный вариант, который я знаю для работы, - использовать pycurl для этого случая.
Однако есть решение, которое является относительно чистым, это почти тот же API, что и запросы python, но он использует бэкэнд pycurl вместо стандартных библиотек python.
Библиотека называется human_curl. Я использовал его сам и получил отличные результаты.
Ответ 2
Повернув выше ответ, мы попробовали man_curl
human_curl дал ошибки, такие как Неизвестные ошибки,
в то время как
urllib3 дал правильные ошибки, такие как Request Timed out, Max retries превышен с url.
Итак, мы вернулись к urllib3, urllib3 является потокобезопасным. Мы довольны urllib3
Только проблема теперь мы получаем, что "Макс. попытки превышены",
Мы не можем решить эту проблему,
Угадав, что это может быть связано с сервером/прокси,
Но не уверен.