公司代理在C#中工作,但在Python中不工作

公司代理在C#中工作,但在Python中不工作,c#,python,proxy,C#,Python,Proxy,我支持一个公司代理,我正在尝试使用Python下载页面源代码。一位同事尝试用C#编写一个类似的程序,结果成功了,但我的Python代码不起作用,尽管我们提供了相同的凭据。以下是C#代码: 错误输出为 Traceback (most recent call last): File ".\test.py", line 21, in <module> proxy_test() File ".\test.py", line 17, in proxy_test

我支持一个公司代理,我正在尝试使用Python下载页面源代码。一位同事尝试用C#编写一个类似的程序,结果成功了,但我的Python代码不起作用,尽管我们提供了相同的凭据。以下是C#代码:

错误输出为

    Traceback (most recent call last):
  File ".\test.py", line 21, in <module>
    proxy_test()
  File ".\test.py", line 17, in proxy_test
    x = urllib2.urlopen('http://www.google.com')
  File "C:\Python27\Lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\Lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "C:\Python27\Lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python27\Lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "C:\Python27\Lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\Lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 407: Proxy Authentication Required
回溯(最近一次呼叫最后一次):
文件“\test.py”,第21行,在
代理测试()
proxy\u test中第17行的文件“\test.py”
x=urllib2.urlopen('http://www.google.com')
文件“C:\Python27\Lib\urllib2.py”,第127行,在urlopen中
return\u opener.open(url、数据、超时)
文件“C:\Python27\Lib\urllib2.py”,第410行,打开
响应=方法(请求,响应)
文件“C:\Python27\Lib\urllib2.py”,第523行,在http\u响应中
“http”、请求、响应、代码、消息、hdrs)
文件“C:\Python27\Lib\urllib2.py”第448行出错
返回自我。调用链(*args)
文件“C:\Python27\Lib\urllib2.py”,第382行,在调用链中
结果=func(*args)
文件“C:\Python27\Lib\urllib2.py”,第531行,默认为http\u error\u
raise HTTPError(请求获取完整url(),代码,消息,hdrs,fp)
urllib2.HTTPError:HTTP错误407:需要代理身份验证
然后我尝试使用https,收到的错误是:

Traceback (most recent call last):
  File ".\test.py", line 21, in <module>
    proxy_test()
  File ".\test.py", line 17, in proxy_test
    x = urllib2.urlopen('http://www.google.com')
  File "C:\Python27\Lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\Lib\urllib2.py", line 404, in open
    response = self._open(req, data)
  File "C:\Python27\Lib\urllib2.py", line 422, in _open
    '_open', req)
  File "C:\Python27\Lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\Lib\urllib2.py", line 722, in <lambda>
    meth(r, proxy, type))
  File "C:\Python27\Lib\urllib2.py", line 751, in proxy_open
    return self.parent.open(req, timeout=req.timeout)
  File "C:\Python27\Lib\urllib2.py", line 404, in open
    response = self._open(req, data)
  File "C:\Python27\Lib\urllib2.py", line 422, in _open
    '_open', req)
  File "C:\Python27\Lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\Lib\urllib2.py", line 1222, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "C:\Python27\Lib\urllib2.py", line 1184, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 1] _ssl.c:510: error:140770FC:SSL routines:SSL23
_GET_SERVER_HELLO:unknown protocol>
回溯(最近一次呼叫最后一次):
文件“\test.py”,第21行,在
代理测试()
proxy\u test中第17行的文件“\test.py”
x=urllib2.urlopen('http://www.google.com')
文件“C:\Python27\Lib\urllib2.py”,第127行,在urlopen中
return\u opener.open(url、数据、超时)
文件“C:\Python27\Lib\urllib2.py”,第404行,打开
响应=自身打开(请求,数据)
文件“C:\Python27\Lib\urllib2.py”,第422行,处于打开状态
"开放",
文件“C:\Python27\Lib\urllib2.py”,第382行,在调用链中
结果=func(*args)
文件“C:\Python27\Lib\urllib2.py”,第722行,在
方法(r、代理、类型))
文件“C:\Python27\Lib\urllib2.py”,第751行,在proxy\u open中
返回self.parent.open(请求,超时=请求超时)
文件“C:\Python27\Lib\urllib2.py”,第404行,打开
响应=自身打开(请求,数据)
文件“C:\Python27\Lib\urllib2.py”,第422行,处于打开状态
"开放",
文件“C:\Python27\Lib\urllib2.py”,第382行,在调用链中
结果=func(*args)
文件“C:\Python27\Lib\urllib2.py”,第1222行,https\u open
返回self.do_open(httplib.HTTPSConnection,req)
文件“C:\Python27\Lib\urllib2.py”,第1184行,在do\u open中
引发URL错误(err)
urllib2.URLError:

