【问题标题】:Python: Disable http_proxy in urllib2Python:在 urllib2 中禁用 http_proxy
【发布时间】:2012-01-11 15:03:11
【问题描述】:

我正在使用代理集作为环境变量(导出 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: {}

【问题讨论】:

    标签: python proxy environment-variables urllib2


    【解决方案1】:

    urllib2 文档suggests 以下应该可以工作。这是您尝试过的方法之一吗?

    import urllib2
    
    proxy_handler = urllib2.ProxyHandler({})
    opener = urllib2.build_opener(proxy_handler)
    page = opener.open('http://www.google.com')
    

    【讨论】:

      【解决方案2】:

      您可以将它放在要禁用系统代理的代码之前。

      import urllib2
      urllib2.getproxies = lambda: {}
      

      有时它比创建空的ProxyHandler 更好,因为它适用于外部库,即使它们创建了their own urllib2 openers。

      还有一种可能的方法是使用 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 and Chrome not working with Selenium2 Python

      Unable to run IEDriverServer.exe with proxy set up in IE internet option

      【讨论】:

      • urllib2.getproxies = lambda: {} 这很奏效。谢谢!
      • 在我的情况下不起作用,也没有深入研究,只是猴子修补了 socks 模块。
      • 投反对票声明猴子补丁(全局状态(原文如此!))比指定的 API 更好。
      • Piotr,不幸的是,如果您指的是 ProxyHandler 解决方案,设计的 API 在某些情况下不起作用
      • 维亚切斯拉夫,我想知道在什么情况下它不起作用?
      【解决方案3】:

      如果您想避免为一组已知站点使用代理,您可以像这样使用no_proxy 环境变量:

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

      (以逗号分隔的主机名后缀列表,也可以指定端口)

      这应该适用于urllib 和urllib2。

      【讨论】:

        【解决方案4】:

        另一种方法是像这样对 socks 库进行猴子修补:

        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,然后在不设置代理的情况下重试。除非您为以下连接“取消设置”它,否则您将被上次设置的代理捕获:)。

        【讨论】:

          【解决方案5】:

          您可以通过安装一个 emtpy ProxyHandler 来取消设置代理:

          #!/usr/bin/python3
          from urllib.request import urlopen, Request, ProxyHandler, build_opener, install_opener, urlretrieve
          
          def unset_http_https_proxy():
              proxy_support = ProxyHandler()
              opener = build_opener(proxy_support)
              install_opener(opener)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-20
            • 1970-01-01
            • 2018-04-16
            • 2015-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-19
            相关资源
            最近更新 更多