版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Beautifulsoup4库的使用——网络爬虫库的应用《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。
书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录Beautifulsoup4的安装和简介Beautifulsoup4的使用和示范Beautifulsoup4的安装和简介01Beautifulsoup4的简介BeautifulSoup4(简称BS4)是一个Python库,专门用于从HTML和XML文档中提取数据。虽然requests库可以获取网页内容。比如,requests的局限性只能获取原始文本,requests获取的response.text是完整的HTML文档字符串,无法直接定位和提取特定元素的内容。要高效提取其中的结构化数据,BeautifulSoup4几乎是必不可少的工具Beautifulsoup4的简介HTML文档本身是结构化的文本,有一定的规则,通过它的结构可以简化信息提取。于是,就有了lxml、pyquery、BeautifulSoup等网页信息提取库。一般我们会用这些库来提取网页信息。lxml有很高的解析效率,支持xPath语法(一种可以在HTML中查找信息的规则语法);pyquery得名于jQuery(知名的前端js库),可以用类似jQuery的语法解析网页。BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautifulsoup4的解析器解析器特点安装方式lxml速度快,容错能力强pipinstalllxmlhtml.parserPython内置,无需额外安装无需安装html5lib容错性最好,速度最慢pipinstallhtml5libBeautifulsoup4的安装BeautifulSoup会帮你节省很多的工作时间。它的安装方法很简单,可以直接使用PIP进行安装:
要注意,包名是beautifulsoup4。如果不加上4,会是老版本,它是为了兼容性而存在,目前已不推荐使用。有关它的更多介绍请访问网站https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/或者/software/BeautifulSoup/。#从国外镜像安装pipinstallbeautifulsoup4#从国内清华镜像源安装pipinstallbeautifulsoup4-i/pypi/web/simpleBeautifulsoup4的安装安装解析器安装解析器是beautifulsoup4应用中很重要的一部分。beautifulsoup4支持Python标准库中的HTML解析器,还支持一些第三方的解析器,比如lxml和html5lib。推荐使用lxml作为解析器,因为它的效率更高。它的安装方法很简单,可以直接使用PIP进行安装:#从国外镜像安装pipinstalllxmlpipinstallhtml5libBeautifulSoup4的常用方法方法/属性描述返回类型初始化BeautifulSoup(html,'parser')创建BeautifulSoup对象BeautifulSoup查找元素find(name,attrs,recursive,string,**kwargs)查找第一个匹配元素Tag/Nonefind_all(name,attrs,recursive,string,limit,**kwargs)查找所有匹配元素ResultSetselect(css_selector)CSS选择器查找listselect_one(css_selector)CSS选择器查找单个元素Tag/NoneBeautifulSoup4的常用方法方法/属性描述返回类型导航.parent父节点PageElement.parents所有祖先节点generator.next_sibling下一个兄弟节点PageElement.previous_sibling上一个兄弟节点PageElement.contents直接子节点列表list.children直接子节点迭代器generator.descendants所有后代节点迭代器generatorBeautifulSoup4的常用方法方法/属性描述返回类型提取内容.text
/
.get_text()获取元素所有文本内容str.string获取单个字符串内容NavigableString.strings获取所有字符串内容生成器generator.stripped_strings获取去除空白的字符串生成器generator属性操作['attr']
/
.get('attr')获取属性值str.attrs获取所有属性字典dict.has_attr('attr')检查是否有某属性bool详细使用示例——基本用法frombs4importBeautifulSoupimportrequests#获取网页内容url=""response=requests.get(url)html=response.text#创建BeautifulSoup对象soup=BeautifulSoup(html,'lxml')#推荐使用lxml解析器#获取标题title=soup.title.textprint(f"网页标题:{title}")#获取所有链接links=[a['href']forainsoup.find_all('a',href=True)]print(f"前5个链接:{links[:5]}")详细使用示例——查找元素#查找第一个div元素first_div=soup.find('div')print(first_div)#查找class为'header'的所有元素headers=soup.find_all(class_='header')print(f"找到{len(headers)}个header元素")#查找id为'main'的divmain_div=soup.find('div',id='main')print(main_div)#使用CSS选择器articles=soup.select('div.article')#选择所有class为article的divtitles=[h2.textforh2insoup.select('h2.title')]#选择所有class为title的h2详细使用示例——导航文档树#获取父元素parent=first_div.parentprint(f"父元素标签名:{}")#遍历子元素print("直接子元素:")forchildinfirst_div.children:if:#过滤掉字符串节点
print()#遍历所有后代元素print("\n所有后代元素标签:")fordescendantinfirst_div.descendants:ifhasattr(descendant,'name'):print()详细使用示例——提取内容#获取元素文本print(first_div.get_text())#获取去除空白的文本clean_text=''.join(first_div.stripped_strings)print(clean_text)#获取特定属性iffirst_div.has_attr('class'):print(f"div的class:{first_div['class']}")#获取所有属性print(f"div的所有属性:{first_div.attrs}")总结BeautifulSoup4提供了强大而灵活的方式来解析和提取HTML/XML文档中的数据。通过掌握其核心方法,你可以轻松应对各种网页抓取需求。关键点包括:选择合适的解析器(推荐lxml)灵活使用find/find_all和CSS选择器熟悉文档树的导航方法正确处理文本和属性提取结合requests或其他HTTP库使用对于更复杂的爬虫项目,可以考虑将BeautifulSoup4与Scrapy或其他框架结合使用,但BeautifulSoup4因其简单易用,仍然是大多数Python爬虫开发者的首选工具。Beautifulsoup4的使用和示范01范例11-6使用beautifulsoup4进行简单的网页解析有一段百度新闻首页的源代码,通过beautifulsoup4解析,把一些信息提取出来。因为HTML源代码比较复杂,这里使用了三引号把源代码引用。调用了lxml解析器。frombs4importBeautifulSoup#一段HTML代码baiduhtml="""<htmlclass="expanded"><head><!--STATUSOK--><metahttp-equiv=Content-Typecontent="text/html;charset=utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=Edge,chrome=1"><metacharset="utf-8"/><title>百度新闻——海量中文资讯平台</title><metaname="description"content="百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点。您可以搜索新闻事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。">"""范例11-6使用beautifulsoup4进行简单的网页解析#创建BeautifulSoup对象soup=BeautifulSoup(baiduhtml,'lxml')#获取title的整个标签和它的文字内容print('01:',soup.title,soup.title.string)#获取指定标签,获取指定标签里面的内容print('02:',soup('title'),soup('title')[0].string)#获取指定标签也可以写成这样#获取meta标签的指定内容或者首次出现整个meta标签print('03:',soup.meta.get('content'))#获取指定标签的属性print('04:',soup.meta)#获取第一个标签(多个只取第一个)print('05:',soup.find('meta'))#获取第一个标签,结果和上面一样#获取指定属性的meta标签和它的属性内容print('06:',soup.find('meta',attrs={'name':'description'}))#获取第一个标签,根据属性过滤获取print('07:',soup.find('meta',attrs={'name':'description'}).get('content'))#通过get()可以指定属性获取内容范例11-6使用beautifulsoup4进行简单的网页解析它的结果如下01:<title>百度新闻——海量中文资讯平台</title>百度新闻——海量中文资讯平台02:[<title>百度新闻——海量中文资讯平台</title>]百度新闻——海量中文资讯平台03:text/html;charset=utf-804:<metacontent="text/html;charset=utf-8"http-equiv="Content-Type"/>05:<metacontent="text/html;charset=utf-8"http-equiv="Content-Type"/>06:<metacontent="百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点。您可以搜索新闻事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。"name="description"/>07:百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点。您可以搜索新闻事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。以上代码范例直接解析指定的标签,或者根据标签的属性参数进行解析。比如:soup.meta即是获取获取第一个meta标签。soup.meta.get('content')即是获取meta标签中的属性content。soup.find('meta',attrs={'name':'description'})是调用find()的方法,它可以输入详细的参数。soup.find('meta',attrs={'name':'description'}).get('content')调用了find()的方法,再调用get()指定某一个属性,可以获取指定属性的内容。比如这里就获取了content属性的内容。范例11-7使用beautifulsoup4的select()抓取导航有一段百度新闻首页的源代码,通过beautifulsoup4的select()方法把网站的导航URL和导航文字解析出来。在BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag。frombs4importBeautifulSouphtmlstr="""<divid="channel-all"class="channel-allclearfix"><divclass="menu-list"><ulclass="clearfix"><liclass="navitem-indexcurrentactive"><ahref="/">首页</a></li><li><ahref="/guonei">国内</a></li><li><ahref="/guoji">国际</a></li><li><ahref="/mil">军事</a></li><li><ahref="/finance">财经</a></li><li><ahref="/ent">娱乐</a></li><li><ahref="/sports">体育</a></li><li><ahref="/internet">互联网</a></li><li><ahref="/tech">科技</a></li><li><ahref="/game">游戏</a></li><li><ahref="/lady">女人</a></li><li><ahref="/auto">汽车</a></li><li><ahref="/house">房产</a></li></ul></div><iclass="slogan"></i></div>"""范例11-7使用beautifulsoup4的select()抓取导航有一段百度新闻首页的源代码,通过beautifulsoup4的select()方法把网站的导航URL和导航文字解析出来。在BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag。#创建BeautifulSoup对象soup=BeautifulSoup(htmlstr,'lxml')print('抓取导航,实现方法1')foriteminsoup.select('div#channel-alla'):print(item.get('href'),item.string)#print('抓取导航,实现方法2')#foriteminsoup.select('ul.clearfixa'):#print(item.get('href'),item.string)通过观察可以发现整个导航代码都在标签id="channel-all"的div中,这一个div下面出现了a标签,它里面有导航的URL和导航的文字。通过遍历循环soup.select('div#channel-alla')的方法可以找到a标签。找到a标签后,再通过get()指定href属性可以获取它的URL,再通过string方法可以直接获取它的内容,即a标签中的导航文字。范例11-7使用beautifulsoup4的select()抓取导航它的结果如下抓取导航,实现方法1/首页/guonei国内/guoji国际/mil军事/finance财经/ent娱乐/sports体育/internet互联网/tech科技/game游戏/lady女人/auto汽车/house房产在实际项目中,要精准分析网页结构的特征,找准网页HTML标签、HTML的ID属性和CSS的名称属性这些代码,可以快速地提供和解析网页。示例1:抓取新闻标题和链接#假设新闻结构为<divclass="news-item"><h2><ahref="...">标题</a></h2></div>news_items=soup.select('div.news-item')news_data=[]foriteminnews_items:title=item.h2.a.text.strip()link=item.h2.a['href']news_data.append({'title':title,'link':link})print(f"抓取到{len(news_data)}条新闻")示例2:提取表格数据#提取HTML表格数据table=soup.find('table')table_data=[]iftable:forrowintable.find_all('tr'):columns=row.find_all(['td','th'])row_data=[col.get_text(strip=True)forcolincolumns]table_data.append(row_data)
#打印表格前3行
forrowintable_data[:3]:print(row)else:print("未找到表格")示例4:处理动态加载内容#对于JavaScript动态加载的内容,可能需要使用seleniumfromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get(url)dynamic_html=driver.page_sourcesoup=BeautifulSoup(dynamic_html,'lxml')#然后正常解析...示例5:处理编码问题#手动指定编码response.encoding='gbk'#对于中文网页常见的编码soup=BeautifulSoup(response.text,'lxml')示例6:性能优化技巧#只解析部分文档partial_html=html[:500000]#限制解析前500KBsoup=BeautifulSoup(partial_html,'lxml')#使用lxml解析器提升速度soup=BeautifulSoup(html,'lxml')#限制查找范围container=soup.find(id='content')titles=container.find_all('h2')#只在特定区域内查找感谢聆听制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件SQLite数据库的使用——网络爬虫库的应用制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。
书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录SQLite数据库的简介和常用APISQLite数据库的使用和示范SQLite数据库的简介和常用API01SQLite的简介SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。SQLite的官方网站为/index.html。SQLite是一个轻量级的嵌入式关系型数据库,具有以下特点:无服务器、零配置事务性、符合ACID跨平台(支持Windows/Linux/Mac等)单一磁盘文件存储整个数据库支持标准SQL语法开源免费SQLite的简介SQLite可使用sqlite3模块与Python进行集成。它提供了一个与PEP249描述的DB-API2.0规范兼容的SQL接口。不需要单独安装该模块,因为Python2.5.x以上版本默认自带了该模块。它的一些常用的常量、函数和对象如下:1)Sqlite3.version#常量,版本号。2)sqlite3.Connect(database)#函数,连接数据库,返回Connect对象。3)sqlite3.Connect#数据库连接对象4)sqlite3.Cursor#游标对象5)sqlite3.Row#行对象sqlite3的主要API及描述序号API及描述1sqlite3.connect(database[,timeout,otheroptionalarguments])该API打开一个到SQLite数据库文件database的链接。如果数据库成功打开,则返回一个连接对象。timeout参数表示连接等待锁定的持续时间,直到发生异常断开连接。timeout参数默认是5.0(秒)。如果给定的数据库名称database不存在,则该调用将创建一个数据库。如果您不想在当前目录中创建数据库,那么您可以指定带有路径的文件名。2connection.cursor([cursorClass])该例程创建一个cursor,将在Python数据库编程中用到。该方法接受一个单一的可选的参数cursorClass。如果提供了该参数,则它必须是一个扩展自sqlite3.Cursor的自定义的cursor类。3cursor.execute(sql[,optionalparameters])该例程执行一个SQL语句。该SQL语句可以被参数化。sqlite3模块支持两种类型的占位符:问号和命名占位符(命名样式)。例如:cursor.execute("insertintopeoplevalues(?,?)",(who,age))4connection.execute(sql[,optionalparameters])该例程是上面执行的由游标(cursor)对象提供的方法的快捷方式,它通过调用游标(cursor)方法创建了一个中间的游标对象,然后通过给定的参数调用游标的execute方法。sqlite3的主要API及描述序号API及描述5connection.total_changes()该例程返回自数据库连接打开以来被修改、插入或删除的数据库总行数。6mit()该方法提交当前的事务。如果您未调用该方法,那么自您上一次调用commit()以来所做的任何动作对其他数据库连接来说是不可见的。7connection.rollback()该方法回滚自上一次调用commit()以来对数据库所做的更改。8connection.close()该方法关闭数据库连接。请注意,这不会自动调用commit()。如果您之前未调用commit()方法,就直接关闭数据库连接,您所做的所有更改将全部丢失!9cursor.fetchone()该方法获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回None。10cursor.fetchmany([size=cursor.arraysize])该方法获取查询结果集中的下一行组,返回一个列表。当没有更多的可用的行时,则返回一个空的列表。该方法尝试获取由size参数指定的尽可能多的行。11cursor.fetchall()该例程获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,则返回一个空的列表。SQLite的使用流程打开数据库:sqlite3_open()准备SQL语句:sqlite3_prepare_v2()绑定参数(可选):sqlite3_bind_*()执行语句:sqlite3_step()获取结果(查询时):sqlite3_column_*()释放预处理语句:sqlite3_finalize()关闭数据库:sqlite3_close()SQLite的示例——创建/连接数据库importsqlite3#连接数据库(如果不存在会自动创建)conn=sqlite3.connect('example.db')#创建游标对象cursor=conn.cursor()#操作完成后记得关闭连接conn.close()SQLite的示例——创建表cursor.execute('''CREATETABLEIFNOTEXISTSusers(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTNOTNULL,ageINTEGER,emailTEXTUNIQUE)''')mit()#提交事务SQLite的示例——删除表cursor.execute("DROPTABLEIFEXISTSusers")mit()SQLite的示例——插入数据#插入单条数据cursor.execute("INSERTINTOusers(name,age,email)VALUES(?,?,?)",('张三',25,'zhangsan@'))#插入多条数据users=[('李四',30,'lisi@'),('王五',28,'wangwu@')]cursor.executemany("INSERTINTOusers(name,age,email)VALUES(?,?,?)",users)mit()#不要忘记提交SQLite的示例——查询数据#查询所有数据cursor.execute("SELECT*FROMusers")print(cursor.fetchall())#获取所有结果#查询单条数据cursor.execute("SELECT*FROMusersWHEREname=?",('张三',))print(cursor.fetchone())#获取一条结果#带条件查询cursor.execute("SELECTname,ageFROMusersWHEREage>?",(25,))forrowincursor:print(f"姓名:{row[0]},年龄:{row[1]}")SQLite的示例——更新数据cursor.execute("UPDATEusersSETage=?WHEREname=?",(26,'张三'))print(f"更新了{cursor.rowcount}行数据")mit()SQLite的示例——删除数据cursor.execute("DELETEFROMusersWHEREid=?",(3,))mit()SQLite的示例——事务处理try:
#开始事务(Python中默认每条execute都是一个事务)
cursor.execute("INSERTINTOusers(name)VALUES('赵六')")cursor.execute("UPDATEusersSETage=30WHEREname='赵六'")mit()#提交事务except:conn.rollback()#回滚事务
print("操作失败,已回滚")SQLite的示例——获取最后插入的IDcursor.execute("INSERTINTOusers(name)VALUES('钱七')")last_id=cursor.lastrowidprint(f"最后插入的ID:{last_id}")mit()SQLite的示例——使用字典形式返回结果conn.row_factory=sqlite3.Row#设置行工厂cursor=conn.cursor()cursor.execute("SELECT*FROMusersWHEREid=?",(1,))row=cursor.fetchone()print(f"ID:{row['id']},姓名:{row['name']}")#像字典一样访问SQLite的示例——批量插入大量数据(高效方式)data=[(f'用户{i}',20+i,f'user{i}@')foriinrange(1000)]withsqlite3.connect('example.db')asconn:cursor=conn.cursor()cursor.executemany("INSERTINTOusers(name,age,email)VALUES(?,?,?)",data)mit()记得始终在修改数据后调用commit()。SQLite数据库的使用和示范02范例11-8使用sqlite3创建数据库和数据表创建数据库名称为“Student.db”,存放路径为“D:\pythonBook\pythonProject10\SQLite3DB”。在数据库“Student.db”中创建数据表为“tbuser”,它的表结构如下所示字段名称类型备注IdIntId号,主键,不为空UserCodeVARCHAR(20)用户帐号,不为空UserNameVARCHAR(20)用户姓名,不为空范例11-8使用sqlite3创建数据库和数据表它的代码如下:importsqlite3#创建数据库Student.dbconn=sqlite3.connect(r'D:\SQLite3DB\Student.db')print("数据库Student.db创建成功")c=conn.cursor()#cursor()使用该连接创建(并返回)一个游标对象c.execute('''CREATETABLEtbuser(IDINTPRIMARYKEYNOTNULL,UserCodeVARCHAR(20)NOTNULL,UserNameVARCHAR(20)NOTNULL);''')#创建数据表tbuserprint("数据表tbuser创建成功")mit()#提交操作conn.close()#关闭Connection对象
范例11-8使用sqlite3创建数据库和数据表它的运行结果如下:数据库Student.db创建成功数据表tbuser创建成功范例11-9sqlite3进行增、删、改操作数据库中的数据需要在不同的程序中进行调用,最为常见的操作是“增、删、改、查”四种操作。在数据库中进行数据的增加、删除和修改操作,它的一般步骤如下:1)建立数据库的连接。2)创建游标对象。3)根据SQL的Insert,Delete和Update语句,使用Connection.execute(sql)执行数据的增加、删除和修改操作,并根据返回的值判断操作结果。4)提交操作。5)关闭数据库连接对象。把以下数据插入到数据表“tbuser”中,并对其中的一些数据进行修改和删除操作。范例11-9sqlite3进行增、删、改操作数据如下:IDuserCodeuserNameIDuserCodeuserName110001刘小红610006金奇210002王小林710007周泽310003朱梦810008朱秀娟410004金烨伟910009姜子文510005王婷1010010秦家兴范例11-9sqlite3进行增、删、改操作代码(1)importsqlite3#连接数据库conn=sqlite3.connect(r'D:\pythonBook\pythonProject10\SQLite3DB\Student.db')cur=conn.cursor()#创建游标对象#删除全部数据sqltxt0="deletefromtbuser"cur.execute(sqltxt0)print("成功删除一个表的数据")#插入一行数据(第1种方法)sqltxt1="insertintotbuser(id,UserCode,UserName)values(1,'10001','刘小红')"cur.execute(sqltxt1)print("成功插入一行数据(第1种方法)")范例11-9sqlite3进行增、删、改操作代码(2)#插入一行数据(第2种方法)sqltxt2="insertintotbuser(id,UserCode,UserName)values(?,?,?)"cur.execute(sqltxt2,(2,'10002','王小林'))print("成功插入一行数据(第2种方法)")#插入多行数据(第1种方法)sqltxt3="insertintotbuser(id,UserCode,UserName)values(3,'10003','朱梦'),(4,'10004','金烨伟'),(5,'10005','王婷'),(6,'10006','金奇')"cur.execute(sqltxt3)print("成功插入多行数据(第1种方法)")范例11-9sqlite3进行增、删、改操作代码(3)#插入多行数据(第2种方法)userList=[(7,'10007','周泽'),(8,'10008','朱秀娟'),(9,'10009','姜子文'),(10,'10010','秦家兴')]sqltxt3="insertintotbuser(id,UserCode,UserName)values(?,?,?)"cur.executemany(sqltxt3,userList)print("成功插入多行数据(第2种方法)")#修改一行数据sqltxt4="updatetbusersetUserName='刘丽红'whereid=1"cur.execute(sqltxt4)print("成功修改一行数据")范例11-9sqlite3进行增、删、改操作代码(4)#删除一行数据sqltxt5="deletefromtbuserwhereid=2"cur.execute(sqltxt5)print("成功删除一行数据")mit()#提交操作conn.close()#关闭Connection对象范例11-9sqlite3进行增、删、改操作结果如下成功删除全部数据成功插入一行数据(第1种方法)成功插入一行数据(第2种方法)成功插入多行数据(第1种方法)成功插入多行数据(第2种方法)成功修改一行数据成功删除一行数据范例11-10sqlite3进行数据的查询操作在数据库中进行数据的查询操作,它的一般步骤也与上面提到的“增、删、改”操作步骤类似,其中第三步改成Select查询语句即可,第四步则通常使用循环读取数据内容。#连接数据库conn=sqlite3.connect(r'D:\pythonBook\pythonProject10\SQLite3DB\Student.db')cur=conn.cursor()#创建游标对象#查询全部数据sqltxt0="select*fromtbuser"cur.execute(sqltxt0)print("成功查询全部数据")foroneincur:print(one)代码(1)范例11-10sqlite3进行数据的查询操作#查询某个条件的数据sqltxt0="select*fromtbuserwhereid=10"cur.execute(sqltxt0)print("成功查询id=10的数据")foroneincur:print(one)conn.close()#关闭Connection对象代码(2)范例11-10sqlite3进行数据的查询操作它的结果成功查询全部数据(1,'10001','刘丽红')(3,'10003','朱梦')(4,'10004','金烨伟')(5,'10005','王婷')(6,'10006','金奇')(7,'10007','周泽')(8,'10008','朱秀娟')(9,'10009','姜子文')(10,'10010','秦家兴')成功查询id=10的数据(10,'10010','秦家兴')范例11-10sqlite3进行数据的查询操作对查询全部数据的操作,也可以通过指定列表的索引来匹配具体的数据,比如one[0]、one[1]等,代码如下:print("成功查询全部数据")foroneincur:print('ID:',one[0])print('UserCode:',one[1])print('UserName:',one[2])感谢聆听制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件人工智能库的应用——人脸识别项目制作:课程编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。
书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录face_recognition的安装和简介案例:人脸识别学生考勤系统face_recognition的安装和简介01face_recognition的简介项目face_recognition是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例。据项目的官方文档说明,本项目是世界上最简洁的人脸识别库之一,你可以使用Python和命令行工具提取、识别、操作人脸。该项目的人脸识别是基于业内领先的C++开源库dlib中的深度学习模型,用《LabeledFacesintheWild》(美国麻省大学安姆斯特分校(UniversityofMassachusettsAmherst)制作的人脸数据集,该数据集包含了从网络收集的13,000多张面部图像。)人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。有关它的更多介绍请访问英文网站https://face-recognition.readthedocs.io/。安装face_recognition它的安装方法简单,可以直接使用PIP进行安装。但它有依赖环境,在安装时可能会出错。如果在Windows操作系统下安装face_recognition失败,可以按以下顺序检查:1)如果你本机没有安装vistualstudio,就先下载安装vistualstudio2012或以上版本,并在安装选项中增加C++库的支持。在微软官网(/zh-hans/)下载新版本的vistualstudio。2)如果提示cmake没安装,请先安装它。pipinstallcmake安装face_recognition3)如果提示dlib没安装,请先安装它。4)以上环境准备好后,再安装face_recognition。pipinstallface_recognitionpipinstalldlibface_recognition的API简介1)batch_face_locations()人脸定位使用CNN深度学习模型返回图像中人脸边界框的二维数组。如果您使用的是GPU,由于GPU可以一次处理一批图像,因此可以更快地获得结果。如果您不使用GPU,则不需要此功能。语法举例:batch_face_locations(images,number_of_times_to_upsample=1,batch_size=128)参数:images表示图片列表(每个图片为一个numpy数组)。number_of_times_to_upsample表示对图像进行脸部上采样的次数。数字越大,面孔越小。batch_size表示每个GPU处理批次中要包含多少个图像。face_recognition的API简介2)face_locations()人脸定位利用CNN深度学习模型或方向梯度直方图(HistogramofOrientedGradient,HOG)进行人脸提取。返回值是一个数组(top,right,bottom,left)表示人脸所在边框的四条边的位置。语法举例:face_locations(img,number_of_times_to_upsample=1,model='hog')它的功能与batch_face_locations()类似。它的前2个参数相同,后面的model表示要使用的人脸检测模型,主要有两个模型“hog”和“cnn”。“hog”准确性较低,但在CPU上速度更快。“cnn”是经过GPU/CUDA加速(如果可用)的更准确的深度学习模型。默认值为“hog”。face_recognition的API简介3)compare_faces()人脸比对将面部编码列表与候选编码进行比较,以查看它们是否匹配。语法举例:compare_faces(known_face_encodings,face_encoding_to_check,tolerance=0.6)参数:known_face_encodings表示已知人脸的特征向量。face_encoding_to_check表示未知人脸的特征向量。Tolerance是容忍度,认为相匹配的面孔之间的距离有多大。越低越严格,0.6是典型的最佳性能。face_recognition的API简介4)face_distance()人脸特征向量距离给定面部编码列表,将它们与已知的面部编码进行比较,并获得每个比较面部的欧几里得距离。距离告诉您面孔的相似程度。语法举例:face_distance(face_encodings,face_to_compare)参数:face_encodings表示已知人脸的特征向量。face_to_compare表示未知人脸的特征向量。face_recognition的API简介5)face_encodings()人脸解码输入一张图片后,生成一个128维的特征向量,这是人脸识别的依据。语法举例:face_encodings(face_image,known_face_locations=None,num_jitters=1,model='small')参数: face_image表示包含一个或多个面部的图像。known_face_locations是可选项,项目每个面的边界框。num_jitters表示计算编码时对面部重新采样的次数。越高越准确,但越慢(即100慢100倍)。model是可选项,为“large”或“small”。它表示使用哪种模型,它默认仅返回5点,但速度更快。face_recognition的API简介6)face_landmarks()脸特征提取给定图像,返回图像中每个面部的面部特征位置(眼睛,鼻子等)的决定。语法举例:face_landmarks(face_image,face_locations=None,model='large')参数:face_image表示要搜索的图像。face_locations这个是默认值,默认解码图片中的每一个人脸。若输入face_locations()[i]可指定人脸进行解码。model是可选项,为“large”或“small”。face_recognition的API简介7)load_image_file()加载图像文件它能将图像文件(.jpg,.png等)加载到numpy数组中。语法举例:load_image_file(file,mode='RGB')参数:file表示图像文件名或要加载的文件对象。mode表示将图像转换成的格式。仅支持“RGB”(8位RGB,3通道)和“L”(黑白)。范例11-13 定位图片中所有人脸,并自动生成人脸图片保存在本地给出学生图片student.jpg,自动识别出图片中的人脸。原图效果如图所示。说明:出于印刷和版权的考虑,素材中的人像图片都后期加了马赛克,原图并没有马赛克。范例11-13 定位图片中所有人脸,并自动生成人脸图片保存在本地importface_recognitionfromPILimportImageimportos#第1步:人脸定位print('正在识别中...')image=face_recognition.load_image_file("student.jpg",mode='RGB')#加载图片文件#face_locations:以列表形式返回图片中的所有人脸的位置数组(top,right,bottom,left)face_locations=face_recognition.face_locations(image,model="cnn")#人脸定位,模式为cnn#print(face_locations)范例11-13 定位图片中所有人脸,并自动生成人脸图片保存在本地#第2步:判断文件夹是否存在,不存在则创建文件夹filePath="student-img"ifnotos.path.exists(filePath):os.makedirs(filePath)范例11-13 定位图片中所有人脸,并自动生成人脸图片保存在本地#第3步:遍历,自动截取的人脸图并保存num=1#第一个图片序号foronesinface_locations:top,right,bottom,left=ones#构造上、右,下、左的坐标
face_image=image[top:bottom,left:right]pil_image=Image.fromarray(face_image)#array转换成imagepil_image.save(fp=r"{0}/face{1}.jpg".format(filePath,num))#保存图片
num+=1#序号自加1print('识别完成...')范例11-13 定位图片中所有人脸,并自动生成人脸图片保存在本地经检查,它已经自动生成文件夹“student-img”,并在它里面自动生成4个人脸图片,范例11-14 识别图片人物有两张图片,一张是已知人物,另一张是未知人物。现进行人脸识别,判断未知人物是不是本人。importface_recognitionprint('正在识别中...')#step01:读取已知人物图片并编码picture_of_me=face_recognition.load_image_file("me.jpg")my_face_encoding=face_recognition.face_encodings(picture_of_me)[0]#step02:读取未知人物图片并编码unknown_picture=face_recognition.load_image_file("unknown.jpg")unknown_face_encoding=face_recognition.face_encodings(unknown_picture)[0]范例11-14 识别图片人物#step03:比较人脸#由于对亚洲人识别率不高tolerance一般设置在0.3-0.38之间可满足大部分需求results=face_pare_faces([my_face_encoding],unknown_face_encoding,tolerance=0.38)#step04:输出结果ifresults[0]==True:print("图片中的人是我")else:print("图片中的人不是我")print('识别完成...')范例11-14 识别图片人物图片请读者自动选用。本案例选用的图片如图所示,执行后结果会正确体现出来。试一试更多的范例,可参考/ageitgey/face_recognition/tree/master/examples来完成。比如:1.人脸定位案例:定位某人的脸案例:使用卷积神经网络深度学习模型定位某人的脸案例:使用卷积神经网络深度学习模型批量识别图片中的人脸案例:把来自网络摄像头视频里的人脸高斯模糊(需安装OpenCV)试一试试一试2.人脸关键点识别案例:提取用户A和用户B的面部关键点案例:给某人涂美妆试一试3.人脸识别案例:是用户A还是用户B?案例:人脸识别之后在原图上画框框并标注姓名案例:在不同精度上比较两个人脸是否属于一个人案例:从摄像头获取视频进行人脸识别-较慢版(需安装OpenCV)案例:从摄像头获取视频进行人脸识别-较快版(需安装OpenCV)案例:从视频文件中识别人脸并把识别结果输出为新的视频文件(需安装OpenCV)案例:通过浏览器HTTP访问网络服务器进行人脸识别(需安装Flask框架))案例:基于K最近邻KNN分类算法进行人脸识别案例:人脸识别学生考勤系统02案例描述考勤制度是对学生的学习和生活进行管理的有效措施,而考勤系统是否完善是决定考勤制度实施程度的关键因素。目前,很多学校教师的考勤依旧沿袭着手工操作的模式,导致学校考勤机制难以发挥应有的效率。在此背景下,开发一款具备实时性和高效性的考勤系统,借助“平安校园”的数据平台,构建以人脸识别为技术支撑的学生考勤管理系统。案例描述该系统可以有效记录自动签到和查询签到,可以利用校园网络的服务器将学生端的考勤数据进行上传,而且考勤数据的动态管理和查看完全可以通过管理账号来实现。本案例只要求实现部分功能:考勤时会使用第三软件拍摄好学生的一张或者数张图片,然后让本系统去做人脸识别,如果学生与人脸识别库的信息一致,则表明学生正常来上课没有缺勤,如果比对的信息不一致,则记录为缺勤。案例分析1)对班级每一个学生都采集相片,每个相片图像只有一个学生的头像信息。图片文件放在“known”文件夹中。采集相片技术不在本案例讨论范围内。如图所示,一共有4位学生。案例分析2)使用第三方软件抓拍到课室上课的学生集体照片一张,如果学生人从过多,可以从不同角度拍摄数张。抓拍技术不在本案例讨论范围内。如图所示,在本次测试数据中,我们使用了“学生考勤照片1.jpg”图片,它有5位学生,但是有2位不是本班的学生。案例分析3)从指定的图片路径,获取图片名称和学生姓名。4)遍历获取已知学生的人脸编码。5)读取拍摄的考勤相片,获取未知学生的人脸编码。6)进行人脸对比,看那些学生按时来上课。7)生成人脸对比结果,把数据汇总并显示出来。它用到的技术点有以下几方面:获取文件名os.listdir(),构造完整文件路径os.path.join(path,i),去除图片文件名的后缀list.split('.')[0],使用for和while进行循环遍历,使用face_recognition.load_image_file()加载图片,使用face_recognition.face_encodings进行人脸编码,使用face_pare_faces进行人脸对比等。案例代码代码过长,请查看教材。调试结果如下调试结果因为“学生A”不在右边的考勤图中,所以考勤数据检查不到这位学生。右边的考勤图中有5位学生,虽然“未知人脸数”5多于“已知人脸数”4,但是其中第一排的2位学生也不是这个班的,所以考勤数据检查不到这2位学生。试一试1)增加代码,把考勤图中的本班学生人脸用一个框标注出来。2)增加代码,把考勤图中的本班学生人脸旁边标注相应的学生姓名出来。感谢聆听出版社:机械工业出版社《Python编程基础与应用》配套课件数据可视化的使用制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。
书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录matplotlib的安装和简介MyQR的安装和简介qrcode的安装和简介matplotlib的安装和简介01matplotlib的简介Matplotlib是Python最流行的2D绘图库之一,用于创建高质量的静态、动态和交互式可视化。它提供类似MATLAB的语法,支持折线图、散点图、柱状图、等高线图等多种图表类型。核心组件包括pyplot模块(简化绘图)、Figure(画布)和Axes(坐标系)。可与NumPy、Pandas无缝集成,支持自定义样式、标签和注释。通过plt.show()显示图像,或savefig()保存为PNG/PDF等格式。它是数据分析和科学计算的重要工具。matplotlib的简介matplotlib的安装pipinstallmatplotlib有关它的更多介绍请访问英文网站/或者中文网站/。开发者可以仅需要几行代码,便可以生成饼图、直方图、箱形图、条形图和散点图等。安装matplotlib时,通常会同步安装numpy库。有些matplotlib运算需要用到numpy库。Matplotlib常用图表类型及函数类型函数名称关键参数说明注意事项折线图plt.plot()x,
y:数据坐标
linestyle:线型(如
'-'、'--')
color:颜色
label:图例标签适用于连续数据趋势展示;可通过
alpha
调整透明度。散点图plt.scatter()x,
y:数据坐标
s:点大小
c:颜色
marker:点形状(如
'o'、's')适合展示两个变量的相关性;大数据量时性能优于
plot()。柱状图plt.bar()
/
plt.barh()height
(或
width):柱高度
x:柱位置
color:颜色
label:图例标签分类数据对比;barh()
为水平柱状图;可用
alpha
调整透明度。直方图plt.hist()x:输入数据
bins:柱子数量或边界
density:是否归一化
color:颜色展示数据分布;bins
影响结果,需合理设置。Matplotlib常用图表类型及函数图表类型函数名称关键参数说明注意事项饼图plt.pie()x:数据值
labels:标签
autopct:百分比格式
explode:突出部分适合比例展示;数据过多时标签易重叠,建议少于6类。箱线图plt.boxplot()x:数据列表
vert:是否垂直
patch_artist:是否填充颜色展示数据分布和离群点;需注意数据格式(列表的列表)。热力图sns.heatmap()
(Seaborn)data:二维数据
annot:显示数值
cmap:颜色映射
fmt:数值格式需安装Seaborn;适合矩阵数据可视化,如相关系数矩阵。Matplotlib常用图表类型及函数图表类型函数名称关键参数说明注意事项误差条图plt.errorbar()x,
y:数据点
yerr/xerr:误差值
fmt:点和线格式展示数据不确定性;参数需与
plot()
类似。极坐标图plt.polar()
+
plot()theta:角度数据
r:半径数据需先创建极坐标子图:ax=plt.subplot(111,polar=True)。3D图表ax.plot_surface()
等X,
Y,
Z:3D数据
cmap:颜色映射需导入
mpl_toolkits.mplot3d;性能较慢,适合少量数据。Matplotlib通用参数说明颜色:支持名称(如'red')、缩写(如'r')或RGB元组(如(0.2,0.4,0.6))。线型:'-'(实线)、'-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石油化工境外检测协议
- 2026年临床研究采购协议
- 2026中国农业科学院草原所高层次人才招聘4人笔试题库及完整答案详解(有一套)
- 护理手卫生:培训与考核标准
- 2026新疆阿勒泰地区基础教育“银龄人才”招募6人模拟试卷【完整版】附答案详解
- 2026新疆医学会招聘3人参考题库附答案详解(精练)
- 护理人文关怀材料
- 吉林省长春新区2026年物理八年级第一学期期末综合测试试题含解析
- 重庆市璧山区2026年物理八年级第一学期期末学业质量监测模拟试题含解析
- 2027届四川省南充营山县联考数学八上期末检测试题含解析
- 煤矿压煤村庄搬迁管理手册
- 《乒乓变奏曲》课件2025-2026学年苏少版一年级下册音乐
- CSCO乳腺癌诊疗指南(2026版)
- 八年级化学上学期期中知识清单:沪科版·五四学制
- 2026年广东省东莞市八校联考中考二模化学试卷(含答案)
- Q-CR 9230-2025 铁路工程沉降变形观测与评估技术规程
- 卫生院财务管理制度
- 2026年广西壮族自治区防城港市初二地理生物会考考试题库(含答案)
- 广东深圳市鲲鹏股权投资管理有限公司招聘笔试题库2026
- 2026年专利代理师《相关法律》冲刺押题(附答案)
- 2026春外研版(新教材)初中英语七年级下册(全册)各单元知识点复习要点梳理
评论
0/150
提交评论