Использование HTTP PROXY - Python
Я знаком с тем, что я должен установить переменную среды HTTP_RPOXY на адрес прокси.
Как правило, urllib отлично работает, проблема связана с urllib2.
>>> urllib2.urlopen("http://www.google.com").read()
возвращает
urllib2.URLError: <urlopen error [Errno 10061] No connection could be made because the target machine actively refused it>
или
urllib2.URLError: <urlopen error [Errno 11004] getaddrinfo failed>
Дополнительная информация:
urllib.urlopen(....) работает отлично! Это просто urllib2, который играет в трюки...
Я попробовал ответить @Fenikso, но теперь получаю эту ошибку:
URLError: <urlopen error [Errno 10060] A connection attempt failed because the
connected party did not properly respond after a period of time, or established
connection failed because connected host has failed to respond>
Любые идеи?
Ответы
Ответ 1
Вы можете сделать это даже без переменной среды HTTP_PROXY. Попробуйте этот образец:
import urllib2
proxy_support = urllib2.ProxyHandler({"http":"http://61.233.25.166:80"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
html = urllib2.urlopen("http://www.google.com").read()
print html
В вашем случае действительно кажется, что прокси-сервер отказывается от соединения.
Что-то еще, чтобы попробовать:
import urllib2
#proxy = "61.233.25.166:80"
proxy = "YOUR_PROXY_GOES_HERE"
proxies = {"http":"http://%s" % proxy}
url = "http://www.google.com/search?q=test"
headers={'User-agent' : 'Mozilla/5.0'}
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)
req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
print html
Изменить 2014:
Это, кажется, популярный вопрос/ответ. Однако сегодня я бы использовал сторонний requests
модуль.
Для одного запроса просто выполните:
import requests
r = requests.get("http://www.google.com",
proxies={"http": "http://61.233.25.166:80"})
print(r.text)
Для нескольких запросов используйте объект Session
, поэтому вам не нужно добавлять параметр proxies
во все ваши запросы:
import requests
s = requests.Session()
s.proxies = {"http": "http://61.233.25.166:80"}
r = s.get("http://www.google.com")
print(r.text)
Ответ 2
Я рекомендую вам просто использовать модуль запросов.
Это намного проще, чем встроенные клиенты http:
http://docs.python-requests.org/en/latest/index.html
Использование образца:
r = requests.get('http://www.thepage.com', proxies={"http":"http://myproxy:3129"})
thedata = r.content
Ответ 3
Просто хотелось бы упомянуть, что вам также может потребоваться установить переменную окружения OS https_proxy
, если нужно получить доступ к URL-адресам https.
В моем случае это было не очевидно для меня, и я много часов пытался узнать об этом.
Мой вариант использования: Win 7, jython-standalone-2.5.3.jar, установка setuptools через ez_setup.py
Ответ 4
Python 3:
import urllib.request
htmlsource = urllib.request.FancyURLopener({"http":"http://127.0.0.1:8080"}).open(url).read().decode("utf-8")
Ответ 5
Я столкнулся с этим на клиенте jython.
Сервер говорил только TLS, а клиент использовал ssl-контекст javax.net.ssl.SSLContext.getInstance( "SSL" )
Как только клиент был в TLS, все стало работать.