Python编程基础与应用 第2版 课件 第 7 章 面向对象的应用_第1页
Python编程基础与应用 第2版 课件 第 7 章 面向对象的应用_第2页
Python编程基础与应用 第2版 课件 第 7 章 面向对象的应用_第3页
Python编程基础与应用 第2版 课件 第 7 章 面向对象的应用_第4页
Python编程基础与应用 第2版 课件 第 7 章 面向对象的应用_第5页
已阅读5页,还剩249页未读 继续免费阅读

下载本文档

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

文档简介

文本处理库的应用《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。

书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录jieba的安装和应用wordcloud的安装和应用案例:可视化中文词云项目jieba的安装和应用01为什么要中文分词?在英文的行文中,单词之间是以空格作为自然分界符的,显得相对简单。但是中文比之英文要复杂得多、困难得多。中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块。不同于英文的是,中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词,分词效果将直接影响词性、句法等模块的效果。为什么要中文分词?比如“路不通行不得在此小便”,如果加上标点符号可以变为“路不通行,不得在此小便。”或者“路不通,行不得,在此小便。”如果使用计算机系统进行分词,它可能会分词为“路”,“不”,“通行”,“不得”,“在”,“此”,“小便”,“路”,“不”,“通行”,“不得”,“在”,“此”,“小便”等。它们的含义与真实原文含义会有偏差。中文分词的插件库简介以下是Python中常用的5个中文分词工具/插件,以表格形式对比它们的主要特点和适用场具名称主要特点适用场景jieba-支持精确、全模式、搜索引擎模式分词

-关键词提取、词性标注

-轻量级,易用通用中文文本处理、搜索引擎、数据分析HanLP-多任务NLP工具(分词、NER、句法分析等)

-支持预训练模型(如BERT)

-多语言支持高级NLP任务(如命名实体识别、依存句法分析)SnowNLP-中文分词、情感分析、文本摘要

-基于概率模型,适合非结构化文本情感分析、社交媒体文本处理pkuseg-高准确率分词(尤其适合领域文本)

-支持自定义训练模型

-北大语言计算组开发专业领域文本(医学、法律等)THULAC-清华NLP组开发,高精度分词

-支持词性标注

-速度较快学术研究、大规模文本处理中文分词的插件库简介jieba最常用,适合大多数场景;HanLP功能最全,适合复杂NLP任务;pkuseg/THULAC在专业领域表现更好;SnowNLP适合非结构化文本(如评论情感分析)。如果需要更高性能的分词(如生产环境),可考虑C++实现的工具(如FudanNLP、LTP)或结合深度学习模型(BERT-CRF)等。jieba的简介jieba是一个流行的中文分词工具,专门用于将连续的中文文本分割成有意义的词语(即分词)。jieba因其易用性和稳定性,成为中文NLP的基础工具之一。以下是它的核心功能:分词:支持三种分词模式:精确模式(默认):最常用,适合文本分析,准确率高。全模式:输出所有可能的词语组合,速度快但可能有冗余。搜索引擎模式:在精确模式基础上,对长词再次切分,适合搜索引擎应用。关键词提取:基于TF-IDF或TextRank算法提取文本关键词。词性标注(POSTagging):标记词语的词性(如名词、动词等)。支持自定义词典:用户可添加新词或调整词频,提升特定领域的分词效果。jieba的简介以下是它的优势:轻量高效:纯Python实现,依赖少,安装简单(pipinstalljieba)。多语言支持:除简体中文外,支持繁体中文分词。灵活可扩展:支持用户自定义词典和停用词过滤。注意事项:对于未登录词(如网络新词),需手动添加词典或使用动态调整功能(如jieba.suggest_freq)。处理超大文本时,可启用并行分词模式加速(jieba.enable_parallel())。jieba的安装它的安装方法很简单,可以直接使用PIP进行安装:#从国外镜像安装pipinstalljieba#从国内清华镜像源安装pipinstall-i/pypi/web/simplejiebajieba库的常用函数函数名称描述jieba.lcut(s)精确模式,返回一个列表类型。jieba.lcut(s,cut_all=True)全模式,返回一个列表类型。jieba.lcut_for_search(s)搜索引擎模式,返回一个列表类型。jieba.add_word(w)向分词的词典增加新词w。范例11-1jieba库的三种分词模式应用jieba库的三种分词模式,对字符串“jieba是优秀的中文分词第三方库”进行分词。importjiebas='jieba是优秀的中文分词第三方库'result=jieba.lcut(s)#精确模式print("精确模式:",result)result=jieba.lcut(s,cut_all=True)#全模式print("全模式:",result)result=jieba.lcut_for_search(s)#搜索引擎模式print("搜索引擎模式:",result)#jieba.enable_paddle()#启动paddle模式。

