热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3网络爬虫开发实战读书笔记(三)

3.1.2处理异常urllib的error模块定义了request模块产生的异常,如果出现了问题,request模块便会抛出error模块中定义的异常

3.1.2 处理异常

urllib的error模块定义了request模块产生的异常,如果出现了问题,request模块便会抛出error模块中定义的异常。


1. URLError

继承与OSError,由request模块产生的异常都可以通过补货这个类来处理。
它具有一个属性,reason——返回错误的原因

from urllib import request,error
try:response = request.urlopen("https://cuiqingtai.com/index.htm")
except error.URLError as e:print(e.reason)

输出:

[Errno 8] nodename nor servname provided, or not known

2.HTTPError

是URLError的子类,专门用来处理HTTP请求错误,例如:认证请求失败。有三个属性:
1、code:返回HTTP状态码,比如404网页不存在,500表示服务器内部错误
2、reason:和父类一样,返回错误的原因
3、headers:返回请求头
实例:

from urllib import request,error
try:response = request.urlopen("https://cuiqingtai.com/index.htm")
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 Successfully!')

这里是比较好的写法~先捕捉子类的错误,再去捕捉父类的错误。

注意哦:有时候reason返回的不是一个字符串而是一个对象
实例如下~

try:response = urllib.request.urlopen('https://www.baidu.com',timeout=0.01)
except urllib.error.URLError as e:print(type(e.reason))if isinstance(e.reason,socket.timeout):print('TIME OUT')

输出的是socket.time对象~
我们这里可以用isinstance()来判断reason返回的对象类型,以获得更精准的异常判断。

<class &#39;socket.timeout&#39;>
TIME OUT

3.1.3 解析链接

1、urlparse(): 该方法可以实现URL的识别和分段
实例如下&#xff5e;

from urllib.parse import urlparse
result &#61; urlparse(&#39;http://www.baidu.com/index.html;user?id&#61;5#comment&#39;)
print(type(result))
print(result)

这里使用了urlparse()方法做了一个URL解析&#xff0c;输出了解析类型&#xff08;ParseResult类型的对象&#xff09;&#xff0c;然后将结果输出
输出如下&#xff1a;

