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

http://blog.csdn.net/pleasecallmewhy/article/details/8923725

先来说一说HTTP的异常处理问题。
当urlopen不能够处理一个response时,产生urlError。
不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
HTTPError是urlError的子类,通常在特定HTTP URLs中产生。
 
1.URLError
通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。

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

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

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

[python] view plain copy
  1. import urllib2  
  2.   
  3. req = urllib2.Request('http://www.baibai.com')  
  4.   
  5. try: urllib2.urlopen(req)  
  6.   
  7. except urllib2.URLError, e:    
  8.     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来感受一下:

[python] view plain copy
  1. import urllib2  
  2. req = urllib2.Request('http://bbs.csdn.net/callmewhy')  
  3.   
  4. try:  
  5.     urllib2.urlopen(req)  
  6.   
  7. except urllib2.URLError, e:  
  8.   
  9.     print e.code  
  10.     #print e.read()  

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



3.Wrapping

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

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

[python] view plain copy
  1. from urllib2 import Request, urlopen, URLError, HTTPError  
  2.   
  3. req = Request('http://bbs.csdn.net/callmewhy')  
  4.   
  5. try:  
  6.   
  7.     response = urlopen(req)  
  8.   
  9. except HTTPError, e:  
  10.   
  11.     print 'The server couldn\'t fulfill the request.'  
  12.   
  13.     print 'Error code: ', e.code  
  14.   
  15. except URLError, e:  
  16.   
  17.     print 'We failed to reach a server.'  
  18.   
  19.     print 'Reason: ', e.reason  
  20.   
  21. else:  
  22.     print 'No exception was raised.'  
  23.     # everything is fine  

和其他语言相似,try之后捕获异常并且将其内容打印出来。
这里要注意的一点,except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError 
因为HTTPError是URLError的子类,如果URLError在前面它会捕捉到所有的URLError(包括HTTPError )。


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

[python] view plain copy
  1. from urllib2 import Request, urlopen, URLError, HTTPError  
  2.   
  3. req = Request('http://bbs.csdn.net/callmewhy')  
  4.     
  5. try:    
  6.     
  7.     response = urlopen(req)    
  8.     
  9. except URLError, e:    
  10.   
  11.     if hasattr(e, 'code'):    
  12.     
  13.         print 'The server couldn\'t fulfill the request.'    
  14.     
  15.         print 'Error code: ', e.code    
  16.   
  17.     elif hasattr(e, 'reason'):    
  18.     
  19.         print 'We failed to reach a server.'    
  20.     
  21.         print 'Reason: ', e.reason    
  22.     
  23.     
  24. else:    
  25.     print 'No exception was raised.'    
  26.     # everything is fine   

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站长工具功能简介 1、JS加密/解密(将代码以js形式进行加密或解密。) 2、UTF-8编码转换工具(UTF-8编码转换。) 3、Unicode编码转换工具(Unicode编码转换。) 4、友情链接(通过本工具可以批量查询指定网站的友情链接在百度的收录、百度快照、PR以及对方是否链接本站,可以识破骗链接。) 5、META信息检测(通过本工具可以快速检测网页的META标签,分析标题、关键词、描述等是否有利于搜索引擎收录。) 6、MD5加密工具(对字符串进行MD5加密。) 7、sfz号码值查询(查询sfz所在地、性别及出生日期。) 8、HTML/UBB代码转换工具(HTML/UBB代码转换。) 9、HTML/JS互转工具(HTML/JS互转。) 10、搜索蜘蛛、机器人模拟工具(通过本工具可以快速模拟搜索引擎蜘蛛访问页面所抓取到的内容信息!) 11、关键词密度检测(通过本工具可以快速检测页面关键词出现的数量和密度,更适合蜘蛛的搜索。) 12、国家域名查看(查看所有国家的域名。) 13、邮编区号查询(查询各地区的邮编及其区号,支持模糊查询。) 14、域名Whois查询工具(Whois简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。通过域名Whois查询,可以查询域名归属者联系方式,以及注册和到期时间。) 15、死链接检测/全站PR查询(通过本工具可以快速测试网站的死链接。死链接-也称无效链接,即那些不可达到的链接。一个网站存在死链接不是什么好事,首先一个网站如果存在大量的死链接,必将大大损伤网站的整体形象,再者搜索引擎蜘蛛是通过链接来爬行搜索,如果太多链接无法到达,不但收录页面数量会减少,而且你的网站在搜索引擎中的权重会大大降低。该查询可以遍历指定网页的所有链接,并分析每个链接的有效性,找出死链接。) 16、搜索引擎收录查询(通过本工具可以快速查询各大搜索引擎对网站的收录数量!) 17、搜索引擎反向链接(通过本工具可以快速查询各大搜索引擎对网站的反向连接数量!) 18、查询手机号码归属地(查询手机号码的归属地及其手机号类型。) 19、SEO综合查询(SEO综合查询。) 20、PR值查询(PR值全称为PageRank(网页级别),取自Google的创始人LarryPage。它是Google排名运算法则(排名公式)的一部分,是Google用于用来标识网页的等级/重要性的一种方法,是Google用来衡量一个网站的好坏的唯一标准。在揉合了诸如Title标识和Keywords标识等所有其它因素之后,Google通过PageRank来调整结果,使那些更具“等级/重要性”的网页在搜索结果中令网站排名获得提升,从而提高搜索结果的相关性和质量。) 21、关键词排名查询(通过关键词排名查询,可以快速得到当前网站的关键字在Baidu/Google收录的排名情况!有些关键词在各地的排名是不一样的,就是通常说的关键字地区排名。比如:新闻、人才等很多。所以才提供多个地点的服务器提供大家查询。) 22、IP查询(通过该工具可以查询指定IP的物理地址或域名服务器的IP和物理地址,及所在国家或城市,甚至精确到某个网吧,机房或学校等;查出的结果仅供参考!) 23、Google收录查询(查询谷歌收录情况。) 24、友情链接查询工具(通过本工具可以批量查询指定网站的友情链接在百度的收录、百度快照、PR以及对方是否链接本站,可以识破骗链接。) 25、友情链接IP查询工具(通过本工具可以批量查询网站友情链接站点的IP地址、服务器物理地址,帮助站长清楚了解友情链接的服务器物理定位。) 26、域名删除查询(.com.net.org等国际域名删除时间,通常在域名到期后的第65或75天,凌晨2点30左右会删除国内域名的删除时间,通常在域名到期后的第15或16天,凌晨4:30会删除友情提示:域名删除时间仅供参考,谢谢!) 27、百度收录查询(本工具为站长提供指定时间内百度搜索对指定网站的收录情况,包括收录的网页数量和网页的具体情况,让您更好地掌握百度搜索对您的网站收录情况。) 28、PR输出值查询(查询网站的PR输出值,PR输出值:带给友情链接的PR值。计算公式:(1-0.85)+0.85*(PR值/外链数)。) 29、查看网页源代码(通过本工具可以快速查找指定网站的页面源代码。) 30、Unix时间戳(Unixtimestamp)转换工具(什么是Unix时间戳(Unixtimestamp):Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值