#result=jieba.cut(s,use_paddle=True)#使用paddle模式#print("paddle模式:",result)jieba.add_word('计算机编程语言')#加入新词result=jieba.lcut(s)#精确模式print("加入新词后的精确模式:",result)范例11-1jieba库的三种分词模式结果如下:精确模式:['Python','是','一门','计算机','编程语言']全模式:['Python','是','一门','计算','计算机','算机','编程','编程语言','语言']搜索引擎模式:['Python','是','一门','计算','算机','计算机','编程','语言','编程语言']加入新词后的精确模式:['Python','是','一门','计算机编程语言']从结果中可以对比看到精确模式将字符串分割成等量的中文词组,而全模式则把字符串的全部分词都列出来了,冗余性比较大。搜索引擎模式首先执行精确模式,然后再对其中长词进一步切分获得最终分词结果。精确模式因为不会产生冗余,比较常用。搜索引擎模式更倾向于寻找短词语,这种方式有一定的冗余度,但冗余度相对全模式少一些。在某个项目中应该选择哪一种分词模式,要看项目的实际需求。jieba库的常用用法归纳功能代码示例说明精确分词jieba.cut(text,cut_all=False)最常用全模式分词jieba.cut(text,cut_all=True)所有可能组合搜索引擎分词jieba.cut_for_search(text)适合搜索场景自定义词典jieba.add_word("新词")

jieba.load_userdict("dict.txt")提高专业词汇识别关键词提取analyse.extract_tags(text,topK=3)TF-IDF算法词性标注pseg.cut(text)返回(词,词性)并行分词jieba.enable_parallel(4)加速大数据处理加载自定义词典文件创建一个user_dict.txt文件,每行一个词(可带词频和词性):自然语言处理10n深度学习5n然后在代码中加载:jieba.load_userdict("user_dict.txt")#加载自定义词典words=jieba.cut("深度学习是人工智能的重要方向")print("/".join(words))#输出:深度学习/是/人工智能/的/重要/方向TF-IDF关键词提取fromjiebaimportanalysetext="自然语言处理是人工智能的重要分支,涉及文本分析、机器翻译等技术"#基于TF-IDF提取前3个关键词keywords=analyse.extract_tags(text,topK=3,withWeight=True)print(keywords)#输出:[('自然语言处理',1.0),('人工智能',0.8),('机器翻译',0.6)]TextRank关键词提取keywords=analyse.textrank(text,topK=3,withWeight=True)print(keywords)#输出:[('自然语言处理',1.0),('人工智能',0.9),('技术',0.7)]词性标注(POSTagging)importjieba.possegaspsegwords=pseg.cut("我爱自然语言处理")forword,flaginwords:print(f"{word}({flag})",end="")#输出:我(r)爱(v)自然语言处理(nz)常见词性标记:n:名词v:动词a:形容词r:代词nz:专有名词并行分词(加速大数据处理)jieba.enable_parallel(4)#开启4线程并行分词words=jieba.cut(text)print("/".join(words))jieba.disable_parallel()#关闭并行模式wordcloud的安装和应用02常用的词云简介以下是Python中常用的5个词云(WordCloud)生成库,以表格形式对比它们的特点和适用场景:库名称主要特点适用场景wordcloud-最流行的词云库

-支持自定义形状、颜色、字体

-依赖

matplotlib

Pillow通用词云生成、文本可视化stylecloud-基于

wordcloud

的简化版

-内置多种风格(渐变、图标形状)

-一键生成美观词云快速生成社交媒体风格的词云pyecharts-支持交互式词云(基于ECharts)

-可结合Web前端展示

-需要

pyecharts

依赖网页嵌入、动态数据展示cnschema-专为中文优化

-支持自定义语义规则

-适合特定领域(如法律、医疗)中文专业文本分析D3.js(Python接口)-通过

