深入浅出Python编程课件-面向对象程序设计_第1页
深入浅出Python编程课件-面向对象程序设计_第2页
深入浅出Python编程课件-面向对象程序设计_第3页
深入浅出Python编程课件-面向对象程序设计_第4页
深入浅出Python编程课件-面向对象程序设计_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深入浅出Python编程

面向对象程序设计)采集网络图书数据

从当当网和豆瓣网查询图书信息将当当网查询的图书信息解析并以字典形式存入文件将豆瓣网查询的图书信息解析并以文本的形式存入文件Outcome单元目标/Objectives理解面向对象程序设计思想

掌握面向对象编程的三大特性

熟练掌握Python类和对象的基本使用

理解类成员和实例成员的区别

掌握简单网络爬虫应用⑥具有良好的职业道德和法治意识内容及计划/Agenda&Schedule12/6ClassHoursDetails专科应用本科<00:10><00:10>回顾&成果介绍<01:20><00:40>了解面向对象程序设计<01:20><00:40>类的派生:编写爬虫基类<02:05><01:05>检索并爬取当当网图书数据<01:20><00:40>了解正则表达式<01:40><00:40>检索并爬取豆瓣网图书数据<00:05><00:05>课堂小结Total:12/6hours(8/4hPractice)01图书数据采集webcrawler1.任务分析目标解构采集数据:发起网络访问请求,并获得网站返回的响应网页HTML文件。解析数据:对拿到的网页文件进行分析、解析,找到包含所需数据的HTML节点。清理数据:对提取的数据按规范的存储要求进行查漏补缺,统一格式要求。保存数据:将最终的数据保存到文件或数据库。模式识别JSON和TEXT格式的数据文件。提取书名、作者和出版社等三项数据。1.任务分析模式归纳采集数据主要是发起HTTP网络访问请求。解析数据要从网页HTML文件中提取包含所需数据的节点,并从中拿到数据项,这需要对HTMLDOC结构进行操作;清理数据是按规范格式整理数据。保存数据只涉及到文件的写入操作。算法设计OOP编程:将相同的需求抽象出来封装到基类,将相似但有不相同的需求分别由不同的子类来实现。requests第三方模块发起访问请求。BeautifulSoup和正则表达式。2.任务准备requests模块模拟访问Web服务器、自动提交网络请求一般,爬虫的时候通过设置User-Agent+Referer伪装成浏览器去访问网页也是绕过反爬虫的一种手段beautifulsoup4模块从HTML或XML文件中提取数据支持Python标准库中的HTML解析器(html.parser),还支持一些第三方的解析器,包括lxml解析器、html5lib解析器等2.任务准备什么是HTML文档<HTML>:通知客户端浏览器这是一个HTML文档,需要浏览器用HTML格式解释它,直到文件尾部的</HTML>。<HEAD>:文档的起始部分,主要是用来描述文档的一些基本性质,不会被当成网页的主体显示在浏览器中。<BODY>:文档的内容部分,显示在浏览器中。<!DOCTYPEhtml><html></html><head></head></body><body><title>Python编程

</title><metacharset=‘uft-8’/><p>这是正文里的一个段落</p><html><body><h1><p>02认识类和对象Class&Object1.了解面向对象编程面向对象程序设计(Object-OrientedProgramming,OOP):一种基于“对象(objects)”概念的编程范式一种基于“对象(objects)”概念的编程范式包含数据/data和代码/code:字段(fields)形式的数据,通常称为特性(attributes)或属性(properties)。过程(procedures)形式的代码,通常称为方法(methods)。1.了解面向对象编程类是模板,对象是根据模板创建的特定实例类(class)是一个抽象概念,是一系列具有相同特征和行为的事物的统称;对象(object)作为内存区域,可包含任意数量和类型的数据并由标识符引用。1.了解面向对象编程面向对象编程的三大特性封装(encapsulation):封装=数据+代码;类=变量+方法继承(inheritance):派生类/子类自动拥有其父类的所有属性和方法多态(polymorphism):纵向上来看,依赖于继承;横向上看,依赖于接口(interface)。2.类的创建与实例化—

