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

python爬取数据生成词云_python爬取文本中出场次数前30的人物,并生成词云、图表...

目录1.目标2.码前须知3.操作流程4.完整代码5.总结1.目标ython爬取三演义,生成词云、图表2.码前须知项目目标:三人物名称及出现次数-

ee5aba83472da2b574acb65b50a525d0.jpg

目录1.目标2.码前须知3.操作流程4.完整代码5.总结

1.目标

ython爬取三演义,生成词云、图表

2.码前须知

项目目标:三人物名称及出现次数-----数据统计分析

提出问题:哪个人物在三演义中出现的次数最多?,我们希望通过数据分析来获得答案。

分析工具:andas,Matlotb

iinstallbs4

iinstalllxml

iinstallandas

iinstallMatlotb

bs4数据解析必备知识点:标签定位,提取标签中的数据值

1.实例化一个BeautifSou对象,并将页面源码数据加载到该对象中,lxml是解析器,固定的参数,下面是举例

#本地html加载到该对象:

f=oen(’.test.html’,‘r’,encoding=‘utf-8’)

sou=BeautifSou(f,‘lxml’)

rint(sou)

#互联网上获取的源码数据(常用)

age_text=sonse.text

sou=BeautifSou(age_text,‘lxml’)

2.通过调用BeautifSou对象中相关的属性或者方法对标签进行定位和提取

bs4具体属性的用法

1.标签&#xff0c;如<>

等等

sou.tagName

例如

sou.a#返回的是html第一次出现的tagName的a标签

sou.div#返回的是html第一次出现的tagName的div标签

2.查找

sou.find(‘div’)用法相当于sou.div

属性定位,