python-d3

调用

-高度自定义交互式词云

-学习曲线较陡高级可视化、定制化需求常用的词云简介wordcloud的安装和简介wordcloud库把词云当作一个WordCloud对象。wordcloud.WordCloud()代表一个文本对应的词云,可以根据文本中词语出现的频率等参数绘制词云,绘制词云的形状、尺寸和颜色都可以设定。它的安装方法很简单,可以直接使用PIP进行安装#从国外镜像安装pipinstallwordcloud#从国内清华镜像源安装pipinstall-i/pypi/web/simplewordcloudwordcloud的常用方法在生成词云时,它默认会以空格或者标点为分隔符对目标文本进行分词处理,但是对于中文的文本,分词处理需要提前处理好。一般的做法是先将中文文本进行分词,然后以空格或者标点拼接,再调用wordcloud库函数。方法描述w.generate(txt)向WordCloud对象w中加载文本txt,例如:w.generate("PythonandWordCloud")w.to_file(filename)将词云输出为图像文件,.png或.jpg,例如:w.to_file("outfile.png")范例11-2wordcloud库生成词云应用wordcloud库对以下字符串“PythonJAVAC#C++ASP.NETPythonandWordCloudPython”生成一个词云,并保存为图片。importwordcloudw=wordcloud.WordCloud()#步骤1:配置对象参数w.generate("PythonJAVAC#C++ASP.NETPythonandWordCloudPython")#步骤2:加载词云文本w.to_file("pywordcloud.png")#步骤3:输出词云文件它生成了一张图片pywordcloud.png,效果如图。从图中看到“Python”文字比较大,这是因为它的词频是字符串中最高的。生成指定形状的词云wordcloud也可以生成任何形状的词云,为了获取形状,需要提供一张相应形状的图像。图像最好以PNG格式的图片,其它无关的轮廓或者内容提前使用图像处理软件清除好。对于图片的读取可以使用imageio库。imageio是一个Python库,它提供了一个简单的接口来读取和写入大量的图像数据,包括动画图像、体积数据和科学格式。imageio.imread()#从指定的文件读取图像。wordcloud的常用参数wordcloud处理中文时,还可以指定用到的中文字体。中文字体文件需要与代码存放在同一个目录下。如果不放在同一个目录下,中文字体文件即要提供完整路径。下表是wordcloud的常用参数参数说明示例width,

