Python: отключить http_proxy в urllib2 - PullRequest
10 голосов
/ 02 декабря 2011

Я использую прокси, установленный в качестве переменной среды (export http_proxy = example.com).Для одного вызова с использованием urllib2 мне нужно временно отключить это, т.е.сбросьте http_proxy.Я пробовал различные методы, предложенные в документации и веб-страницах, но до сих пор не смог отключить прокси.До сих пор я пробовал:

# doesn't work
req = urllib2.Request('http://www.google.com')
req.set_proxy(None,None)
urllib2.urlopen(req)

# also doesn't work
urllib.getproxies = lambda x = None: {}

Ответы [ 4 ]

9 голосов
/ 02 декабря 2011

Документация urllib2 предлагает следующее должно работать. Это один из подходов, которые вы пробовали?

import urllib2

proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
page = opener.open('http://www.google.com')
6 голосов
/ 15 июля 2014

Вы можете поместить это перед кодом, в котором вы хотите отключить системные прокси.

import urllib2
urllib2.getproxies = lambda: {}

Иногда это лучше, чем создавать пустые ProxyHandler, потому что это работает для внешних библиотек, даже если они создают их собственные urllib2 открыватели .

Также возможен способ временного отключения прокси с помощью contextmanager декоратора, но я не могу поспорить, что он будет работать с многопоточностью:

import selenium
import urllib2
from contextlib import contextmanager

@contextmanager
def no_proxies():
    orig_getproxies = urllib2.getproxies
    urllib2.getproxies = lambda: {}
    yield
    urllib2.getproxies = orig_getproxies

with no_proxies():
    driver = selenium.webdriver.Ie()
    driver.get("http://google.com")

В этом примере мы запрещаем python-selenium использовать настройку системного прокси, которая влечет за собой такие ошибки:

IE и Chrome не работают с Selenium2 Python

Невозможно запустить IEDriverServer.exe с прокси-сервером, настроенным в Internet Explorer

3 голосов
/ 28 июля 2015

Если вы хотите избежать использования прокси для известного набора сайтов, вы можете использовать переменную окружения no_proxy, например:

$ export no_proxy="google.com,stackoverflow.com,mysite.org:8080"

(список суффиксов имени хоста через запятую, также можно указать порт)

Это должно работать как с urllib, так и с urllib2.

0 голосов
/ 20 декабря 2015

Другим способом является создание обезьянки для библиотеки носков следующим образом:

import socks, socket, urllib2
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(None, None) # this does ["0.0.0.0"], [0]
socket.socket = socks.socksocket
socket.create_connection = create_connection
print urllib2.urlopen("http://httpbin.org/ip").read()

Итак, кажется, что если вы установите его как 0.0.0.0 для порта 0 по крайней мере, следует избегать его использования, поскольку библиотека inet_aton() не примет 0.0.0.0 в качестве действительного IP-адреса.

Очевидно, я на самом деле не проверял, почему что ... но, действительно, работает. Самый простой способ проверить это - сначала установить прокси-сервер, получить URL-адрес любой библиотеки и повторить попытку, не устанавливая прокси-сервер. Вы будете пойманы последним установленным прокси :), если вы не "сбросили" его для следующих соединений.

...