设为首页 收藏本站
查看: 722|回复: 0

[经验分享] [Python]网络爬虫(三):异常的处理和HTTP状态码的分类

[复制链接]

尚未签到

发表于 2017-5-8 11:03:10 | 显示全部楼层 |阅读模式
  先来说一说HTTP的异常处理问题。

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

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

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

1.URLError

通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。

  这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),
  包含了一个错误号和一个错误信息。

  我们建一个urllib2_test06.py来感受一下异常的处理:

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
服务器上每一个HTTP 应答对象response包含一个数字"状态码"。

  有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答。
  例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。
  其他不能处理的,urlopen会产生一个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方法。

  
  我们建一个urllib2_test07.py来感受一下:
  

import urllib2
req = urllib2.Request('http://bbs.csdn.net/callmewhy')
try:
urllib2.urlopen(req)
except urllib2.URLError, e:
print e.code
#print e.read()


按下F5可以看见输出了404的错误码,也就说没有找到这个页面。  

3.Wrapping

  所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。推荐使用第二种。

  
  我们建一个urllib2_test08.py来示范一下第一种异常处理的方案:

from urllib2 import Request, urlopen, URLError, HTTPError
req = Request('http://bbs.csdn.net/callmewhy')
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.'
# everything is fine


和其他语言相似,try之后捕获异常并且将其内容打印出来。


这里要注意的一点,except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError

因为HTTPError是URLError的子类,如果URLError在前面它会捕捉到所有的URLError(包括HTTPError)。








我们建一个urllib2_test09.py来示范一下第二种异常处理的方案:



from urllib2 import Request, urlopen, URLError, HTTPError
req = Request('http://bbs.csdn.net/callmewhy')
try:  
response = urlopen(req)  
except URLError, e:  
if hasattr(e, 'reason'):  
print 'We failed to reach a server.'  
print 'Reason: ', e.reason  
elif hasattr(e, 'code'):  
print 'The server couldn\'t fulfill the request.'  
print 'Error code: ', e.code  
else:  
print 'No exception was raised.'  
# everything is fine

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374601-1-1.html 上篇帖子: PyCon 2011 下篇帖子: 零基础学python-2.21 回到我们的游戏 加入类和函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表