height词云尺寸(像素)width=800,height=400background_color背景色background_color="white"font_path字体文件路径(解决中文乱码)font_path="SimHei.ttf"mask形状掩码(需

numpy

数组)mask=np.array(Image.open("shape.png"))stopwords停用词集合stopwords={"的","是"}max_words最大显示词数max_words=100generate()从文本生成词云wc.generate(text)generate_from_frequencies()从词频字典生成wc.generate_from_frequencies(freq)举例:从文件读取文本生成词云它的代码如下withopen("article.txt","r",encoding="utf-8")asf:text=f.read()wc=WordCloud(width=800,height=400,background_color="white").generate(text)plt.imshow(wc)plt.axis("off")plt.show()举例:自定义字体和颜色指定中文字体(避免中文乱码)wc=WordCloud(font_path="SimHei.ttf",#使用黑体(Windows自带)

width=800,height=400,background_color="white").generate("自然语言处理是人工智能的重要分支")设置颜色方案fromwordcloudimportWordCloud,get_single_color_funccolor_func=get_single_color_func("blue")#所有词用蓝色wc=WordCloud(color_func=color_func).generate(text)举例:过滤停用词使用stopwords参数排除无意义词(如“的”、“是”):stopwords={"的","是","在"}#自定义停用词wc=WordCloud(stopwords=stopwords).generate(text)或从文件加载:withopen("stopwords.txt","r",encoding="utf-8")asf:stopwords=set(f.read().splitlines())举例:调整词频权重通过generate_from_frequencies()直接传入词频字典freq={"Python":5,"Java":3,"C++":2,"JavaScript":1}wc=WordCloud().generate_from_frequencies(freq)plt.imshow(wc)plt.axis("off")plt.show()范例11-3wordcloud库生成一个心形词云应用wordcloud库对素材中的“phthon.txt”文件中的文本生成一个词云,并保存为图片。这个文本也更换为其它的长文本。原始参照图形如图所示。范例11-3wordcloud库生成一个心形词云它的代码如下importwordcloudfromimageioimportimread#导入imageio模块,用于读取图形#读取文本file=open('python.txt','r',encoding='utf-8')txt=file.read()#读取图片maskImage=imread('love.png')#图片形状#配置参数,并生成词云w=wordcloud.WordCloud(background_color="white",\width=600,height=500,mask=maskImage)w.generate(txt)#生成词云图片w.to_file("pywcloud.png")范例11-3wordcloud库生成一个心形词云它生成了一张图片pywcloud.png。它的宽是600,高是500,使用了图片love.png的词云形状,背景颜色为白色white。单词“Python”的词频最大,其次是“Tutorial”,从词云中可以很直观地看到那些是高频单词。案例:可视化中文词云项目03案例描述扶贫是保障贫困户的合法权益,取消贫困负担。2020年11月23日,中国832个国家级贫困县全部脱贫摘帽。我国脱贫攻坚取得的成就,见证了“中国力量”。消除绝对贫困是一项对中华民族、对人类都具有重大意义的伟业!小刘在一间大数据技术应用与开发公司工作,是一名Python程序员。他的项目经理要求小刘对一篇关于中国的精准扶贫的文章进行中文分词,并对高频出现的一些词语自动生成一个词云图片。这个词云图将会应用于一个大数据可视化大屏展示系统中。案例分析本项目可以用Python语言jieba结巴分词库对文章进行中文分词,统计出高频的词语,然后结合wordcloud词云库,自动化地生成词云。它的主要实施步骤为:1)使用IO函数,对文本文件的读取。2)应用jieba进行中文分词。3)词频统计。4)对词频进行排序。5)对高频词进行输出显示,并对分词使用空格拼接成字符串。6)读取图片,以生成词云的形状。7)设置wordcloud的参数,自动生成词云图片并保存。安装imread需要注意的是本案例要提前安装imread,如下:如果直接安装不成功,可以从网站/~gohlke/pythonlibs/下载whl文件进行安装。

#从国外镜像安装pipinstallimread#从国内清华镜像源安装pipinstall-i/pypi/web/simpleimread代码代码过长,不一一列举。详细代码,请查看教材。调试结果在代码编辑区按“Shift+F10”或者右键直接选择“运行”,即可调试,效果图如下所示,这是一个点赞的大拇指效果图。从效果图中可以看到词频最高的词语的字体最大。试一试1)请你找一些其它中文文章生成词云,看一下它的效果是如何的。比如中国的高铁事业、中国的航天事业、中国的北斗导航的故事等。2)请你找一些其它图形,以生成更具创新的词云形状。比如五角星、大拇指、树叶、某个人的头像、飞机的造型、高铁的造型等。感谢聆听制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件requests库的使用——网络爬虫库的应用制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件本课件为《Python编程基础与应用(第2版)》配套教学资源,由编写团队精心打造。为便于教学使用,团队同步提供了丰富的辅助材料,涵盖微课视频、教学课件、实训手册、习题答案、课程标准及程序源代码等。同时,教材配套超星教学示范包,支持一键克隆为网络在线课程,助力高效开展线上线下混合式教学。欢迎联系出版方订购使用。

书名:《Python编程基础与应用(第2版)》出版社:机械工业出版社主编:蓝永健、陈冬冬副主编:蔡德琛、朱海鑫、邓爱玲+contents目录requests的安装和简介requests的使用和示范爬虫与职业道德requests的安装和简介01requests的简介requests库是一个常用的用于http请求的模块,它使用python语言编写,可以方便地对网页进行爬取,是学习python爬虫的较好的http请求模块。requests库支持非常丰富的链接访问功能,包括域名和URL的获取、HTTP长连接和连接缓存、HTTP会话和cookie保持、浏览器的SSL验证、基本的制作摘要认证、有效的键值对cookie记录、自动解压缩、自动内容解码、文件分块上传、HTTP和HTTPS代理功能、连接超时处理、流数据下载等。Requests支持Python2.6—2.7以及3.3—3.7,而且能在PyPy下运行。requests的简介Requests是一个优雅而简单的PythonHTTP库。它允许你轻松地发送HTTP/1.1请求,无需手动添加查询字符串到URL,或者表单编码POST数据。Requests的主要特点:保持连接和连接池国际化域名和URL带持久Cookie的会话浏览器式的SSL认证自动内容解码基本/摘要式的身份认证优雅的键/值Cookie自动解压Unicode响应体多部分文件上传连接超时支持.netrc线程安全requests的安装有关它的更多介绍请访问英文网站https://2./en/latest/或者中文网站https://2./zh_CN/latest/index.html。它的安装方法很简单,可以直接使用PIP进行安装:#从国外镜像安装pipinstallrequests#从国内清华镜像源安装pipinstallrequests-i/pypi/web/simplerequests的基本方法(详细介绍)方法描述示例requests.get()发送