<class &#39;urllib.parse.ParseResult&#39;>
ParseResult(scheme&#61;&#39;http&#39;, netloc&#61;&#39;www.baidu.com&#39;, path&#61;&#39;/index.html&#39;, params&#61;&#39;user&#39;, query&#61;&#39;id&#61;5&#39;, fragment&#61;&#39;comment&#39;)

ParseResult类型的对戏那个包含6个部分&#xff1a;
scheme、netloc、path、params、query、fragement
下面对解析结果分析&#xff1a;
http://www.baidu.com/index.html;user?id&#61;5#comment
1、: / /前面的就是scheme&#xff0c;代表协议
2、第一个/符号前面的就是netloc&#xff0c;域名&#xff1b;后面是path&#xff0c;访问路径
3、分号;后面是params&#xff0c;参数
4、问号?后面是查询条件query&#xff0c;一般用作GET类型的URL
5、#后面的是锚点fragment&#xff0c;用于定位页面内部的下拉位置。
所以可以得出一个标准链接的格式&#xff1a;
scheme://netloc/path;params?query#fragement

urlparse()可以将其拆分开来。

下面来看看urlparse的API用法&#xff1a;

urllib.parse.urlparse(urlstring, scheme&#61;&#39;&#39;, allow_fragments&#61;True)

__urlstring:__必填项&#xff0c;待解析的URL
__scheme:__默认的协议&#xff08;比如http或者https&#xff09;。假如URL没有带有协议信息&#xff0c;那么会将这个当成默认协议。
实例如下&#xff5e;

from urllib.parse import urlparse
result &#61; urlparse("www.baidu.com/index.html;user?id&#61;5#comment",scheme&#61;&#39;https&#39;)
print(result)

运行结果如下&#xff1a;

ParseResult(scheme&#61;&#39;https&#39;, netloc&#61;&#39;&#39;, path&#61;&#39;www.baidu.com/index.html&#39;, params&#61;&#39;user&#39;, query&#61;&#39;id&#61;5&#39;, fragment&#61;&#39;comment&#39;)

__allow_fragments:__即是否可以忽略fragment。如果被设置成false&#xff0c;那么fragment会被忽略&#xff0c;它会被解析成path、params或者query的一部分&#xff0c;fragment部分为空。
实例如下&#xff5e;

from urllib.parse import urlparse
result &#61; urlparse(&#39;http://www.baidu.com/index.html;user?id&#61;5#comment&#39;,allow_fragments&#61;False)
print(result)

结果如下&#xff1a;

ParseResult(scheme&#61;&#39;http&#39;, netloc&#61;&#39;www.baidu.com&#39;, path&#61;&#39;/index.html&#39;, params&#61;&#39;user&#39;, query&#61;&#39;id&#61;5#comment&#39;, fragment&#61;&#39;&#39;)

fragment被包含在了query中。
同理&#xff0c;如果URL中如果没有包含query、params&#xff0c;那么fragment和query、params会被包含在path中

这里ParseResult实际上是一个元组&#xff0c;我们可以用下表引用也可以用属性名获取。
eg&#xff1a;
result.scheme &#61; result[0]

2.urlunparse():
它接受的参数是一个可迭代对象&#xff0c;长度必须为6&#xff0c;要不然会报错的。
实例如下&#xff1a;

from urllib.parse import urlunparse
data &#61; [&#39;http&#39;,&#39;www.baidu.com&#39;,&#39;index.html&#39;,&#39;user&#39;,&#39;a&#61;6&#39;,&#39;comment&#39;]
print(urlunparse(data))

输出一个URL&#xff1a;

http://www.baidu.com/index.html;user?a&#61;6#comment

3.urlsplit():
这个方法与urlparse()方法类似&#xff0c;但是不再单独解析params&#xff0c;只返5个结果。params会合并到path中。
实例如下&#xff1a;
假装有例子
假装有输出
urlsplit()方法返回的结果是SplitResult&#xff0c;是一个元组类型既可以用属性获取值&#xff0c;又可以用索引来获取。与urlparse()一样的。

4.urlunsplit():
与urlsplit()相对应&#xff0c;与urlunparse()类似&#xff0c;也是将链接的各个部分组合成完整链接的方法。传入的参数也是一个可迭代对象&#xff0c;只不过长度是5。

5.urljoin():
除了可以用urlunparse() and urlunsplit()完成链接的合并&#xff0c;还可以使用urljoin()方法&#xff5e;我们可以提供一个base_url来作为第一个参数&#xff0c;然后将一个新链接作为第二个参数。该方法会分析base_url的scheme,netloc,path这3个内容&#xff0c;并且对新链接进行补充&#xff0c;返回最终结果。
具体代码分析如下&#xff1a;

print(urljoin(&#39;http://www.baidu.com&#39;,&#39;FAQ.html&#39;))
print(urljoin(&#39;http://www.baidu.com/about.html&#39;,&#39;https://cuiqingcai.com/FAQ.html&#39;))

输出如下&#xff5e;

http://www.baidu.com/FAQ.html
https://cuiqingcai.com/FAQ.html

注意&#xff5e;
这三个参数只是对新链接缺少的部分进行填充&#xff0c;如果新链接本身就有了&#xff0c;那么就不用对新链接进行替换了。而旧链接的params, query, fragment是不起作用的哦&#xff5e;

6.urlencode():
这个常用的方法在构造GET请求参数的时候很有用。
实例如下&#xff5e;

from urllib.parse import urlencode
params &#61; {&#39;name&#39; : &#39;germey&#39;,&#39;age&#39; :22
}
base_url &#61; &#39;http://www.baidu.com?&#39;
url &#61; base_url &#43; urlencode(params)
print(url)

输出如下&#xff5e;

http://www.baidu.com?name&#61;germey&age&#61;22

这里可以看到哈&#xff0c;参数成功由字典类型经urlencode()转化成GET请求参数了&#xff5e;&#xff08;该方法很常用哈&#xff09;

7.parse_qs():
这个是对应于urlencode()的反序列化方法&#xff1a;将GET请求参数转化成字典&#xff5e;
实例如下&#xff5e;

from urllib.parse import parse_qs
query &#61; &#39;name&#61;germey&age&#61;22&#39;
print(parse_qs(query))

输出如下&#xff5e;

{&#39;name&#39;: [&#39;germey&#39;], &#39;age&#39;: [&#39;22&#39;]}

8.parse_qsl():
将参数转化为元组组成的列表&#xff5e;
具体例子与上面的parse_qs()相似

9.quote():
该方法可以将内容转化为URL编码的格式&#xff5e;
如果URL带有中文参数&#xff0c;有时候可能导致乱码的问题&#xff0c;所以此时用这个方法可以将中文字符转化为URL编码&#xff5e;
实例如下&#xff1a;

from urllib.parse import quote
keyword &#61; &#39;壁纸&#39;
url &#61; &#39;https://www.baidu.com/s?wd&#61;&#39; &#43; quote(keyword)
print(url)

输出如下&#xff5e;

https://www.baidu.com/s?wd&#61;%E5%A3%81%E7%BA%B8

PS&#xff1a;我感觉这个很有趣呀&#xff0c;感觉现在可以看懂了很多的URL了&#xff0c;之前以为这些后面乱七八糟的是啥玩意&#xff0c;现在都能用接下来的方法来解码URL了呢&#xff5e;

10.unquote()
这个方法是对URL进行解码的&#xff5e;
实例如下&#xff5e;

from urllib.parse import unquote
url &#61; &#39;https://www.baidu.com/s?wd&#61;%E5%A3%81%E7%BA%B8&#39;
print(unquote(url))

输出如下&#xff1a;

https://www.baidu.com/s?wd&#61;壁纸

以上就是parse模块的一些常用的URL方法啦&#xff0c;我们可以用这些方法对URL解析和构造哦&#xff0c;最好熟练掌握&#xff5e;


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
author-avatar
叶蕊2502860197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有