版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章
模块Python程序设计01模块、包和库02常用标准库模块的使用03基于第三方库的爬虫应用04本章回顾01模块、包和库模块是将功能封装起来,使用时直接导入,可提高代码开发效率、避免重复开发,类似函数和类有封装思想,但模块是更复杂功能的封装容器。以洗衣机为例,将洗衣机类比为模块,人们使用洗衣机无需关心其工作原理,如同使用模块无需了解其具体实现,只需使用其功能。
在开发过程中,总是会接触到模块、包、库等概念,这些概念简单理解就是函数、类、变量等可以封装在模块(module)中,多个模块可以封装到包(package)里面,多个包可以封装到库(library)里面。模块及其导入方式我们在第一章的时候,就接触过模块这个概念,那么到底什么是模块呢?简单理解,模块就是一个包含了许多功能/方法的文件,即每一个.py文件都可以被当成是一个模块,模块可以包含直接运行的代码块、类、函数或这几种的组合。导入模块的常用方式有三种,分别是import语句、from…import语句和from…import*语句。模块及其导入方式import语句import语句用于导入整个模块,支持导入多个模块,语法格式如下:
以我们之前使用过的随机生成整数的函数randint为例,由于需要使用randint函数,而randint函数位于random模块下,所以在使用randint函数之前需要使用语句“import
random”进行模块导入,如下图所示。模块及其导入方式如果在使用randint函数之前没有导入random模块,将会报NameError错误,提示“name'random'isnotdefined”,如下图所示。模块及其导入方式使用import语句的方式导入,因为是导入的整个模块,所以需要使用“模块名.函数名”的方式调用函数。除此之外,我们还可以使用as关键字对引入的模块重命名,如下图所示。模块及其导入方式from…import语句模块导入除了可以整个模块都导入之外,也可以使用“from…import语句”只导入某个或某几个函数,语法格式如下:
使用此种方式导入,可以直接使用函数名进行调用,还是以random模块为例,如下图所示。模块及其导入方式from…import*语句使用“from…import*语句”可以导入一个模块的所有内容,举例如下图所示。自定义模块自定义模块就是根据业务需求自行定义的模块,JupyterNotebook对自定义模块的支持不是很友好,所以为了演示自定义模块的使用,我们使用安装Anaconda时自带的另一个工具Spyder,如下图所示。自定义模块打开Spyder,在本地电脑上找一个合适的位置新建一个文件夹“test_module”,然后在此文件夹下新建一个“animal_act.py”文件(File->NewFile),然后将“案例7:马戏团动物表演”中的【代码5-12】粘贴进去,单击“运行按钮”,看控制台是否输出正常,如下图所示。此时“animal_act.py”文件就是一个自定义的模块,想要引用这个模块,分为同级目录下引用和非同级目录下引用两种情况。自定义模块同级目录下引用我们在和它同一个文件夹“test_module”中新建一个“test.py”文件,此时如果想在“test.py”文件中引入自定义模块“animal_act.py”,可以使用“import语句”直接导入,如下图所示。自定义模块非同级目录下引用自定义模块,直接用import无法找到,要借助sys模块导入自定义模块的path。以新建文件夹“test_module2”及其下的文件“test2.py”为例,若要在“test2.py”中引入非同级目录下的自定义模块“animal_act.py”,直接引入会报错。如下图所示自定义模块正确的引用方式如下所示。此时单击“运行按钮”,可以正常运行“animal_act.py”文件下的start()方法了,运行结果如下图所示。什么是包在Python中,包是一个分层次的文件目录结构,是由模块及子包、子包下的子包等组成的Python应用环境。简单理解包就是文件夹,但是该文件夹下必须包含“__init__.py”文件(__init__.py文件内容可以为空),也就是“__init__.py”文件用于标识当前文件夹是否为一个包。“__init__.py”文件的作用可总结为:
与普通目录的区别标识,即用于标识当前文件夹是否为一个包。
编写代码,定义类、函数、变量等。包的使用为了更好地演示包的使用,我们还是使用Spyder工具。打开Spyder,在本地电脑上找一个合适的位置新建一个文件夹“testpackage”,在此文件夹下新建一个空的“__init__.py”文件(Spyder中新建文件:File->NewFile),然后再分别建文件“testpackage1.py”和“testpackage2.py”,此时目录结构如下图所示。包的使用文件“testpackage1.py”和“testpackage2.py”中的代码分别如下所示。包的使用然后我们在包外面新建一个文件“usepackage.py”,在文件中引入包并使用其中的模块,如下所示运行“usepackage.py”文件,结果如下图所示。标准库与常用标准库模块库是为了方便管理与安装,将能够实现某一功能的模块和包封装而成的集合。根据库是否已经包含在Python官方安装包中,可以将其分为标准库和第三方库。标准库就是在Python官方安装包中包含的库,即安装好Python后就具有的库。标准库中的模块就是标准库模块,常用的标准库模块总结如表所示。第三方库第三方库就是在Python官方安装包中不包含的库,第三方库中的模块即第三方模块。想要使用第三方库中的模块,需要先安装第三方库。第三方库可以在命令行窗口使用pip命令在线安装,也可以先下载相应的第三方库安装程序,然后再进行安装。Python的一大优势就是有丰富且易用的第三方库及模块,省去了大量重复造轮子的时间,常用的第三方模块有用于图像处理的pillow,用于处理URL资源的requests,用于数据可视化的matplotlib等。02常用标准库模块的使用在实际开发中我们要经常使用系统的标准库模块,比如我们想实现字符串匹配功能,可以使用正则表达式re模块;想要实现时间相关功能,可以使用time模块、datetime模块;想要实现数学运算,可以使用math模块;想要实现加密功能,可以使用hashlib模块;本节我们将对上述模块的基本使用进行介绍。正则表达式是用于匹配字符串中字符组合的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是用来匹配字符串的非常强大的工具,正则表达式主要由普通字符、元字符、重复限定符等组成。普通字符就是大小写字母、数字等,用于匹配自身。正则表达式可以是单个字符、也可以是由上诉字符任意组合形成的字符集合。正则表达式介绍元字符元字符是构造正则表达式的一种基本元素,常用的元字符总结如右表所示。了解了元字符之后,我们就可以开始写一些简单的正则表达式了,如11位手机号码的正则表达式可表示如下:正则表达式介绍重复限定符上述举例的表示手机号的正则表达式有很多重复的元字符“\d”,为了解决这一问题,正则表达式中提供了重复限定符。常用的重复限定符总结如表所示。正则表达式介绍有了上一个表中的重复限定符后,我们之前举例的11位手机号码的正则表达式就可以写成如下的形式:分组
正则表达式中用小括号“()”来做分组,也就是小括号中的内容作为一个整体。因此181号段电话号码的正则表达式可表示如下:正则表达式介绍选择字符还是以手机号码为例,大家都知道,国内的手机号都来自电信、联通、移动三大运营商,而每个运营商提供的号段是不一样的,以电信手机号为例,其号段有199、191、189、181、180、177、173、153和133。此时我们想写电信手机号的正则表达式,就需要用到选择字符或“|”来实现,其正则表达式如下:区间正则表达式中提供中括号“[]”来表示区间条件,如数字0~9可以写成[0-9],字母a~z可以写成[a-z]。需要注意的是字符“^”在区间中不再表示字符串的开始,而是代表排除的意思,即匹配不在区间范围内的字符,如[^6]代表除6以外的字符。正则表达式介绍转义字符在正则表达式中点“.”代表任意字符,而我们需要单纯的使用点“.”这个字符的时候,就需要用到转义字符了。正则表达式中的转义字符就是在特殊字符之前加上反斜杠“\”,将其变为普通字符。比如IP地址(,等)的正则表达式可表示如下:使用re模块实现正则表达式Python中的re模块用于实现正则表达式相关操作,本节主要介绍一些常用属性和方法的使用。re模块常用标志位修饰符re模块具有一些属性用于做为标志位的修饰符,用来控制正则表达式的匹配方式,如不区分大小写、多行匹配等,总结如表所示。使用re模块实现正则表达式re模块常用方法compile()方法:pile()方法是用于优化正则表达式的,可以将正则表达式转化为对象,然后多次调用正则表达式就重复利用这个正则对象,可以实现更有效率的匹配。compile()方法生成的对象需要和match()、search()和findall()等方法搭配使用,单独使用没有意义。compile()方法的使用举例如下:使用re模块实现正则表达式match()方法。match()方法用于从字符串开始位置进行匹配,即匹配以XXX开头的字符串,其基本语法如下:参数说明如表6-5所示。使用re模块实现正则表达式使用match()方法匹配成功会返回一个Match对象,匹配失败返回None,如图所示。上图中的例子,我们使用了标志位修饰符re.I忽略大小写,如将re.I删除,运行结果将返回2个None,如下图所示。使用re模块实现正则表达式search()方法。search()方法用于扫描整个字符串并返回第一个成功的匹配,即匹配第一次出现的XXX,语法格式与match()方法类似。search()方法匹配成功也是返回一个Match对象,匹配失败返回None,如下图所示。使用re模块实现正则表达式从上两图的运行结果可看出match()方法和search()方法的区别,match()方法只匹配以给定正则开始的字符串,而search()方法搜索整个字符串,直到找到一个匹配。match()方法相当于在search()方法的正则表达式最前面加了一个符号“^”。使用match()方法和search()方法匹配成功后返回的Match对象也具有其属性和方法,常用的总结如右表所示。使用re模块实现正则表达式关于Match对象的使用举例如左图所示。使用re模块实现正则表达式
findall()方法。
findall()方法用于在字符串中搜索与给定正则匹配的所有子串,并以列表形式返回,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。findall()方法的语法格式与match()、search()方法类似,不同的是match()、search()方法只匹配一次,findall()方法匹配所有符合条件的子串。
接下来使用一个输入QQ邮箱获取QQ号码的案例来说明findall()方法的使用,如下所示。使用re模块实现正则表达式上诉代码的运行结果如下图所示。使用re模块实现正则表达式sub()方法。sub()方法用于实现字符串的替换,即按照正则规则去寻找被替换的内容,其语法格式如下:参数说明如表所示。使用re模块实现正则表达式sub()方法的使用举例如下所示。上诉代码的运行结果如下图所示。
split()方法。
split()方法用于实现字符串的分割,即将字符串按照正则分割成子串,并以列表的形式返回,其语法格式如下:使用re模块实现正则表达式参数说明如表所示。使用re模块实现正则表达式split()方法的使用举例如下所示。上诉代码的运行结果如下图所示。使用re模块实现正则表达式以上介绍了6个re模块中的常用方法,现将其总结如表所示。日期和时间模块(1)time模块中的时间格式在time模块中时间表现的格式主要有时间戳、时间元组、格式化时间三种。时间戳,即timestamp,表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,适用于做日期运算。时间元组,即struct_time,共有九个元素组,如表所示。time模块格式化时间,即format_time,已格式化的结构使时间更具可读性,包括自定义格式和固定格式。关于格式化时间的相关符号总结如表所示。time模块(2)time模块常用方法time模块的常用方法包括time()、sleep()、localtime()等,现将其总结如表所示。time模块time模块的常用方法使用举例如右所示。datetime模块datatime模块在time模块基础上重新进行了封装,提供更多更多好用的类供我们使用,常用的包括date、time、datetime、timedelta等。datatime模块包含MAXYEAR和MINYEAR两个常量,分别是能表示的最大年份(9999)和最小年份(1)。(1)date类datatime模块中的date类用于表示日期,其主要由year(年)、month(月)及day(日)三部分构成,date对象的格式如下所示:datetime模块date类常用的属性和方法总结如表示。datetime模块date类的使用举例如下所示。datetime模块上诉代码的运行结果如下图所示。(2)time类datatime模块中的time类用于表示时间,其主要由hour(小时)、minute(分钟)、second(秒)、microsecond(毫秒)和tzinfo(时区信息)五部分组成,time对象的格式如下所示:datetime模块time类常用的属性和方法于date类相似,使用举例如右所示。代码的运行结果如下图所示。datetime模块(3)datetime类datatime模块中的datetime类用于表示日期和时间,可以看成是date类和time类的结合,datetime类大部分的方法和属性都继承于date类和time类。datetime对象的格式如下所示:datetime模块datetime类的使用举例如下所示。datetime类中除了继承date类和time类的方法,还有其特有的方法,总结如表所示。datetime模块上诉代码的运行结果如下图所示。datetime模块(4)timedelta类datatime模块中的timedelta类用于做时间运算,一般与date类、datetime类结合使用。timedelta对象的格式如下所示:
timedelta类的使用举例如代码所示。运行结果如下图所示。加密模块与其它常用模块Python中的hashlib模块提供加密的相关操作,包含MD5和SHA加密,支持md5,sha1,sha224,sha256,sha384,sha512等算法。·MD5与SHAMD5全称Message-DigestAlgorithm5,是广泛使用的密码散列函数,能产生128位(16字节)散列值,保障信息传输的完整性与一致性。SHA全称SecureHashAlgorithm,是基于MD5产生的算法家族,包括sha1、sha224、sha256等多种算法。MD5和SHA都是不可逆的摘要算法,原理是通过函数将任意长度数据转换为固定长度的数据串。hashlib模块的使用hashlib模块的使用可分为创建hash对象、更新hash对象和返回摘要三步,其常用属性和方法总结如表所示。hashlib模块的使用hashlib模块的使用举例如下图所示。上诉代码的运行结果如下图所示。其它常用模块总结除了上述介绍的常用标准库模块之外,sys模块、random模块、math模块也经常使用,现将其常用方法、属性总结如表所示。其它常用模块总结其它常用模块总结其中sys模块中的modules.keys()方法用于返回所有已经导入的模块列表,运行效果如下图所示。03基于第三方库的爬虫应用很多编程语言都可以编写爬虫程序,但是使用Python语言编写爬虫无疑是最简单、最合适的,也有很多同学是因为了解爬虫才知道了Python。这一切都要归功于Python的丰富类库,可以方便高效地下载网页和解析网页。·网络爬虫概述
网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。网络爬虫是一种数据采集工具,如我们想对某网站进行分析,那么待分析的数据去哪里获取呢?此时就可以考虑使用网络爬虫进行爬取。网页基础由于网络爬虫主要是爬取网页的数据,那么在学习爬虫之前,首先我们需要先了解网页的基础知识。当我们打开浏览器,在地址栏中输入URL(UniformResourceLocator,统一资源定位器),如输入“”,即可出现百度的首页。我们可以单击键盘上的“F12”打开开发者工具查看,如下图所示。网页基础(1)访问网页的流程从图6-29中我们可看到Request和Response的一些信息,其实从输入URL到我们看到页面,其流程可总结如下:①输入URL。②浏览器给Web服务器发送一个Request。③Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器。④浏览器解析Response中的HTML,这样我们就看到了网页。(2)HTTP协议上述提到的Request和Response是HTTP协议中的请求和响应。HTTP,即HyperTextTransferProtocol,超文本传输协议,是一种基于请求与响应模式的、无状态的应用层协议。HTTP是网页中数据通信的基础,当我们在浏览器键入任何一个URL时,都是在发送一次HTTP请求。网页基础HTTP请求由请求行、请求头和请求正文组成。其中请求正文就是一些发送的数据,请求头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息(如用户标识,主机名等),请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下所示:参数说明如表所示。网页基础HTTP响应与HTTP请求类似,也是由三部分组成,分别是状态行、响应头和响应正文。状态行的格式如下:参数说明如表6-18所示。网页基础通过网页开发者工具查看上述访问百度页面的请求头和响应头信息分别如下图所示。网络爬虫的一般流程熟悉了网页基础知识之后,接下来我们看一下网络爬虫的一般流程。①获取待爬取的URL/URL队列,发送Request。②通过Request获取Response内容(HTML、Json字符串、二进制数据等)。③将得到的Response内容进行解析(使用正则表达式、网页解析库等)。④将解析后的数据进行保存。上述流程简单理解就是第1步和第2步是网页下载,第3步是网页解析,第4步为数据存储。爬虫相关库介绍网络爬虫主要由网页下载、网页解析和数据存储三部分组成。网页下载:Python中可使用标准库的Urllib模块或第三方库Requests,Requests比Urllib更方便高效,本节重点介绍Requests。网页解析:可使用正则表达式或第三方库BeautifulSoup等,正则表达式已在6.2.1介绍,本节主要介绍BeautifulSoup库。数据存储:可使用纯文本、关系型数据库(如MySQL、Oracle、SQLServer等)、非关系型数据库(如MongoDB、Redis等),数据存储部分在7.2介绍。网页下载库Requests介绍
Requests是基于Urllib开发的,使用Apache2Licensed开源协议的HTTP库,Request是一个第三方库,需要使用pip命令进行安装(pipinstallrequests)
(1)Requests库的常用属性/方法Requests库的常用属性/方法总结如表所示。网页下载库Requests介绍(2)Requests库的基本使用Requests的使用很简单,还是以访问百度网页为例,如右图所示。网页下载库Requests介绍上诉代码的运行结果如图所示。网页下载库Requests介绍(3)携带头部信息发送请求在上诉代码中,我们访问的是百度首页,状态码是“200”,代表访问成功,而大多数时候,我们直接访问网页时,会出现403Forbidden,代表访问被拒绝,如右图所示。出现右图这种错误的原因是,该网页进行了反爬虫设置,此时如果想要成功访问此网页,可以通过模拟浏览器的头部信息“User-Agent”来实现。“User-Agent”信息可以在开发者工具中查看,如下图所示。网页下载库Requests介绍网页下载库Requests介绍接下来我们携带头部信息,再一次访问知乎首页,如下图所示。网页下载库Requests介绍上诉代码的运行结果如下图所示。BeautifulSoup介绍网页解析库BeautifulSoup介绍BeautifulSoup是一个解析HTML/XML文件的第三方库,主要用于从HTML/XML文件中提取数据,其提供一些简单的函数来处理导航、搜索、修改分析树等功能。使用BeautifulSoup时不需要考虑编码方式,它会自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。BeautifulSoup介绍(1)BeautifulSoup库的导入BeautifulSoup3目前已经停止开发,现在项目中使用的是BeautifulSoup4(可以使用命令“pipinstallbeautifulsoup4”进行安装),不过它已经被移植到bs4中,也就是说导入时直接使用“importBeautifulSoup”会报错,需要使用语句“frombs4importBeautifulSoup”进行导入,如下图所示。BeautifulSoup介绍(2)BeautifulSoup解析器BeautifulSoup在解析时依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器,总结如表所示。BeautifulSoup介绍(3)BeautifulSoup的基本使用由于BeautifulSoup库是用于解析HTML文件的,所以为了演示BeautifulSoup的使用,我们首先新建一个简单的HTML文件test.html,如下图所示。BeautifulSoup介绍BeautifulSoup4能将复杂HTML文档转换为复杂树形结构,其中每个节点都是Python对象,这些对象可归纳为Tag、NavigableString、BeautifulSoup和Comment这四种。Tag:可简单理解为HTML标签,能通过BeautifulSoup对象加标签名获取,但这种方式查找的是所有内容中第一个符合要求的标签。NavigableString:是标签的内容,通过“.string”可获取。BeautifulSoup对象:代表文档的全部内容,可看作特殊的Tag。Comment对象:代表注释内容,是特殊类型的NavigableString,输出内容时不包含注释符号,解析含注释内容的文件时使用前最好先做判断。BeautifulSoup介绍接下来对对上述test.html文件进行解析,如右图所示。代码的运行结果如下图所示。BeautifulSoup介绍我们可以使用type()方法查看Tag、NavigableString、BeautifulSoup和Comment的具体类型,如右图所示。BeautifulSoup介绍(4)BeautifulSoup遍历文档树常用属性/方法在使用BeautifulSoup遍历文档树时,可以获取父节点、子节点、兄弟节点等,相关属性/方法总结如表所示。案例【案例描述】近年来电影产业迅速发展,电影已成为艺术与娱乐的载体,与电影相关的数据越来越多,豆瓣作为中国最大的电影分享与评论社区,收录了百万条影片和影人的资料,记录千万影迷的观影感受,可为观影提供决策。【案例要求】本案例主要目的是获取豆瓣Top250电影,共有10页,首先获取每页网页链接要求爬取每部电影的中文名称、评分、评分人数和导演、主演等相关信息,如下图所示。案例本章回顾1.【多选】模块的导入方式有()。A.import语句B.from…import语句C.from…import*语句 D.import…in语句2.【多选】关于模块的描述正确的有()。A.模块就是一个包含了许多功能/方法的文件B.每一个.py文件都可以被当成是一个模块C.模块可以包含直接运行的代码块、类、函数或这几种的组合D.可以使用“from…import*语句”导入一个模块的所有内容3.【多选】关于模块、包和库的描述,以下正确的有()。A.库是为了方便管理与安装,将能够实现某一功能的模块和包封装而成的集合B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农产品采购承揽合同三篇
- 消防器材使用培训
- 如何提升仓库作业的精准度计划
- 模具餐盘课程设计案例
- 画室创意课课程设计
- 火山农业科技园电力供应设施工程合同三篇
- 团队协作与沟通在运营中的关键培训
- 企业社会责任与工作计划的结合
- 编译原理课程设计理工
- 桥梁工程课程设计验算
- 2024年浙江杭州西湖区投资促进局招聘编外合同制工作人员1人历年(高频重点提升专题训练)共500题附带答案详解
- HYT 0301-2021 海洋观测数据格式(正式版)
- 2024四川省招聘社区工作者试题完整
- 黑龙江鸡西市(2024年)小学语文部编版小升初真题(疯狂进步)完整试卷(含答案)
- 风温肺热病护理查房
- 2024年中考语文复习专题21:叙事性散文阅读(六)含答案
- 2023-2024学年山东省泰安市新泰市八年级(上)期中数学试卷(五四学制)
- 儿科重点专科汇报
- 工艺流程专题复习市公开课一等奖省赛课微课金奖课件
- 《建筑与装饰工程BIM计量》复习备考试题库(含答案)
- 2023年驾驶员酒精测试记录表
评论
0/150
提交评论