GET

请求,用于获取数据requests.get('/data',params={'key':'value'})requests.post()发送

POST

请求,用于提交数据requests.post('/submit',data={'key':'value'})requests.put()发送

PUT

请求,用于更新资源requests.put('/update',json={'id':1,'data':'new'})requests.delete()发送

DELETE

请求,用于删除资源requests.delete('/delete/1')requests.head()发送

HEAD

请求,只获取响应头(无响应体)requests.head('')requests.patch()发送

PATCH

请求,用于部分更新资源requests.patch('/patch',data={'key':'new'})requests.options()发送

OPTIONS

请求,用于获取服务器支持的HTTP方法requests.options('')response对象的常用参数(适用于所有方法)参数说明示例params字典类型,用于GET请求的URL参数params={'page':1,'limit':10}data字典或字符串,用于POST/PUT请求的表单数据data={'username':'admin','pwd':'123'}json字典类型,自动编码为JSON并设置Content-Type:application/jsonjson={'name':'Alice','age':25}headers字典类型,自定义请求头headers={'User-Agent':'Mozilla/5.0'}cookies字典类型,发送Cookiecookies={'session_id':'abc123'}timeout设置请求超时时间(秒)timeout=5allow_redirects布尔值,是否允许重定向(默认True)allow_redirects=Falseauth元组类型,用于HTTP基本认证auth=('user','pass')proxies字典类型,设置代理服务器proxies={'http':'0:3128'}response对象的一些属性(简单版)属性说明r.status_codehttp请求的返回状态,若为200则表示请求成功。r.texthttp响应内容的字符串形式,即返回的页面内容r.encoding从httpheader中猜测的相应内容编码方式r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)r.contenthttp响应内容的二进制形式response对象的一些属性(详细版)属性/方法说明示例response.status_codeHTTP状态码(如200、404)ifresponse.status_code==200:response.text返回响应内容(字符串形式)print(response.text)response.content返回响应内容(字节形式,适合非文本数据如图片)withopen('image.jpg','wb')asf:f.write(response.content)response.json()解析JSON响应为Python字典(需响应是JSON格式)data=response.json()response.headers返回响应头(字典形式)print(response.headers['Content-Type'])response.cookies获取服务器返回的Cookiesprint(response.cookies.get('session'))response.url获取最终请求的URL(含重定向)print(response.url)response.raise_for_status()如果状态码不是200,抛出异常response.raise_for_status()基本使用示例——发送GET请求importrequests#发送GET请求response=requests.get('')#查看响应状态码print(response.status_code)#200#查看响应内容print(response.text)#返回网页HTML内容基本使用示例——带参数的GET请求importrequests#定义查询参数params={'key1':'value1','key2':'value2'}#发送带参数的GET请求response=requests.get('/get',params=params)#查看最终请求的URLprint(response.url)#/get?key1=value1&key2=value2#查看JSON响应print(response.json())基本使用示例——发送POST请求importrequests#定义POST数据data={'username':'testuser','password':'testpass'}#发送POST请求response=requests.post('/post',data=data)#查看响应内容print(response.json())基本使用示例——发送JSON数据importrequestsimportjson#定义JSON数据data={'name':'JohnDoe','age':30,'city':'NewYork'}#发送JSON数据response=requests.post('/post',json=data)#查看响应print(response.json())基本使用示例——设置请求头importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)','Accept-Language':'en-US,en;q=0.9'}response=requests.get('',headers=headers)print(response.status_code)基本使用示例——处理Cookiesimportrequests#发送请求并获取Cookiesresponse=requests.get('')print(response.cookies)#发送带Cookies的请求cookies={'key':'value'}response=requests.get('/cookies',cookies=cookies)print(response.text)基本使用示例——处理超时importrequeststry:

#设置超时时间为3秒

response=requests.get('',timeout=3)print(response.status_code)exceptrequests.exceptions.Timeout:print("请求超时")基本使用示例——下载文件importrequestsurl='/sample.pdf'response=requests.get(url,stream=True)withopen('sample.pdf','wb')asf:forchunkinresponse.iter_content(chunk_size=1024):ifchunk:f.write(chunk)基本使用示例——使用会话(Session)importrequests#创建会话对象session=requests.Session()#设置公共请求头session.headers.update({'User-Agent':'MyCustomUserAgent/1.0'})#使用会话发送请求response1=session.get('/page1')response2=session.get('/page2')#会话会自动保持Cookies等信息基本使用示例——处理重定向importrequests#允许重定向(默认)response=requests.get('',allow_redirects=True)print(response.url)#会重定向到#禁止重定向response=requests.get('',allow_redirects=False)print(response.status_code)#301注意事项异常处理:在实际使用中应该添加异常处理遵守robots.txt:爬虫应遵守目标网站的robots.txt规则设置合理的请求间隔:避免对目标网站造成过大压力用户代理:设置合理的User-Agent合法性:确保你的爬虫行为符合法律法规和网站的使用条款requests的使用和示范02范例11-4requests的基本方法以下范例中使用简单的几行代码就可以实现抓取百度首页的信息。importrequestsresponse=requests.get("/")print('response类型:',type(response))#获取<class'requests.models.Response'>response类型print('获取状态码:',response.status_code)#200获取状态码print('网页cookies:',response.cookies)#获取网页cookies,RequestsCookieJarprint('请求头:',response.headers)#获取请求头#print(response.text)#获取网页源码#print(response.content)#获取网页源码范例11-4requests的基本方法其中response.text和response.content可以获取网页源码,读者可以自己尝试一下它的结果如下范例11-5使用requests下载一个网页到本地应用requests库可以快速地所一个URL网页的源码信息下载下来,并保存到本地。以下范例把百度新闻首页抓取下来并保存到文本文件newshtml.txt中。importrequests#使用requests的get()获取网页HTML代码,并编码r=requests.get('/')r.encoding='utf-8'#对中文进行utf-8编码,避免出现乱码#写入本地文件f=open(‘newshtml.txt’,mode=‘w’)#保存文件,使用参数wf.writelines(r.text)#写入多行f.close()#关闭文件print('网页抓取结束,并写入文件newshtml.txt成功')范例11-5使用requests下载一个网页到本地结果如下:网页抓取结束,并写入文件newshtml.txt成功提示:使用requests.get(url)可以抓取网页,也可以加上超时要求,如r=requests.get(url,timeout=30)表示请求超时时间为30秒。在文件夹中找到newshtml.txt并打开它,爬虫与职业道德-爬虫与职业道德据说互联网上50%以上的流量都是爬虫创造的,也许你看到很多热门数据都是爬虫所创造的,所以可以说无爬虫就无互联网的繁荣。曾有报道程序员因写爬虫而被刑侦的事件。爬虫与职业道德我家颁布《中华人民共和国网络安全法》之后,对网络安全有了更高的要求。随着中国经济的不断往前走,知识产权问题会越来越重视,非法爬虫是现在一个重要的打击部分。技术是无罪的,技术本身确实是没有对错的,但使用技术的人是有对错的。公司或者程序员如果明知使用其技术是非法的,那么他们就需要为之付出代价。爬虫与职业道德编写爬虫程序爬取数据之前,为了避免某些有版权的数据后期带来的诸多法律问题,可以通过查看网站的robots.txt文件来避免爬取某些网页。爬虫与职业道德robots协议,告知爬虫等搜索引擎那些页面可以抓取,哪些不能。它只是一个通行的道德规范,没有强制性规定,完全由个人意愿遵守。作为一名有道德的技术人员,遵守robots协议,有助于建立更好的互联网环境。网站的robots文件地址通常为网页主页后加robots.txt,如/robots.txt。感谢聆听制作:教材编写团队出版社:机械工业出版社《Python编程基础与应用》配套课件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参数默

温馨提示

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

最新文档

评论

0/150

提交评论