实例成员Python创建一个类要用到关键字class,语法格式如下:2.类的创建与实例化—

实例成员Python创建一个类要用到关键字class,语法格式如下:创建一个对象的语法格式如下:2.类的创建与实例化—

实例成员类的实例之间互补干扰self__str()__方法可以得到实例对象的地址2.类的创建与实例化—

实例成员Python允许动态地为类和对象增加成员实例对象动态创建的属性只对该实例对象有效,对同一类的其它对象是没有影响的2.类的创建与实例化—

类的成员类的成员属性相同类的实例对象都能共享一个在“类层面的全局变量”3.成员的访问控制—

名称中的下划线Python虽然没有严格的私有成员概念,但通过对使用下划线“_”、双下划线“__”命名的约定,对成员属性和成员方法的“可见”性有其专门含义前置单下划线,_var:命名约定,供内部使用/受保护,对python解释器没作用。后置单下划线,var_:命名约定,规避与Python关键字名字的冲突。前置双下划线,__var:类中使用触发名称改写(namemangling),对python解释器有作用。前后双下划线,__var__:Python定义的特殊方法,自定义的属性中要避免使用。仅单下划线,_:临时的、无关紧要的。3.成员的访问控制—

名称中的下划线访问限制-私有变量3.成员的访问控制—

添加属性访问限制-方法封装类的设计中定义变量为私有,然后再为该变量编写两个成员函数分别用于读和写。3.成员的访问控制—

添加属性访问限制-属性读装饰器:@property写装饰器:@属性名.setter。3.成员的访问控制—

添加属性最佳实践一旦我们决定使用属性,那就在所有的地方都要去使用属性。python_beginner._Book__price名称改写的方式直接访问私有变量,但并不推荐这么做编写类的属性4.特殊的类和方法—

类方法与类的属性相似,类也可以拥有方法:使用装饰器@classmethod修饰,可以通过类名调用类方法,也可以通过对象名调用类方法。实例对象方法第一个参数为self,而类方法第一个参数必须是当前的类自身,一般命名为cls。4.特殊的类和方法—

静态方法类的静态方法主要用于类对外部函数的封装,有助于整合代码,集成通用性的外部函数到类中。使用装饰器@staticmethod修饰,不需要传入默认参数/self&cls。既不能访问实例对象的属性和方法,也无法访问类的属性和方法。对象(object)和类(class)都可以调用静态方法4.特殊的类和方法—

静态方法4.特殊的类和方法—

模型类模型类(modelclass):自定义数据结构来装载数据只关注类的属性,不在意类的方法。一个“空类”,它将一些命名的数据项捆绑在一起。4.特殊的类和方法—

模型类图书信息Book模型类book.py编写Book模型类03编写爬虫基类Crawler1.编写爬虫基类—

编写基类Crawlercrawler.py抽象出对当当和豆瓣网的爬虫操作共性部分都需要知道图书的名字/book_name存储爬取书籍信息列表/book_data爬取数据后都需要保存到文件中去/save_book1.编写爬虫基类—

编写基类Crawler将每一个Book实例对象写入一个txt文件中,并对每一个写入对象做了计数,我们称之为对象的序列化(serialization)析构函数:__del__(self)1.编写爬虫基类—

改写父类的方法派生子类或者说派生类继承了基类/父类的方法后可以直接使用,也可以修改。既可以在继承的基础新增功能,也可以重写父类方法,实现与父类完全不同的功能。直接打印一个实例对象时会输出该对象的地址,但如果想自定义输出内容,就可以通过改写父类object的__str__()方法来实现。1.编写爬虫基类—

改写父类的方法改写Crawler类的save_book()方法Book类自带格式化的输出,那么Crawler类中将Book的实例对象写入文件时就可以直接写入对象了,我们再改写一下Crawler类的save_book()方法。1.编写爬虫基类—

调用父类的方法编写子类:继承自Crawler类classDerivedClassName(modname.BaseClassName):1.编写爬虫基类—

调用父类的方法如果要在子类中直接引用父类的方法:使用super()方法;或者BaseClassName.methodname(self,arguments)04检索并爬取当当网图书DangDang1.爬取并解析HTML数据get查询:search_book(self)方法super()完成了父类的初始化使用模块:requests.get()伪装成浏览器的访问/User-Agent属性中文乱码:返回值encoding='gbk‘安全编码:访问网络的代码置入异常子句1.爬取并解析HTML数据HTMLDOM分析所有的图书查询结果都包含在一个<ul></ul>标签对中每本图书的信息包含在<ul>包含的<li></li>标签对中class="bigimg"id="component_59"1.爬取并解析HTML数据BeautifulSoup+html.parser2.JSON格式保存数据如何让Python知道我们自己定义的对象与JSON对象之间的转换映射关系json模块的JSONEncoder类用于Python数据结构的可扩展JSON编码器改写json.JSONEncoder类的default(self,obj)成员方法来实现BookEncoder类创建了一个BookEncoder的新类,该类继承自json.JSONEncoder类,并在子类中改写了default()成员方法2.JSON格式保存数据改写父类Crawler类中的save_book()成员方法识别自定义类型Book:cls=BookEncoder中文不乱码:ensure_ascii=False从当当网检索并解析结果,将数据以JSON格式形式存入文件05检索并爬取豆瓣网图书Douban1.了解正则表达式—

模式定义正则表达式(regularexpression)是一种描述字符串模式结构的方法,将模式(pattern)与字符序列(string)进行匹配。所谓模式也是一个字符串,它由一些普通字符和正则表达式元字符(metacharacters)组成,用于与字符串匹配,完成“查找和替换”。正则表达式元字符(metacharacters)重复它们或改变它们的含义来影响正则的其他部分。常见的如右表所示。1.了解正则表达式—

模式定义1.了解正则表达式—

模式定义1.了解正则表达式—

模式定义特殊的正则表达式序列由于字符*、+、?等在正则表达式中有特殊的含义,因此它们不能用来匹配相应的普通字符。为了匹配有特殊含义的字符,必须使用转义序列“\”,比如:\.\?,就表示“.?”除了作为转义序列符使用,还可以表示一些特殊序列,见左表1.了解正则表达式—

字符匹配re模块还为我们提供了多个函数用于匹配、搜索以及找出匹配对象和值match():从字符串开头去匹配并返回匹配的字符串的match对象,可以调用对象的group()方法获取匹配成功的字符串;search():并不局限于字符串的开头,扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象(matchobjects);findall():以字符串列表或字符串元组列表的形式返回所有非重叠匹配。1.了解正则表达式—

字符匹配匹配邮箱re模块的search()函数会去扫描整个字符串,如果匹配成功的话就会返回一个匹配对象(matchobjects),要获取匹配到的值,可以只用匹配对象的group()方法。海象运算符:=赋值表达式(assignmentexpressions),将赋值操作和条件判断合二为一。1.了解正则表达式—

字符替换修改字符串split():将字符串拆分为一个列表,在正则匹配的任何地方将其拆分。sub():找到正则匹配的所有子字符串,并用不同的字符串替换它们。subn():与sub()相同,但返回新字符串和替换次数。2.使用正则表达式解析数据爬取检索结果super()调用父类的构造函数完成了初始化⑤伪造了一个HTTP请求的header⑨查询参数装入了一个字典对象search_key⑫“1001”表示为图书分类;“q”为查询的参数2.使用正则表达式解析数据解析网页

书:<divclass="content">……</div>数据:<divclass=“title”>子标签中:书名:<a>标签作者及出版社:<divclass="rating-info">2.使用正则表达式解析数据2.使用正则表达式解析数据爬取豆瓣网图书信息课堂小结Python支持面向对象编程(OOP)的所有标准特性。封装、继承和多态是面向对象编程中(OOP)其重要的三大特性。使用类(class),可以将数据及数据的操作组织到一起,从而可以创造一个可复用的组件(components)。Python中一切皆对象,类是模板、对象是实例。提问&解答深入浅出Python编程