sou.find(‘div’,class_&#61;‘song’)class_需要带下划线

class_idttr

3.所有符合条件的标签

sou.find_all(‘a’)#返回符合所有的a标签&#xff0c;也可以属性定位

4.select放置选择器类选择器..代表的就是tang

sou.select(’.tang’)

sou.select(‘某种选择器(id,class,标签&#xff0c;选择器)’)

返回的是一个列表

定位到标签下面的标签>表示标签一个层级选择器

sou.select(’.tang>>>a’[0])

空格表示多级选择器

sou.select(‘tang’>a’[0])与上述的表达式相同

常用层级选择器

5.获取标签中间的文本数据

sou.a.textstringget_text()

区别

textget_text():可以获取某一个标签中所有的文本内容&#xff0c;即使不是直系的文本

string:只可以获取直系文本

6.获取标签中的属性值

sou.a[‘hf’]相当于列表操作

3.操作流程

1.爬取数据来源&#xff1a;古诗词网《三演义》

2.编码流程&#xff1a;指定URL–htt:www.shicimingju.combookguoyanyi.html

发起请求–quests

获取响应数据—页面信息

数据解析(通过bs4)--1进行指定标签的定位;2取得标签当中的文本内容

持久化存储–保存文件2.文本词频统计&#xff1a;中文分词库–jieba库&#xff0c;具体的解释已在代码处声明

3.生成词云&#xff1a;wordcloud&#xff0c;具体的解释已在代码处声明

4.生成柱状分析图:matlotb&#xff0c;具体的解释已在代码处声明

–url首页–我们要的是这个目录的标题和点击后的页面内容点击后的页面&#xff0c;发现规律详细页面要获取的内容4.完整代码

frombs4imortBeautifSou

imortquests

imortjieba#优秀的中文分词第三方库

imortwordcloud

imortandasasd

frommatlotbimortylotaslt#1.对首页html进行爬取

url&#61;&#39;htt:www.shicimingju.combookguoyanyi.html&#39;

headers&#61;{

&#39;User-Agent&#39;:&#39;Mozilla5.0(Macintosh;IntelMacOSX10_12_0)AleWebKit537.36(KHTML,keGecko)Chrome69.0.3497.100Safari537.36&#39;,

}

f&#61;oen(&#39;.guo.txt&#39;,&#39;w&#39;,encoding&#61;&#39;utf-8&#39;)

age_text&#61;quests.get(url&#61;url,headers&#61;headers).text#2.数据解析

#实例化对象

sou&#61;BeautifSou(age_text,&#39;lxml&#39;)

#获得标签

_st&#61;sou.select(&#39;.book-mu>>&#39;)

#取得标签里的属性

forin_st:

#通过bs4的方法直接获取a标签直系文本

title&#61;.a.string

#对url进行拼接得到详情页的url

detail_url&#61;&#39;htt:www.shicimingju.com&#39;&#43;.a[&#39;hf&#39;]

#对详情页发起请求

detail_age_text&#61;quests.get(url&#61;detail_url,headers&#61;headers).text

#解析详情页的标签内容,重新实例化一个详情页bs对象,lxml解析器

detail_sou&#61;BeautifSou(detail_age_text,&#39;lxml&#39;)

#属性定位

div_tag&#61;detail_sou.find(&#39;div&#39;,class_&#61;&#39;chater_content&#39;)

#解析到了章节的内容&#xff0c;利用text方法获取

content&#61;div_tag.text

#持久化存储

f.write(title&#43;&#39;:&#39;&#43;content&#43;&#39;n&#39;)

rint(title,&#39;爬取成功!!!&#39;)

rint(&#39;爬取文本成功&#xff0c;进行下一步&#xff0c;jieba分词&#xff0c;并生成一个guo.xlsx文件用于数据分析&#39;)

#排除一些不是人名&#xff0c;但是出现次数比较靠前的单词

#精确模式&#xff0c;把文本精确的切分开&#xff0c;不存在冗余单词&#xff0c;返回列表类型

words&#61;jieba.lcut(txt)

#构造一个字典&#xff0c;来表达单词和出现频率的对应关系

counts&#61;{}

#逐一从words中取出每一个元素

forwordinwords:

#已经有这个键的话就把相应的值加1&#xff0c;没有的话就取值为0&#xff0c;再加1

iflen(word)&#61;&#61;1:

continue

efword&#61;&#61;"诸葛亮"orword&#61;&#61;"孔明曰":

rword&#61;"孔明"

efword&#61;&#61;"关公"orword&#61;&#61;"云长":

rword&#61;"关羽"

efword&#61;&#61;"玄德"orword&#61;&#61;"玄德曰":

rword&#61;"刘备"

efword&#61;&#61;"孟德"orword&#61;&#61;"丞相":

rword&#61;"曹操"

else:

rword&#61;word

#如果在里面返回他的次数&#xff0c;如果不在则添加到字典里面并加一

counts[rword]&#61;counts.get(rword,0)&#43;1

#删除停用词

forwordinexcludes:

delcounts[word]

#排序&#xff0c;变成st类型&#xff0c;并使用sort方法

items&#61;st(counts.items())

#对一个列表按照键值对的2个元素的第二个元素进行排序

#Tu从大到小&#xff0c;结果保存在items中&#xff0c;第一个元素就是出现次数最多的元素

items.sort(key&#61;lambdax:x[1],verse&#61;True)

#将前十个单词以及出现的次数打印出来

name&#61;[]

times&#61;[]

foriinrange(30):

word,count&#61;items[i]

rint("{0:<10}{1:>5}".format(word,count))

name.aend(word)

times.aend(count)rint(name)

rint(times)#创建索引

id&#61;[]

foriinrange(1,31):

id.aend(i)

#数据帧&#xff0c;相当于Excel中的一个工作表

df&#61;d.DataFrame({

&#39;id&#39;:id,

&#39;name&#39;:name,

&#39;times&#39;:times,

})

#自定义索引&#xff0c;不然andas会使用默认的索引&#xff0c;这会导致生成的工作表

#也会存在这些索引&#xff0c;默认从0开始

df&#61;df.set_index(&#39;id&#39;)

rint(df)

df.to_excel(&#39;guo.xlsx&#39;)

rint("DONE!")

rint(&#39;生成文件成功&#xff0c;进行下一步&#xff0c;生成词云&#39;)#词云部分

w&#61;wordcloud.WordCloud(

font_ath&#61;"C:\Windows\Fonts\simhei.ttf",#设置字体

background_color&#61;"white",#设置词云背景颜色

max_words&#61;1000,#词云允许最大词汇数

max_font_size&#61;100,#最大字体大小

random_state&#61;50#配色方案的种数

)

txt&#61;"".join(name)

w.generate(txt)

w.to_file("ciyun.ng")

rint("done!")

rint("词云生成并保存成功!!!,进行下一步生成柱状图")

dirath&#61;&#39;guo.xlsx&#39;

data&#61;d.ad_excel(dirath,index_col&#61;&#39;id&#39;,sheet_name&#61;&#39;Sheet1&#39;)#指定id列为索引

#rint(data.head())#到此数据正常

rint(&#39;OK!&#xff0c;到此数据正常&#39;)

#柱状图部分

#直接使用lt.bar()绘制柱状图,颜色紫罗兰

lt.bar(data.name,data.times,color&#61;"#87CEFA")

#添加中文字体支持

lt.rcParams[&#39;font.s-serif&#39;]&#61;[&#39;SimHei&#39;]

lt.rcParams[&#39;axes.unicode_minus&#39;]&#61;False

#设置标题&#xff0c;x轴&#xff0c;y轴&#xff0c;fontsize设置字号

lt.title(&#39;三人物名字前三十名出现的次数&#39;,fontsize&#61;16)

lt.xlabel(&#39;人名&#39;)

lt.ylabel(&#39;统计次数&#39;)

#因为X轴字体太长&#xff0c;利用rotation将其旋转90度

lt.xticks(data.name,rotation&#61;&#39;90&#39;)

#紧凑型布局&#xff0c;x轴太长为了显示全

lt.tight_layout()

imgname&#61;&#39;guo.jg&#39;#设置图片保存的位置

lt.savefig(imgname)#保存图片

lt.show()

rint(&#39;柱状图生成完毕!!!&#39;)

rint(&#39;所有程序执行完成&#39;)

5.总结

尽管我们说《三演义》对汉室、对刘备有很明显的倾向性&#xff0c;但人物出场最多的还是曹操&#xff0c;这个结果会不会让你们惊讶呢&#xff1f;

缺点&#xff1a;其实人物排序也不准&#xff0c;比如都督&#xff0c;如果指周瑜的话&#xff0c;周瑜的排名可能会再靠前



推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
啊明小窝日记
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有