您的位置:首页 > 理论基础 > 计算机网络

python 爬虫(2)异常的处理和HTTP状态码的分类

2015-04-16 09:11 417 查看
http://blog.csdn.net/pleasecallmewhy/article/details/8923725

HTTP异常处理:

当urlopen不能够处理一个response时,产生urlError

通常的Python SPIs异常如ValueError,TypeError等也会同时产生。

HTTPError是urlError的子类,通常在特定的HTTP URLs中产生。

1.URLError

通常,URLError在没有网络连接或者服务器不存在的情况下产生。

这种情况下,异常同样会带有“reason”属性,它是一个tuple(不可变的数组),

包含一个错误号和一个错误信息。

import urllib2

req=urllib2.Request('http://www.baibai.com')

try:urllib2.urlopen(req)

except urllib2.URLError,e:

print e.reason

按下F5,可以看到打印出来的内容是:

[Errno 11001] getaddrinfo failed

也就是说,错误号是11001,内容是getaddrinfo failed

2.HTTPError
404:页面无法找到

403:请求禁止

401:带验证请求

HTTP状态码表示HTTP协议所返回的响应的状态

客户端向服务器发送请求,如果成功获得请求的资源,则返回状态码为200,表示响应成功。

如果请求的资源不存在,则通常返回404错误。

HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成:

200:请求成功 处理方式:获得响应的内容,进行处理

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到

202:请求被接受,但处理尚未完成 处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃

301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL

304 请求的资源未更新 处理方式:丢弃

400 非法请求 处理方式:丢弃

401 未授权 处理方式:丢弃

403 禁止 处理方式:丢弃

404 没有找到 处理方式:丢弃

5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求 处理方式:丢弃

------------------------------------------------------------------------------------------------

HTTPError实力产生后会有一个整型‘code'属性,是服务器发送的相关错误号。
Error codes错误码

因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了HTTP协议使用的所有的应答号。

当一个错误号产生后,服务器返回一个HTTP错误号和一个错误页面。

你可以使用HTTPError实例作为页面返回的应答对象response

这表示和错误属性一样,它同样包含了read,geturl和info方法。

# -*- coding:utf-8 -*-
from urllib2 import Request,urlopen,URLError,HTTPError
req=Request('http://bbs.csdn.net/callmuwhy')
try:
response = urlopen(req)
except HTTPError,e:
print 'The server couldn\'t fulfill the request.'
print 'Error code:',e.code
except URLError,e:
print 'We failed to reach a server.'
print 'Reason:',e.reason
else:
print 'No exception was raised.'

第二种异常解决方案:

# -*- coding:utf-8 -*-
from urllib2 import Request,urlopen,URLError,HTTPError
req=Request('http://bbs.csdn.net/callmewhy')
try:
response=urlopen(req)
except URLError,e:
if hasattr(e,'code'):
print 'The server couldn\'t fulfill the request.'
elif hasattr(e,'reason'):
print 'We failed to reach a server.'
print 'Reason:',e.reason
else:
print 'No exception was raised.'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: