Python爬虫入门五URLError异常处理

本节在这里主要说的是 URLError 还有 HTTPError,以及对它们的一些处理

1.URLError

首先解释下 URLError 可能产生的原因:

  • 网络无连接,即本机无法上网
  • 连接不到特定的服务器
  • 服务器不存在

在代码中,我们需要用 try-except 语句来包围并捕获相应的异常。下面是一个例子

import urllib2requset = urllib2.Request('http://www.xxxxx.com')
try:urllib2.urlopen(request)
except urllib2.URLError, e:print e.reason

结果:

[Errno 11004] getaddrinfo failed

2.HTTPError

HTTPError 是 URLError 的子类,在你利用 urlopen 方法发出一个请求时,服务器上都会对应一个应答对象 response,其中它包含一个数字” 状态码”。举个例子,假如 response 是一个” 重定向”,需定位到别的地址获取文档,urllib2 将对此进行处理。 其他不能处理的,urlopen 会产生一个 HTTPError,对应相应的状态吗,HTTP 状态码表示 HTTP 协议所返回的响应的状态。下面将状态码归结如下:

  • 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
  • 101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在 Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
  • 102:继续处理 由 WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
  • 200:请求成功 处理方式:获得响应的内容,进行处理
  • 201:请求完成,结果是创建了新资源。新创建资源的 URI 可在响应的实体中得到 处理方式:爬虫中不会遇到
  • 202:请求被接受,但处理尚未完成 处理方式:阻塞等待
  • 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
  • 300:该状态码不被 HTTP/1.0 的应用程序直接使用, 只是作为 3XX 类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
  • 301:请求到的资源都会分配一个永久的 URL,这样就可以在将来通过该 URL 来访问此资源 处理方式:重定向到分配的 URL
  • 302:请求到的资源在一个不同的 URL 处临时保存 处理方式:重定向到临时的 URL
  • 304:请求的资源未更新 处理方式:丢弃
  • 400:非法请求 处理方式:丢弃
  • 401:未授权 处理方式:丢弃
  • 403:禁止 处理方式:丢弃
  • 404:没有找到 处理方式:丢弃
  • 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
  • 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
  • 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

HTTPError 实例产生后会有一个 code 属性,这就是是服务器发送的相关错误号。 因为 urllib2 可以为你处理重定向,也就是 3 开头的代号可以被处理,并且 100-299 范围的号码指示成功,所以你只能看到 400-599 的错误号码。 下面我们写一个例子来感受一下,捕获的异常是 HTTPError,它会带有一个 code 属性,就是错误代号,另外我们又打印了 reason 属性,这是它的父类 URLError 的属性。

import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')
try:urllib2.urlopen(req)
except urllib2.HTTPError, e:print e.codeprint e.reason

结果:

403
Forbidden

错误代号是 403,错误原因是 Forbidden,说明服务器禁止访问。 我们知道,HTTPError 的父类是 URLError,根据编程经验,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常,所以上述的代码可以这么改写

import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')
try:urllib2.urlopen(req)
except urllib2.HTTPError, e:print e.code
except urllib2.URLError, e:print e.reason
else:print "OK"

如果捕获到了 HTTPError,则输出 code,不会再处理 URLError 异常。如果发生的不是 HTTPError,则会去捕获 URLError 异常,输出错误原因。 另外还可以加入 hasattr 属性提前对属性进行判断,以免出现属性输出报错的现象。代码改写如下

import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')
try:urllib2.urlopen(req)
except urllib2.URLError, e:if hasattr(e,"reason"):print e.reason
else:print "OK"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型

提到 sysfs 文件系统 ,必须先需要了解的是Linux设备模型,什么是Linux设备模型呢? 一、Linux 设备模型 1、设备模型概述 从2.6版本开始,Linux开发团队便为内核建立起一个统一的设备模型。在以前的内核中没有独立的数据结构用来让内…

Python爬虫入门六Cookie的使用

为什么要使用 Cookie 呢? Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容…