Python代码中有什么错误?

如果您不一定需要使用urllib2,请求可能会使其更容易

import requests

proxy_user = "Africa\\asdf"
proxy_password = "pass"
proxy_url = "http://corp_proxy:8080"

def proxy_test():
    proxy = {'http': proxy_url}
    auth = HTTPProxyAuth(proxy_user, proxy_password)
    r = requests.get('http://www.google.com/', proxies=proxy, auth=auth)
    print r.text

if __name__ == "__main__":
    proxy_test()

这篇文章将介绍这一点,以及对象的使用,是关于带有请求库的代理的更多信息。希望这对您来说容易一点。

如果您不一定需要使用urllib2,请求可能会使它更容易

import requests

proxy_user = "Africa\\asdf"
proxy_password = "pass"
proxy_url = "http://corp_proxy:8080"

def proxy_test():
    proxy = {'http': proxy_url}
    auth = HTTPProxyAuth(proxy_user, proxy_password)
    r = requests.get('http://www.google.com/', proxies=proxy, auth=auth)
    print r.text

if __name__ == "__main__":
    proxy_test()

这篇文章将介绍这一点,以及对象的使用,是关于带有请求库的代理的更多信息。希望这对您来说容易一点。

看起来您有一个HTTP(而不是HTTPS)代理

代理的回答表明无法验证您的身份验证:
HTTP错误407:需要代理身份验证

您可以尝试以下代码。您可以在代理服务器返回的代理身份验证标头上检查代理领域

proxy_handler = urllib2.ProxyHandler({'http': 'http://proxy.company.local:3128/'})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('Company Proxy Realm', 'proxy.company.local', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
opener.open('http://www.google.com')
opener.open('https://www.google.com')

看起来您有一个HTTP(非HTTPS)代理

代理的回答表明无法验证您的身份验证:
HTTP错误407:需要代理身份验证

您可以尝试以下代码。您可以在代理服务器返回的代理身份验证标头上检查代理领域

proxy_handler = urllib2.ProxyHandler({'http': 'http://proxy.company.local:3128/'})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('Company Proxy Realm', 'proxy.company.local', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
opener.open('http://www.google.com')
opener.open('https://www.google.com')


由于您的代理使用NTLM身份验证,您必须使用兼容的
AuthHandler
,例如。

由于您的代理使用NTLM身份验证,您必须使用兼容的
AuthHandler
,例如。

代理是https而不是http吗?你能提供错误输出吗?看看我在网站上使用的代码,它仍然不起作用…@dev247还有其他想法吗?你确定代理使用的是基本身份验证,而不是摘要或NTLM吗?我认为愤世嫉俗是正确的。我打赌代理服务器使用NTLM。来自:“NetworkCredential类是在基于密码的身份验证方案(如basic、digest、NTLM和Kerberos)中提供凭据的基类。”代理是https而不是http吗?你能提供错误输出吗?看看我在网站上使用的代码,它仍然不起作用…@dev247还有其他想法吗?你确定代理使用的是基本身份验证,而不是摘要或NTLM吗?我认为愤世嫉俗是正确的。我打赌代理服务器使用NTLM。来自:“NetworkCredential类是在基于密码的身份验证方案(如basic、digest、NTLM和Kerberos)中提供凭据的基类。”您所说的“代理服务器返回的代理身份验证头”是什么意思?
Proxy\u auth\u handler.add\u password()
中设置的域在此头中通知。您可以使用命令
curl-D--o/dev/null-x检查它http://proxy.company.local:8000 http://www.google.com
该标头将在代理返回的HTTP响应中设置。我得到的“urllib2.URLError:”似乎与代理地址或URL中设置的主机名有任何问题。将代理更改为IP地址并重试。您所说的“代理服务器返回的代理身份验证标头”是什么意思?
proxy\u auth\u handler.add\u password()
中设置的域在此标头中被通知。您可以使用命令
curl-D--o/dev/null-x检查它http://proxy.company.local:8000 http://www.google.com
该标头将在代理返回的HTTP响应中设置。我得到的“urllib2.URLError:”似乎与代理地址或URL中设置的主机名有任何问题。将代理更改为IP地址并重试。最后我得到了一个无错误的输出。我得到的是我公司的HTML源代码,上面写着“您的凭证无法通过身份验证”。我尝试不输入用户名和密码,然后