先来说一说HTTP的异常处理问题。

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

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

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

1.URLError

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

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

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

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

importurllib2

req= urllib2.Request('http://www.baibai.com')try: urllib2.urlopen(req)excepturllib2.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来感受一下:

importurllib2

req= urllib2.Request('http://bbs.csdn.net/callmewhy')try:

urllib2.urlopen(req)excepturllib2.URLError, e:printe.code#print e.read()

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

3.Wrapping

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

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

from urllib2 importRequest, urlopen, URLError, HTTPError

req= Request('http://bbs.csdn.net/callmewhy')try:

response=urlopen(req)exceptHTTPError, e:print 'The server couldn\'t fulfill the request.'

print 'Error code:', e.codeexceptURLError, 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 importRequest, urlopen, URLError, HTTPError

req= Request('http://bbs.csdn.net/callmewhy')try:

response=urlopen(req)exceptURLError, e:if hasattr(e, 'reason'):print 'We failed to reach a server.'

print 'Reason:', e.reasonelif hasattr(e, 'code'):print 'The server couldn\'t fulfill the request.'

print 'Error code:', e.codeelse:print 'No exception was raised.'

#everything is fine

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

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

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

  2. python新闻聚合_基于Python的新闻聚合系统网络爬虫研究

    基于 Python 的新闻聚合系统网络爬虫研究 左卫刚 [摘 要] 摘 要 本研究旨在创建一个能够从不同页面布局中提取数据的开源爬 虫,其中包括网络爬虫. API .网络爬虫调度器以及 Socket ...

  3. boot返回码规范 spring_三种自定义SpringBoot返回的状态码

    关于如何自定义SpringBoot返回的状态码 关于HttpStatus 在SpringBoot中关于状态码有一个枚举类型,如下. public enum HttpStatus { CONTINUE( ...

  4. 如何自学python爬虫-Python初学者如何从网络爬虫到机器学习?

    很多同学选择了Python作为其学习编程的首选语言,而Python也以其容易上手的语法.广泛的应用领域.不断旺盛的市场需求回报着每一个学习者和应用者. 今天我们来说说Python的一个热门的应用领域- ...

  5. python古诗默写_Python网络爬虫:爬取古诗文中的某个制定诗句来实现搜索

    Python网络爬虫:爬取古诗文中的某个制定诗句来实现搜索 发布时间:2020-07-20 23:48:19 来源:51CTO 阅读:883 python编译练习,为了将自己学习过的知识用上,自己找了 ...

  6. 【天善学院】自己动手,丰衣足食!Python3网络爬虫实战案例 附讲义与代码 6 A+所属分类:Python教程

    自己动手,丰衣足食!Python3网络爬虫实战案例 适宜人群: 萌新小白:我连爬虫也不知道是什么 入门菜鸟:我对一些爬虫的用法还不是很熟练 老司机:我想学习更高级的框架及分布式 从环境基础到进阶分布式 ...

  7. python自动测试p-python网络爬虫之自动化测试工具selenium[二]

    @ 前言 hello,大家好,在上章的内容里我们已经可以爬取到了整个网页下来,当然也仅仅就是一个网页. 因为里面还有很多很多的标签啊之类我们所不需要的东西. 额,先暂且说下本章内容,如果是没有丝毫编程 ...

  8. python代码大全p-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)

    WechatSogou[1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典.[1]: https://github ...

  9. 企业级Python开发大佬利用网络爬虫技术实现自动发送天气预告邮件

    前天小编带大家利用Python网络爬虫采集了天气网的实时信息,今天小编带大家更进一步,将采集到的天气信息直接发送到邮箱,带大家一起嗨~~拓展来说,这个功能放在企业级角度来看,只要我们拥有客户的邮箱,之 ...

最新文章

  1. Github 标星 11.5K!这可能是最好的 Java 博客系统
  2. 如何看待清华北大毕业生流失去国外?
  3. 嵌入式驱动开发之2440/2410---硬件看门狗,喂狗
  4. cppunit linux,Linux中使用CppUnit工具
  5. nyoj 174 Max Sequence(最大子串和变形)
  6. .NET Core开发日志——Middleware
  7. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
  8. 分布式环境下,怎么保证线程安全
  9. 一代人的回忆!国产游戏机传奇落幕:官网已无法正常访问
  10. 畅通工程(并查集模版题)
  11. 排序算法专题-冒泡排序
  12. 对比起来学习前端三大框架(持续更新)
  13. 操作系统概念之OSAL
  14. 【笔记】代码整洁之道
  15. 解决--网页兼容模式下虚拟打印保存为pdf乱码
  16. 【JAVA】poi-tl简单实现调查问卷word模板
  17. Cannot run program “D:\jdk8\bin\java.exe“ (in directory “C:\Users\Administrator\AppData\Local\JetBra
  18. 阿里云免费服务器测试题答案
  19. React18 tearing tree issue 撕裂状态问题
  20. Todesk软件使用

热门文章

  1. ajax传值controller怎么写,关于ajax请求Controller传值问题详细记录
  2. kafka Linux 下启动服务 测试,Linux下安装部署Kafka分布式集群与测试
  3. php yii2 路径问题,yii2常用路径获取
  4. ios mysql注册登录界面_iOS+PHP实现登录功能
  5. zemax设计35mm镜头_1650万像素的手机镜头设计
  6. winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel
  7. Parhaps you are running on a JRE rather than a JDK?
  8. selinux 导致ftp文件夹出错~
  9. 带头结点的单链表的初始化,建立,插入,查找,删除
  10. 解决IE下不支持placeholder属性可以根据自己的需要去扩展