1、目标python爬取三国演义生成词云和图表。2.编码前的注意事项。项目目标:三国演义人物姓名及出现次数-----数据统计分析提出问题:三国演义中哪个人物出现频率最高?,我们希望通过数据分析得到答案。分析工具:pandas、Matplotlibpipinstallbs4pipinstalllxmlpipinstallpandaspipinstallMatplotlibbs4数据分析必备知识点:标签定位、提取标签中的数据值1.实例化一个BeautifulSoup对象,将页面源数据加载到对象中,lxml就可以了是一个具有固定参数的解析器。以下是将本地html加载到此对象的示例:fp=open('./test.html','r',encoding='utf-8')soup=BeautifulSoup(fp,'lxml')print(soup)从网上获取的源码资料(常用)page_text=response.textsoup=BeautifulSoup(page_text,'lxml')2.通过调用BeautifulSoup对象中的相关属性或方法,定位到标签,提取bs4具体属性用法1.标签,如
等。出现的t??agName的div标签2.查找soup.find('div')用法相当于soup.div属性定位,
soup.find('div',class_='song')class_需要加下划线class_/id/attr3.Alleligibletagssoup.find_all('a')#返回所有匹配的a标签,也可用于属性定位4.选择放置选择器类选择器。.代表汤汤。select('.tang')soup.select('Somekindkindofselector(id,class,label,selector)')返回一个列表来定位标签下面的标签>表示标签的层次选择器soup.select('.tang>ul>li>a'[0])空格表示一个多级选择器soup.select('tang'>ula'[0])同上面的表达式普通级选择器5.获取文本数据soup.a中标签的中间。text/string/get_text()text/get_text()的区别:可以获取某个标签中的所有文本内容,即使不是直接文本字符串:也只能获取直接文本6.获取属性值soup.a['inthelabelhref']相当于列表操作3.操作过程1.爬取数据来源:古诗词网《三国演义》2.编码过程:指定URL--http://www.shicimingju.com/bo...发起请求--requests获取响应数据--分析页面信息数据(通过bs4)--1定位到指定标签;代码中已经声明了解释3.生成词云:wordcloud,具体解释已经在代码中声明了4.生成直方图:matplotlib,具体解释已经在代码中声明了4.完整代码比较外汇brokershttp://www.fx61.com/brokerlistfrombs4importBeautifulSoupimportrequestsimportjieba#优秀中文分词第三方库importwordcloudimportpandasasppdfrommatplotlibimportpyplotasplt1.抓取首页htmlurl='http://www.shicimingju.com/bo...'headers={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_12_0)AppleWebKit/537.36(KHTML,像Gecko)Chrome/69.0.3497.100Safari/537.36',}fp=open('./sanguo.txt','w',encoding='utf-8')page_text=requests.get(url=url,headers=标题).text2。数据分析实例化对象soup=BeautifulSoup(page_text,'lxml')获取li标签li_list=soup.select('.book-mulu>ul>li')获取li标签中的属性forliinli_list:直接获取a标签的直接文本通过bs4方法title=li.a.string拼接url得到详情页的urldetail_url='http://www.shicimingju.com'+li.a['href']向详情页发起请求detail_page_text=requests.get(url=detail_url,headers=headers).text解析详情页的tag内容,重新实例化一个详情页bs对象,lxml解析器detail_soup=BeautifulSoup(detail_page_text,'lxml')属性定位div_tag=detail_soup.find('div',class_='chapter_content')解析章节内容后,使用text方法获取content=div_tag.text持久化存储fp.write(title+':'+content+'\n')print(title,'抓取成功!!!')print('抓取文本成功,进入下一步,jieba分词,生成sanguo.xlsx文件进行数据分析')排除部分词that不是名字但是出现次数比较多《如何》、《主公》、《军士》、《左右》、《军马》、《带兵》、《次日》、《大喜》、《天下》、《东吴》、《所以》、《今日》、《不敢》、《魏兵》、《陛下》、《一人》、《都督》、《人马》、《不知》、《汉中》、《我看见》、《将军》、《东道主》、《舒兵》、《上马》、《大吼》、《太守》、《此人》、《王夫人》。》、《大当家》、《后来》、《身后》、《城中》、《天子》、《一方》、《何必》、《大军》、《突袭》、《先生》、《人》、《为什么》、《那么》、《先锋》、《不如》、《来这里》、《本来》、《让人》、《江东》、《下马》、《呐喊》、《正是》、《徐州》、《突然》、《如此》、《成都》、《不见》、《无名》、《大败》、《大事》、《后来》、《一军》、《引军》、《起兵》、《在军》、《应战》、《进军》、《惊》、《是》、《思》、《狂怒》、《不要》、《心》、《下一步》、《声音》、《追逐》、《美食》、《曹兵》、《在一起》、《分解》、《归来》、《付出》、《只》、《走出去》、《三千》、《将军》、《许都》、《随后》、《汇报》、《前线》、《士兵》、《说说》、《官员》、《洛阳》、《领兵》、《谁》、《星夜》、《精兵》、《上城》、《计划》、《拒绝》、《相遇》、《他的话》、《有一天》、《做》、《文武》、《襄阳》、《备战》、《如何》、《出征》、《亲自》、《必须有》、《此事》、《军师》、《在中》、《埋伏》、《岐山》、《趁势》、《忽见》、《笑》、《樊城》、《兄弟》、《第一关》、《立于》、《西川》、《朝廷》、《三军》、《国王》、《命令》、《为首》、《五百》、《一表》、《坚守》、《此时》、《B》etween","投降","五千","埋伏","长安","三"路","使者","英雄"}打开抓取的文件,并设置编码格式txt=open("sanguo.txt","r",encoding='utf-8').read()是精确模式,对文本进行精确分割,没有多余的词,返回列表类型为words=jieba.lcut(txt)构造字典表示词与频数的对应关系={}从words中逐个取每个词words中word的元素:如果已经有这个key,对应的值加1,如果没有,取值0,加1iflen(word)==1:continueelifword=="诸葛亮"orword=="孔明说":rword="孔明"elifword=="关公"orword=="允常":rword="关羽"elifword=="玄德"orword=="玄德说":rword="刘备"elifword=="孟德"orword=="丞相":rword="CaoCao"else:rword=如果这个词在里面,就返回他的count,如果没有,就加入字典,加上counts[rword]=counts.get(rword,0)+1删除excludes:del中单词的停用词counts[word]排序后成为列表类型,使用排序方法items=list(counts.items())根据键值对True的2个元素的第2个元素对一个列表进行排序,从大到small,结果存放在items中,第一个元素是出现次数最多的元素items.sort(key=lambdax:x[1],reverse=True)打印前十个单词和出现次数name=[]times=[]foriinrange(30):word,count=items[i]print("{0:<10}{1:>5}".format(word,count))name.append(word)复制代码次。append(count)print(name)print(times)创建一个索引id=[]foriinrange(1,31):id.append(i)数据框,相当于Excel中的工作表df=pd。DataFrame({'id':id,'name':name,'times':times,})自定义索引,否则pandas会使用默认索引,这会导致生成的worksheet也有这些索引,默认从0开始df=df.set_index('id')print(df)df.to_excel('sanguo.xlsx')print("DONE!")print('文件生成成功,进入下一步,生成词云')词云部分w=wordcloud.WordCloud(font_path="C:\\Windows\\Fonts\\simhei.ttf",#设置字体背景色_color="white",#设置词云背景色max_words=1000,#Wordcloud允许最大词汇量Numbermax_font_size=100,#maximumfontsizerandom_state=50#numberofcolorschemes)txt="".join(name)w.generate(txt)w.to_file("ciyun.png")print("done!")print("词云生成成功并保存!!!,进行下一步生成直方图")dirpath='sanguo.xlsx'data=pd.read_excel(dirpath,index_col='id',sheet_name='Sheet1')#指定id列为索引print(data.head())#数据正常print('OK!,数据正常')直方图部分直接使用plt。bar()绘制直方图,颜色为紫色plt.bar(data.name,data.times,color="#87CEFA")添加中文字体支持plt.rcParams['font.sans-serif']=['SimHei']铂。rcParams['axes.unicode_minus']=False设置标题,x轴,y轴,fontsize设置字体大小plt.title('三国前30个字符出现次数',fontsize=16)plt.xlabel('person'sname')plt.ylabel('Statistics')因为X轴字体太长,使用rotation将其旋转90度plt.xticks(data.name,rotation='90')compactlayout,x轴太长显示不全plt.tight_layout()imgname='sanguo.jpg'#设置图片保存位置plt.savefig(imgname)#保存图片plt.show()print('直方图生成!!!')print('所有程序都执行完毕')