零基础学 Python 爬虫(13):urllib 基础使用(三)
人生苦短,我用 Python
引言
前面两篇基础,我们介绍请求发送的过程。
不知道各位同学有没有想过这样一个问题,如果在爬虫运行的过程中,网络突然波动了下,比如突然网速很慢很慢,造成当前的请求超时,程序很可能会直接挂掉。
这种处理方式显然不是我们希望看到的,我们希望看到的肯定是如果当前的请求挂掉,那就挂掉,不要影响其他的请求或者是下一次的请求。
那么,我们在发送请求的时候,异常处理就显得十分有必要。
urllib 的 error 模块定义了由 request 模块产生的异常,如果出现问题, request 模块便会抛出 error 模块中定义的异常。
对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:784758214,从0基础的python脚本到web开发、爬虫、django、数据挖掘数据分析等,0基础到项目实战的资料都有整理。送给每一位python的小伙伴!每晚分享一些学习的方法和需要注意的小细节,学习路线规划,利用编程赚外快。快点击加入我们的 python学习圈
URLError
URLError 这个类来自于 urllib 库的 error 模块,它继承自 OSError ,是 error 异常模块的基类,由 request 模块产生的异常都可以通过捕获这个类来处理。
它只有一个属性 reason ,即返回错误的原因。
我们来写一个简单的示例大家看一下:
from urllib import request, error# 访问明显不存在的地址,报错:Not Found
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.URLError as e:print(e.reason)# 访问超时,报错:timed out
try:response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:print(e.reason)
这里我们访问了一个明显不存在的链接和限定了极短的超时时间,这里会抛出异常,但是我们捕获了 URLError 这个异常,运行结果如下:
Not Found
timed out
程序没有直接抛出异常终止运行,而是输出了上面这个异常,通过这样的操作,我们可以避免程序异常终止,同时还可以对这个异常做出针对性的处理。
此外,异常捕捉抛出的异常不一定都是字符串类型,比如访问超时的报错,我们将打印结果的代码稍作改动:
from urllib import request, error
import socket# 异常类型示例
try:response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:print(type(e.reason))if isinstance(e.reason, socket.timeout):print('TIME OUT')
结果如下:
<class 'socket.timeout'>
TIME OUT
HTTPError
它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等。它有如下 3 个属性。
- code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误等。
- reason:同父类一样,用于返回错误的原因。
- headers:返回请求头。
还是先看一个最简单的示例:
from urllib import request, error# 访问明显不存在的地址,使用 HTTPError 捕捉异常
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:print(e.reason, e.code, e.headers, sep='\n')
运行结果如下:
Not Found
404
Date: Sun, 01 Dec 2019 15:11:48 GMT
Content-Type: text/html
Content-Length: 49307
Connection: close
Server: tencent-cos
Last-Modified: Sun, 01 Dec 2019 15:03:24 GMT
X-NWS-UUID-VERIFY: c89959eb27b89a0fb1c0326d1b2e7171
Accept-Ranges: bytes
ETag: "1bb6cc2c28a5621cf0c3238107edc229"
x-cos-error-code: NoSuchKey
x-cos-error-detail-Key: aa
x-cos-error-message: The specified key does not exist.
x-cos-request-id: NWRlM2Q4MzRfMzNhNzAzMDlfYTljZl8yNGU1NTgx
x-cos-trace-id: OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQ5YWUxMjNkYTk3NzdjZmZlMDQzOTgxOThkOTNlOWFkOGJiN2YzOGQ5MDdjNGY0ODQ1MGIzYjUyMzg2NjFhNzc=
X-Daa-Tunnel: hop_count=2
X-NWS-LOG-UUID: 7c3fe80b-af9a-4e59-969b-10c8b3963a1d
X-Cache-Lookup: Hit From Upstream
X-Cache-Lookup: Hit From Upstream
因为 URLError 是 HTTPError 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,这样对异常的处理更具针对性。
注意: 捕捉异常一般先捕捉子类异常,再捕捉父类异常。
所以我们可以更改下前面的异常捕捉的代码进行一些优化:
在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
# 优化异常捕捉代码
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:print(e.reason, e.code, e.headers, sep='\n')
except error.URLError as e:print(e.reason)
else:print('Request Success!')
零基础学 Python 爬虫(13):urllib 基础使用(三)相关推荐
- python学起来难不难-零基础学Python爬虫难不难?要怎么学?
零基础学Python爬虫难不难?要怎么学?众所周知,Python是最容易上手的编程语言,如果有一定基础,学会Python爬虫也是分分钟钟的事.对于零基础的学习者来说,Python爬虫也是比较简单的,只 ...
- 爬虫取中间文本_零基础学 Python 爬虫 I:了解爬虫基础
人生苦短,我用 Python 引言 各位同学大家好,好久不见(可能只有一两天没见:囧)~~~ 先讲一件事情,昨天为啥没更新. emmmmmmmmm,当然是因为加班啦,快到年底了,公司项目比较忙,最近的 ...
- 0基础学python有多难-0基础学Python有多难?
0基础学Python有多难?该怎么入门?零基础学Python并不难,因为Python是一门非常适合初学者入门的编程语言.Python语法简单明了,代码可读性很高,容易入门.但Python对代码的要求非 ...
- 0基础学python难吗-0基础学武汉Python开发课程有多难?该怎么入门?
Python语言可谓十分强大,正如它的两个外号所称,一个是"内置电池",另一个是"胶水语言".开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其 ...
- 0基础学python难吗-0基础学Python有多难?该怎么入门?
0基础学Python有多难?该怎么入门?零基础学Python并不难,因为Python是一门非常适合初学者入门的编程语言.Python语法简单明了,代码可读性很高,容易入门.但Python对代码的要求非 ...
- 0基础学python有多难-0基础纯小白学Python,请注意这2个坑
0基础的纯小白学Python有哪些坑需要避免?有没有适合小白的Python教材推荐? 很多纯0基础,毫无编程经验的小白在学习Python的过程中总是无法坚持下来,究其原因,其实就是因为毫无经验,方向不 ...
- 零基础学python爬虫-零基础如何学爬虫技术?一篇带你入门!(理论+实操+荐书)...
对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情. 但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现! 同时,你需要从一开始就有一个具体的目标!只有在目标的驱动下,你的 ...
- 零基础学python爬虫-我是如何零基础开始能写Python爬虫的
刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件. 利用这些数据,可以做很多领域的分析.市场调研,获得很多有价值的信息.这种 ...
- 零基础学 Python爬虫(5):前置准备(四)数据库基础
人生苦短,我用 Python 本篇文章,我们接着介绍基础内容,数据库. 爬虫将数据爬取完成后,总要有地方存放吧,这个数据存在哪里呢? 当然是数据库中,那个说放在 Excel 里的,你给我站住! 当然 ...
最新文章
- LOADRUNNER 登陆功能测试实例(转)
- 【面试招聘】去不了大厂实习,小厂实习去吗?
- 通过IDEA查看jar包中的依赖关系
- racle的STRUCT和VARRAY的读写方法
- android linux内核开发环境,定制Android 4.2.2开发环境
- C - Internet Address CodeForces - 245B(有些思维的水题)
- 从原理到方法,一文讲清如何应对C语言内存泄露!
- 在Java 8中,有没有一种简洁的方法可以迭代带有索引的流?
- threadx系统_实时操作系统(RTOS)市场简报
- IDEA用maven创建springMVC项目和配置
- Mac上“照片”的终极工具箱​​​​ PowerPhotos
- Asp.net网站使用HttpHandler实现图片防盗链功能
- Velodyne 16线三维激光雷达
- Linux重置root密码和Linux基础命令
- jsb is not in the sudoers file. This incident will be reported.
- 小程序开发需要多少钱?
- 每日经典算法题(十六) 九九乘法表
- mysql血缘 表级血缘 字段级血缘GUDU GSP,JSQL PARSER,ANTLR MYSQL,DRUID
- 一种TV端自动化测试应用OTA升级的方法
- 【使用C++开发MCU】05-CAN实例之NXP S32K1 FlexCAN模块
热门文章
- 【VSCode】Windows 下搭建 Fortran 环境
- 机器学习数据科学包(三)——Pandas实例:MovieLens电影数据分析
- 亚马逊收购全食超市成中国新零售的学生,最终却会成为对手
- linux系统下安装微信
- 厉害了!用“Pandas”现在也可以绘制交互式的图形了!
- Debian 10创建文件夹和删除文件夹命令
- 【编译打包】tengine 1.5.1 SRPM
- linux vim后退出的命令
- 最近使用百度分享的api,引发 了一下问题,微博分享的页面跳转不成功
- php的getopt函数,PHP函数getopt详解