urllib2.HTTPError: HTTP Error 403: Forbidden 请高手指点,python菜鸟一枚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了urllib2.HTTPError: HTTP Error 403: Forbidden 请高手指点,python菜鸟一枚相关的知识,希望对你有一定的参考价值。

源代码如下:
import urllib2
url = ‘xxx’

req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
链接指向某网站的ASPX,没有提供给他参数。难道是被当成机器人给屏蔽了?

import urllib2,cookielib

site= "http://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=JPASSOCIAT&fromDate=1-JAN-2012&toDate=1-AUG-2012&datePeriod=unselected&hiddDwnld=true"
hdr = \'User-Agent\': \'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (Khtml, like Gecko) Chrome/23.0.1271.64 Safari/537.11\',
       \'Accept\': \'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\',
       \'Accept-Charset\': \'ISO-8859-1,utf-8;q=0.7,*;q=0.3\',
       \'Accept-Encoding\': \'none\',
       \'Accept-Language\': \'en-US,en;q=0.8\',
       \'Connection\': \'keep-alive\'

req = urllib2.Request(site, headers=hdr)

try:
    page = urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.fp.read()

content = page.read()
print content
参考技术A 给你的url给我看一下,是不是\弄反了,是不是没加https://

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

【中文标题】urllib2.HTTPError:HTTP 错误 401:未经授权【英文标题】:urllib2.HTTPError: HTTP Error 401: Unauthorized 【发布时间】:2014-03-10 20:33:28 【问题描述】:

我的要求是从某个网站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, data, timeout) 文件“/usr/lib/python2.7/urllib2.py”,第 406 行,打开 response = meth(req, response) 文件“/usr/lib/python2.7/urllib2.py”,第 519 行,在 http_response 'http'、请求、响应、代码、msg、hdrs)文件“/usr/lib/python2.7/urllib2.py”,第 444 行,错误 返回 self._call_chain(*args) 文件“/usr/lib/python2.7/urllib2.py”,第 378 行,在 _call_chain 结果 = func(*args) 文件“/usr/lib/python2.7/urllib2.py”,第 527 行,在 http_error_default raise 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

【问题讨论】:

如果我理解正确,您使用的是带有 NTLM 身份验证的基本身份验证处理程序。试试like this。 是的,已经尝试使用 Ntlm Auth Handler,而我的 python 安装没有 NTLM 包,所以我收到以下错误。 ImportError: 无法导入名称 HTTPNtlmAuthHandler 好吧,您可以安装该软件包或使用virtual environment。 virtualenv 是 python 最佳实践 (afaik) 的一部分,它允许您安装自定义的东西而不会弄乱您原来的 python 安装。 你有解决这个问题的办法吗?我也看到了类似的导入错误。找不到满足 HTTPNtlmAuthHandler 要求的版本(来自版本:)没有为 HTTPNtlmAuthHandler Python 2.7.11 :: Anaconda 4.0.0(64 位)找到匹配的发行版 【参考方案1】:

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

import requests
from requests_ntlm import HttpNtlmAuth

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

r 保存响应,包括error codes 和headers(专门针对您的情况r.headers.get('Content-Length')[0]

【讨论】:

以上是关于urllib2.HTTPError: HTTP Error 403: Forbidden 请高手指点,python菜鸟一枚的主要内容,如果未能解决你的问题,请参考以下文章

python: urllib2.HTTPError: HTTP 错误 405: 方法不允许

urllib2.HTTPError: HTTP Error 403: Forbidden 解决方法

urllib2.HTTPError: HTTP Error 400: Bad Request

urllib2.HTTPError: HTTP Error 403: Forbidden 请高手指点,python菜鸟一枚

python urllib2导出elasticsearch数据时 返回 "urllib2.HTTPError: HTTP Error 500: Internal Server Error&q

urllib2 HTTP 错误 429