有得必有失

上次也说道Ruby on Rails 是一个很不错的框架。本人也想去研究一翻,我已经不再替别人写程序了。 当编程变成一门兴趣的时候,而不是吃饭的依据。我觉得我需要跟着我的心走。 1:我现在的工作环境是在LINUX下,我一次次的折腾mono好吧…

mybatis下log4j使用

1. log4j jar包(mvnrepository) 2. log4j.properties文件 log4j.properties内容: log4j.rootLoggerDEBUG, stdout, logfile    log4j.appender.stdoutorg.apache.log4j.ConsoleAppender    log4j.appender.stdout.layoutorg.apache…

Python爬虫入门七正则表达式

已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式 1.了解正则表达式 正则表达式是用来匹配字符串非常强大的工具,在其…

Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统

一、什么是Linux设备文件系统 首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板&a…

CSS 如何让Table的里面TD全有边框 而Table的右左边框没有

比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px solid; //显示右边框为1px,如果不想显示就为0pxBORDER-TOP: #f9f9f9 0px solid; //显示上边框为1px,如果不想显示就为0pxBORDER-LEFT: #f9f9f…

情人节,教大家使用css画出一朵玫瑰花。

情人节到了,给大家来一朵高端的玫瑰花。 在网上看到的一个canvas实现的玫瑰花,效果很好,但是代码被压缩过,也没有注释,看的云里雾里的。 今天我教大脚用CSS来实现一朵玫瑰花。 先看效果 首先我们画出一个花瓣 1、画出一…

Python爬虫利器一Requests库的用法

之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助。入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取。那么这一节来简单介绍一下 requests 库的基本…

Windows窗口样式

windows样式有很多种,不同的windows,windows控件接受不同的样式。如Combo box接受下以样式:WS_CHILD AlwaysWS_VISIBLE UsuallyWS_DISABLED RarelyWS_VSCROLL To add vertical scrolling for the list box in the combo boxWS_HSCROL…

Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

一、VFS 虚拟文件系统基础概念 Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File System)是 Linux 内核中的一个软件抽象层。它通过一些…

初识 es6

es6 可能出来已经有一段时间了,但是我到今天才发现他的好,却不是很了解他,也不知道各个浏览器的兼容性怎么样?今天就把他们都弄明白。 新增命令 let ES6新增了let命令,用来声明变量。它的用法类似于var,但是…

Python爬虫利器四PhantomJS的用法

大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的 html 代码,如果页面是 JS 渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索 JS 渲染的到的一些结果,那简直没天理了。所以&#xff0…

从零开始学习Hadoop--第1章 Hadoop的安装

Hadoop的安装比较繁琐,有如下几个原因:其一,Hadoop有非常多的版本;其二,官方文档不尽详细,有时候更新脱节,Hadoop发展的太快了;其三,网上流传的各种文档,或者…

vim使用—实现程序的自动补齐(C语言)

使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。vim做为一个出色的编辑器,这样的功能当然少不了。至于如何实现程序自动补全,网上教程很多。这里,我将自己配置过程…

8、JDBC入门整理

JDBC入门 l 导jar包:驱动! l 加载驱动类:Class.forName(“类名”); l 给出url、username、password, l 使用DriverManager类来得到Connection对象! 1 什么是JDBC(接口,实现为驱动) JDBC(Java DataBase…

Python 爬虫利器二之 Beautiful Soup 的用法

上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具&…

[C#]Attribute特性(3)——AttributeUsage特性和特性标识符

相关文章 [C#]Attribute特性 [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性 除了可以定制自己的特性来注释常用的C#类型外,您可以用AttributeUsage特性来定义您想怎样使用这些特性。AttributeUsage特性采用如下的调用惯例: 1 [Attri…

Linux 命令 ——less命令

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less …

Python 爬虫利器三之 Xpath 语法与 lxml 库的用法

原文链接https://cuiqingcai.com/2621.html 前言 前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法。如果大…