繁体   English   中英

urllib2.HTTPError:HTTP 错误 401:未经授权

[英]urllib2.HTTPError: HTTP Error 401: Unauthorized

我的要求是从某个网站http://clientdownload.xyz.com/Documents/abc.zip下载 abc.zip 文件

对于这个活动,我编写了一个 python 脚本,如下所示:

    url_to_check = 'http://clientdownload.xyz.com/Documents/abc.zip'
    username = "user"
    password = "pwd"
    p = urllib2.HTTPPasswordMgrWithDefaultRealm()
    p.add_password(None, url_to_check, username, password)
    handler = urllib2.HTTPBasicAuthHandler(p)
    opener = urllib2.build_opener(handler)
    urllib2.install_opener(opener)
    zip_file = urllib2.urlopen(url_to_check).read()       
    file_name = 'somefile.zip'
    meta = zip_file.info()
    file_size = int(meta.getheaders("Content-Length")[0])
    print "Downloading: %s Bytes: %s" % (file_name, file_size)

    with open(file_name, 'wb') as dwn_file:
        dwn_file.write(zip_file.read())

而我在运行脚本时收到以下错误:

文件“updateCheck.py”,第 68 行,在 check_update zip_file = urllib2.urlopen(url_to_check).read() 文件“/usr/lib/python2.7/urllib2.py”,第 126 行,在 urlopen 中 return _opener.open( url、数据、超时)文件“/usr/lib/python2.7/urllib2.py”,第 406 行,打开响应 = meth(req, response) 文件“/usr/lib/python2.7/urllib2.py” , line 519, in http_response 'http', request, response, code, msg, hdrs) File "/usr/lib/python2.7/urllib2.py", line 444, in error return self._call_chain(*args) File “/usr/lib/python2.7/urllib2.py”,第 378 行,在 _call_chain result = func(*args) 文件“/usr/lib/python2.7/urllib2.py”,第 527 行,在 http_error_default 中引发 HTTPError (req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 401: Unauthorized

我已经正确地提供了用户名和密码,但它引发了未经授权的错误。

当我尝试使用带有-http-user and --ask-password选项的 wget 链接下载它时,我能够下载该文件。

同样使用相同的脚本,我可以正确地从其他服务器下载文件。

我运行此脚本以获取更多信息:

import urllib2, re, time, sys

theurl='http://clientdownload.xxx.com/Documents/Forms/AllItems.aspx'

req = urllib2.Request(theurl)

try:
    handle = urllib2.urlopen(req)

except IOError, e:

    if hasattr(e, 'code'):

        if e.code != 401:
            print 'We got another error'
            print e.code
        else:
            print e.headers
            print e.headers['www-authenticate']

我得到以下信息:

Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
SPRequestGuid: 939bad00-40b7-49b9-bbbc-99d0267a1004
X-SharePointHealthScore: 0
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 14.0.0.6029
Date: Wed, 12 Feb 2014 13:14:19 GMT
Connection: close
Content-Length: 16

NTLM

您可以考虑使用requests来更轻松地通过 HTTP 进行交互。 在您的情况下,通过安装requests-ntlmrequests插件),您将以更透明的方式获得NTLM 身份验证

import requests
from requests_ntlm import HttpNtlmAuth

r = requests.get("http://ntlm_protected_site.com",auth=HttpNtlmAuth('domain\\username','password'))

r保存响应,包括错误代码标题(特别是对于您的情况r.headers.get('Content-Length')[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM