Подтвердить что ты не робот

Использование 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>      

Любые идеи?

4b9b3361

Ответ 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, все стало работать.