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字段是什么格式.