(模块6Web应用程序设计)用Flask开发系统监控看板应用

按国旗法要求的标准制法画国旗显示辅助线、体现绘制过程右下角加文字:我爱中国五角星画法在非Window平台下正常显示Outcome单元目标/Objectives理解Web应用程序的工作原理

理解HTTP的请求/request和响应/response

了解MVC架构模式并编写代码

了解RESTWeb服务编程/API

掌握Flask框架开发简单Web程序⑥具有追求卓越的工匠精神内容及计划/Agenda&Schedule6ClassHoursDetails<00:10>回顾&成果介绍<00:25>了解三层结构的FlaskWeb应用程序<01:20>开发三层架构的监控看板Web应用<00:40>了解MVC架构的FlaskWeb应用<01:20>开发前后端分离的监控看板Web应用<00:05>课堂小结Total:6hours(4hPractice)01系统监控看板monitor1.任务分析目标解构一是,前端UI(UserInterface,用户接口),也就是直接和用户面对面的网页界面,它将用于呈现CPU和内存的占用率等信息。二是,后台的数据,这里主要是要获取计算机的CPU和内存的占用率,以及内存的消耗数据。三是,中间层(业务逻辑层),主要是将从后台获取的数据转化成相应的图表。模式识别图表可以使用之前学习过的pyecharts模块、页面布局可以使用BootStrap库。后台的数据获取比较简单,可以使用学习过的psutil模块来实现。中间业务逻辑层编写代码的重点,需要使用获取到的数据创建仪表盘图和折线图;对于前后的分离的结构,可以使用Ajax进行调研。1.任务分析模式归纳Web应用的核心:一个是客户端(Browser)和Web服务器端(WebServer)之间的HTTP访问(request)和响应(response);另一个是Web服务器和应用服务器(ApplicationServer)之间的通信处理。算法设计前端UI借助BootStrap来解决页面布局、色彩搭配等问题,且不需要太专业的前端知识;pyecharts可以方便的创建仪表盘图和折线图等漂亮图表。Python的Flask框架可以大大简化Web开发难度/不用写CGI。2.任务准备Flask框架——依赖于:WerkzeugWSGI(WebServerGatewayInterface,Web服务器网关接口,读作“wiz-ghee”)套件,为Flask框架提供了一个和Web服务器通信的底层库。Jinja模板引擎,为客户端展现提供了模板渲染引擎,编写类似于Python语法的代码,然后传递模板数据以呈现最终网页文档,也就是视图的渲染。目前,使用的是Jinja2版本。2.任务准备BootStrap一个基于HTML+CSS+JavaScript开发的用于快速开发Web应用程序和网站的前端框架,它包含了功能强大的内置组件,且易于定制,其响应式(Responsive)CSS能够自适应于台式机、平板电脑和手机的屏幕大小,为开发人员创建前端UI提供了一个简洁统一的解决方案。Ajax(AsynchronousJavaScriptAndXML,异步JavaScript和XML)异步操作是相对应同步(Synchronous)而言的,Ajax允许通过在后台与Web服务器交换数据来异步更新网页。02开发三层架构的监控看板Web应用WebApplication1.了解三层结构的Web应用程序表示层:向用户显示信息并从用户那里收集信息。Web表示层通常使用HTML、CSS和JavaScript开发。应用层:也称为逻辑层或中间层(BLL,BusinessLogicLayer),使用Python等开发,并使用API调用与数据层进行通信。数据层:也称为数据访问层(DAL,DataAccessLayer)是存储和管理应用程序处理的信息的位置。简单的理解:表示层提供用户界面,应用层处理用户输入输出的业务逻辑,而数据层存储数据。2.创建FlaskWeb应用程序Flask是基于Werkzeug实现的WSGI工具包和Jinja2模板引擎,借助于Werkzeug和Jinja2,我们可以在更抽象的层面编写复杂的Web应用,利用PythonWeb框架,Web的开发也变得更简单。静态文件可以直接交由Web服务器处理。2.创建FlaskWeb应用程序—

路由和视图函数一个完整的FlaskWeb应用一般会包含:一个应用实例对象、一个路由和一个视图函数。Flask实例对象所有FlaskWeb应用都需要创建一个Flask实例对象,她以主模块名或包的名称为参数构建Flask实例,一般__name__变量就是所需的值。app.route()装饰器来定义路由Flask框架中维持了一个URL与Python函数之间的一个映射关系,称之为路由(route),对应的处理函数就是视图函数。2.创建FlaskWeb应用程序—

路由和视图函数创建Flask实例:app=Flask(__name__)@app.route()装饰器将首页的访问URL与视图函数index()绑定http://xxx.x.x.x:5000/或者http://xx.x.x.x:5000/home,都能访问“debug=False”:表明Flask应用是在调试模式下运行,在该模式下,服务器会加载重载器(reloader)和调试器(debugger),重载器会监视项目中的所有源代码文件,发现有修改的话会自动重启服务器启动APP:Runningonhttp://xx.x.x.x:50002.创建FlaskWeb应用程序—

请求/响应循环的参数传递动态路由传递参数是@app.route()装饰器中的一种特殊句法,调用视图函数时,Flask会将动态部分作为关键字参数传递给视图函数。可以通过使用<converter:variable_name>为变量增加一个转换器,它为参数指定了数据类型。2.创建FlaskWeb应用程序—

请求/响应循环的参数传递动态路由传递参数http://xx.x.x.x:5000/user/caowen2.创建FlaskWeb应用程序—

请求/响应循环的参数传递应用和请求上下文传参应用上下文(ApplicationContext):跟踪应用程序级数据,应用程序application可以简单的理解为创建Flask实例对象“app=Flask(__name__)”时创建的这个app对象。应用上下文中存储的值作用于整个Web应用程序,它并不直接将值传递给每个视图函数,而是访问current_app和g代理,Flask在处理请求时自动推送应用程序上下文,它指向处理当前活动的app。请求上下文(RequestContexts):保存了客户端和服务器交互的数据,常见的请求上下文对象有:封装了HTTP请求的request、记录请求会话信息的session等,request主要针对的是http的请求,session主要针对的是用户。2.创建FlaskWeb应用程序—

请求/响应循环的参数传递应用和请求上下文传参http://xxx.x.x.x:5000/user/?name=caowen编写一个简单的Flask应用,分别使用动态路由和上下文请求实现参数传递2.创建FlaskWeb应用程序—

使用模版美化视图Jinja模板引擎

{%...%}:流程控制语句

{{...}}:表达式值

{#...#}:注释2.创建FlaskWeb应用程序—

使用模版美化视图flask_psutil/templates/user_info.html3.使用模版继承自定义404页面使用宏(macro)复用代码创建宏:一对“{%macro……%}”和“{%endmacro%}”标签定义一个宏。调用宏:使用“{{……}}”或者“{{callmacro_name()}}”和“{{endcall}}”调用宏。3.使用模版继承自定义404页面render_template()函数渲染user_card.html模板,并传递参数:user_info=user3.使用模版继承自定义404页面模板块(block)—Jinja模板继承网站各页面的共性部分,定义成块(blocks),也就是一些占位符(placeholders),子模板可以覆盖。定义块:{%block<block_name>%}{%endblock%}。继承块:{%extends<base_temp>%}子模块中调用父模块:{{super()}}404基模块base.html的基模板文件3.使用模版继承自定义404页面继承自父模板:base.html覆盖:title和content模块部分3.使用模版继承自定义404页面编写自定义404页面4.创建监控看板Web应用APP监视器Web应用的分层结构数据层:创建model.py代码文件,创建Computer类,CPU和内存占用率数据由该类代码来获取。表示层:创建view.py代码文件,创建View类,结合pyecharts模块构建前端的两个图表,数据从数据层代码classComputer来获取。客户端模板的渲染代码pyecharts官网已经帮我们实现了,所以不需要再写宏(macro),本节案例中也暂时不需要BootStrap,在下一小节对该案例进行迭代升级时将会用到。应用层:创建monitor_web.py代码文件,创建Flask应用实例对象,处理HTTP访问请求和路由分发、试图函数处理等。4.创建监控看板Web应用APP—

CPU占用率折线图model.pyComputer类(class)来封装对CPU和内存数据的获取功能。折线图中,CPU占用率横轴(X轴)数据是时间,纵轴(Y轴)数据是比例值,因此,我们使用一个字典来存储取到的CPU占用率数据,字典的key为时间,字典的value为占用率,且只保留最近10项。memory()用@staticmethod装饰器将其定义为一个类的静态方法,实际上成为了一个工具函数。4.创建监控看板Web应用APP—

CPU占用率折线图view.py从Computer类获取CPU占用率数据集。创建并配置eCharts的折线图Line()。为了减少运行环境对网络的依赖,将图表显示所需的前端JS文件echarts.min.js部署到本地“/static/js/”文件夹中,所以在折线图的构造函数中通过配置参数“js_host”进行了指定。4.创建监控看板Web应用APP—

CPU占用率折线图monitor_web.py多种路由接收首页,且直接转向到CPU占用率视图。url_for()函数除了在前端模板中用于动态加载静态文件外,还能根据视图函数名称得到要转向的URL。Markup()函数对HTML进行安全标记。HTTP请求的不同方法(HTTPrequestmethods)GET:获取资源,可以理解为读取或者下载数据,使用GET的请求应仅检索数据。POST:向资源提交数据,用于使用HTML表单将数据发送到服务器,相当于写入或上传数据。4.创建监控看板Web应用APP—

CPU占用率折线图访问URL:http://xxx.x.x.x:5000http://xxx.x.x.x:5000/cpu测试:每发起一次请求只能获得当时时间节点的数据,但系统并不会自动更新,需要手动刷新浏览器才能看到新的数据。创建CPU占用率折线图4.创建监控看板Web应用APP—

内存占用率仪表盘图ClassView类:添加memory_gauge(self)成员函数。除了返回仪表盘图,还返回内存占用率具体数据。4.创建监控看板Web应用APP—

内存占用率仪表盘图monitor_web.py:memo()函数只响应HTTP请求的GET方法。这里只需要显示图表、不需要数据,所以案例中丢弃了从View类memory_gauge()成员函数中传递过来的内存详情数据。创建内存占用率仪表盘图03开发前后端分离的监控看板Web应用AjaxWeb1.了解MVC架构的Web应用模型层/Model包含与应用程序相关的数据,一般通过模型层直接与数据库服务器进行通信,但不处理有关如何呈现数据的任何逻辑。视图层/View用于向用户显示模型的数据,View元素处理如何与模型的数据链接,但不提供用户如何使用这些数据的任何逻辑。控制层/Cotroller位于模型和视图层之间,是MVC架构模式中的“司令部”,它侦听视图中触发的所有事件和操作(需要用哪一个模型来处理),并对事件执行适当的响应(需要用哪一个视图来显示)。2.开发应用程序编程接口API在B/S结构中,可以把对服务器端请求的数据、文件等都看成是资源,且每一个资源都有一个URI(UniformResourceIdentifier,统一资源标识符),在前后的分离的开发中,服务器端不再向客户端发送解析之后的HTML文件,而只发送客户端需要的数据/JSON。3.创建前后端分离的监控看板flask_psutil/static/文件夹用于存储静态资源文件,里面又包含了css、js和images等3个子文件夹,用于存放图片、js文件等。flask_psutil/templates/目录存放的是模板文件,这里既有pyecharts模块用到HTML文件,也有本案例将要用的base.html和index.html两个前端文件。三个Python代码文件,包括模型层的model.py、视图层的view.py,以及控制层的monitor_api.py。3.创建前后端分离的监控看板—

模型层(model)开发模型层(model)模型层为用户准备好后端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论