python爬虫-异常处理
URLerror产生原因:
- 网络未连接(即不能上网)
- 服务器不存在
1 #-*-coding:utf-8-*- 2 import urllib2 3 request=urllib2.Request('http://www.wujiadong.com')
#这是一个不能打开的网址 4 response=urllib2.urlopen(request) 5 html=response.read() 6 print(html)
报错情况:
下面我们对可能出现异常进行处理,一般通过try-except语句来包围并捕获相应的异常。我们先尝试一下:
1 #-*-coding:utf-8-*- 2 import urllib2 3 try: 4 request=urllib2.Request('http://www.wujiadong.com') 5 response=urllib2.urlopen(request) 6 html=response.read() 7 except: 8 print('something wrong') 9 else: 10 print(html)
常用另一种:
1 import urllib2 2 request=urllib2.Request('http://www.wujiadong.com') 3 try:
urllib2.urlopen(request) 4 except:
urllib2.URLError,e: 5 print(e.reason)
异常处理的终极完整形态
1 try:
# 框住了你感觉会抛出异常的代码 2 print(a[6]) 3 except:
#try代码块里的代码如果抛出异常了,该执行什么内容 4 print('haha') 5 else:
#try代码块里的代码如果没有跑出异常,就执行这里 6 print('hehe') 7 finally:
#不管如何,finally里的代码,是总会执行的 8 print('xixi')
HTTPError
在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含
一个数字”状态码。例如:假如response是一个"重定向",需要客户端从别的地址获取文档,
urllib2将为你处理。其他不能处理的,urlopen会产生一个HTTPError。
典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。
HTTP状态码表示HTTP协议所返回的响应的状态。
比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。
如果请求的资源不存在, 则通常返回404错误。
HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成:
1 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。 2 3 101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。 4 5 102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 6 7 200:请求成功 处理方式:获得响应的内容,进行处理 8 9 201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到 10 11 202:请求被接受,但处理尚未完成 处理方式:阻塞等待 12 13 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃 14 15 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 16 301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL 17 18 302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL 19 20 304:请求的资源未更新 处理方式:丢弃 21 22 400:非法请求 处理方式:丢弃 23 24 401:未授权 处理方式:丢弃 25 26 403:禁止 处理方式:丢弃 27 28 404:没有找到 处理方式:丢弃 29 30 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。 31 32 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 33 34 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 35 36 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
HTTPError实例产生后会有一个整型'code'属性,是服务器发送的相关错误号。
Error Codes错误码
因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。
1 import urllib2 2 request=urllib2.Request('http://bbs.csdn.net/callmewhy') 3 try: urllib2.urlopen(request) 4 except urllib2.URLError,e: 5 print(e.code) 6 # print(e.reason) 7 # print(e.read())
错误代号是403,错误原因是Forbidden,说明服务器禁止访问。
方法一:加入 hasattr属性提前对属性进行判断,来处理异常
1 from urllib2 import Request,urlopen,URLError,HTTPError 2 request=Request('http://blog.csdn.net/cqcre') 3 try: 4 response=urlopen(request) 5 6 except URLError,e: 7 8 if hasattr(e,'code'): 9 print('the server couldn\'t fulfill the request') 10 print('Error code:',e.code) 11 elif hasattr(e,'reason'): 12 print('we failed to reach a server') 13 print('Reason:',e.reason) 14 else: 15 print('no exception was raised') 16 # everything is ok
方法二:暂时未写