关于报urllib2.HTTPError: HTTP Error 401: Unauthorized错误问题

来源:互联网 发布:关于棉花糖网络语 编辑:程序博客网 时间:2024/06/10 19:28
报错信息:

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    callInfo = server.methods['getTemp']
  File "SOAPpy\Client.py", line 472, in __call__
    return self.__r_call(*args, **kw)
  File "SOAPpy\Client.py", line 494, in __r_call
    self.__hd, self.__ma)
  File "SOAPpy\Client.py", line 365, in __call
    config = self.config)
  File "SOAPpy\Client.py", line 265, in call
    raise HTTPError(code, msg)

HTTPError: <HTTPError 401 Unauthorized>


401意思就是未认证, 需要你登陆, 这个网站只是利用了401状态码, 并没有真的做Basic/Digest认证, 页面还是随之返回的, 不过文章内容被截断了, 页面里也有说明, 抓取法如下:


#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import urllib2
import zlib

headers = {
                        "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6",
          }
try:
        req = urllib2.Request("http://www.nature.com/onc/journal/v29/n35/full/onc2010241a.html", headers = headers)
        res = urllib2.urlopen(req)
except urllib2.HTTPError as http_error:
        print zlib.decompress(http_error.read(), 30)



先浏览器访问了一下这个网址, 发现401错误但页面正常显示, 看Response header发现没有401相关的tag, 但content里是有页面的.

所以, 就有了上面的代码, 也就是你可以看到你贴的错误是HttpError异常, 去Python manual里翻一翻urlib2的帮助, 就可以找到这个异常以及谁抛出此异常, 前提是你先要明白urllib2的handler回调机制, 每个注册的handler都继承base handler, 并且拥有所有回调接口(可能没有覆写, 也就是不作用), 你可以很快的阅读发现随着httperror异常抛出的对象拥有urlopen返回值一样的接口, 也就是read, 用它就可以读取content了.

至于zlib就是解压gzip格式数据, 你可以manual看zlib相关内容(我是做C的, zlib用的多), 之所以要解压是因为我注意到response header里说明了编码方式为gzip, 而更健壮的程序应该是捕获异常后判断http_error对象里的header字典内的content-encoding字段是什么格式.



0 0