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

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

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

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

import urllib2req = 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, HTTPErrorreq = 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.codeexcept URLError, e:print 'We failed to reach a server.'print 'Reason: ', e.reasonelse: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, HTTPErrorreq = 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.'  print 'Error code: ', e.code  elif hasattr(e, 'reason'):  print 'We failed to reach a server.'  print 'Reason: ', e.reason  else:  print 'No exception was raised.'  

--------------------- 
作者:请叫我汪海 
来源:CSDN 
原文:https://blog.csdn.net/pleasecallmewhy/article/details/8923725 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

  1. python错误代码40035_[Python]网络爬虫(三):异常的处理和HTTP状态码的分类

    先来说一说HTTP的异常处理问题. 当urlopen不能够处理一个response时,产生urlError. 不过通常的Python APIs异常如ValueError,TypeError等也会同时产 ...

  2. Python 网络爬虫(错误之处,敬请斧正)

    很久没有用python了,心血来潮写一下自己对于学习python获取网络数据的总结. 工具 python版本: 3.5 IDE : pycharm 5.0.4 要用到的包可以用pycharm下载: F ...

  3. 精通python网络爬虫-精通python网络爬虫

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 作者:韦玮 转载请注明出处 随着大数据时代的到来,人们对数据资源的需求越来越多, ...

  4. python 网页版笔记_系统学习下python网络爬虫 笔记一

    系统学习下python网络爬虫的知识 1.爬虫的定义 Web Spider,把互联网定义为一个蜘蛛网,网络蜘蛛通过网页的链接地址来寻找网页. 具体过程:从网站的某一个网页(通常是首页)开始,读取网页的 ...

  5. python 网络爬虫

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...

  6. python网络爬虫学习资料

    第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综 ...

  7. 小猿圈分享利用python网络爬虫获取网易云歌词

    今天小猿圈给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本 ...

  8. Python网络爬虫(三) 爬虫进阶

    ###目录: Python网络爬虫(一)- 入门基础 Python网络爬虫(二)- urllib爬虫案例 Python网络爬虫(三)- 爬虫进阶 Python网络爬虫(四)- XPath Python ...

  9. 实战python网络爬虫豆瓣_三分钟教会你利用Python爬虫实现豆瓣电影采集(实战篇)...

    一.项目背景 豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务.可以记录想看.在看和看过的电影电视剧 .顺便打分.写影评.极大地方便了人们的生活. 今天小编以电视剧(美剧)为例,批量爬 ...

最新文章

  1. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
  2. java事件处理模型_从零开始理解JAVA事件处理机制(3)
  3. Java对象序列化详解
  4. 如何解析lvx文档_建站零基础入门:手把手教你如何自助建站
  5. TensorFlow 2.0 - tf.distribute 分布式训练
  6. Python爬虫用Selenium抓取js生成的文件(一)
  7. 23产品经理需要具备的运营能力
  8. 低代码开发平台有哪些?
  9. 网吧赚钱靠什么不求人
  10. 0034-CM启动报InnoDB engine not found分析
  11. python入门教程pdf-《python基础教程第三版》高清版PDF免费下载
  12. 数学与计算机学院女生节标语,3.7女生节标语
  13. 13个医学图像 AI 入门项目- 都跑完你就超神了!
  14. 共模电压和差模电压两种理解方式
  15. 李白关于鸿蒙的诗,名诗欣赏:李白《把酒问月》之--青天有月来几时
  16. 计算机导论 宋斌,宋斌(计算机科学与技术学院)老师 - 南京理工大学 - 院校大全...
  17. 关于laravel下composer安装excel插件
  18. jquery ajax添加ul li,jQuery.ajax动态添加标签无法被获取到
  19. 谈谈以前端的角度出发做好seo需要做什么?
  20. 【TypeScript 专题】之 Ts 中的类(class)

热门文章

  1. rsync通过服务同步、linux系统日志、screen工具
  2. 设置函数环境——setfenv
  3. poj 3177 Redundant Paths
  4. Yik-Chung Wu ---Time synchronization for wireless sensor networks
  5. Tensorflow初学者之搭建神经网络基本流程
  6. MATLAB调用C++程序
  7. MATLAB AWGN信道 M-ary PSK 误码性能
  8. FreeJTS部标视频平台:JT/T808、JT/T809、JT/T796、JT/T794、JT/T1078、苏标ADAS的区别
  9. Apache在windows下的安装配置
  10. QTextCodec中的setCodecForTr等终于消失了 (Qt5)