详解HTTPError
我们在写爬虫去请求服务器的时候可能会遇到各种各样的错误,在HTTP协议中常用的客户端错误码如下
- 400 坏请求(Bad Request)
- 401未授权(Unauthorized)
- 402必须的支付(Payment Required)
- 403禁用(Forbidden)
- 404没有找到(Not Found)
- 406 不可接受的 (Not Acceptable)
- 407 需要代理验证(Proxy Authentication Required)
- 408 请求超时(Request Timeout)
- 409 冲突 (Confilict)
- 410 不存在(gone)
- 411 长度必需 (Length Required)
- 412 先决条件失败 (Precondition Failed)
- 413 请求实体太大
- 414 请求 URI 太长(Request-URI Too Long
- 415 不被支持的媒体类型(Unsupported Media Type)
- 416 请求范围不满足 (Requested Range Not Satisfiable)
- 417 期望失败(Expectation Failed)
-
上面就是一些HTTP客户端的错误码,那么如何知道是发生了那个错误呢用python的try..except..就可以代码如下
import urllib2
req = urllib2.Request('http://cs.scu.edu.cn/~duanlei')
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
print e.code
print e.reason
运行后结果是 404 Not Found 。 e还有一个read()方法即可以打印错误页面,如下所示
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 - Not Found</title>
</head>
<body>
<h1>404 - Not Found</h1>
</body>
</html>
HTTPError在urllib2中是这么定义的class HTTPError(URLError, addinfourl):因此我们可以看出HTTPError是继承自URLError的。
详解URLError
URLError是一种IOError
通常引起URLError的原因是:无网络连接(没有到目标服务器的路由)、访问的目标服务器不存在。在这种情况下,异常对象会有reason属性(是一个(错误码、错误原因)的元组)
可以通过下面代码来打印URLError异常
import urllib2
url="http://www.baidu.com/"
try:
response=urllib2.urlopen(url)
except urllib2.URLError,e:
print e.reason
就是把上面的HTTPError改成了URLError
处理URLError的方式就是在代码中捕捉它们然后做响应的处理