用掘金半年多了,可是历来都没有写过文章,最近恰好有时间加上手痒痒全部就有了这第一篇掘金文章。html
思路大概就是:使用最近刚发布的for humans的requests_html库获取到报告全文,而后使用jieba来进行分词把分好的词就能够用wordcloud来作词云了。python
百度关键字 2018政府工做报告 能够发现有不少,连接我就打出来了news.ifeng.com/a/20180305/… 那咱们就来看看网页结构吧!程序员
div#main_content p
,我的不推荐用beautifulsoup,毕竟解析速度摆在那了)。
好了,获取到了咱们就开始开心的写代码吧!正则表达式
session= HTMLSession()
response= session.get(url)
report_text= response.html.xpath('//*[@id="main_content"]/p/text()')[:-1] if response.htmlis not None else 'NULL'
print(report_text)
复制代码
def get_info(url):
report= ''
session= HTMLSession()
response= session.get(url)
report_text= response.html.xpath('//*[@id="main_content"]/p/text()')[:-1] if response.htmlis not None else 'NULL'
print(report_text)
for iin report_text:
report+= i
return report
复制代码
分词其实很简单,只须要下面这一行代码就能够实现了。chrome
words= [wordfor wordin jieba.cut(report,cut_all=True) if len(word) >= 2]
bash
cut方法参数:(分词的字符串,cut_all是否打开全模式),全模式的意思就是会把一个词先后断句,好比:大傻逼,会分词成:大傻,傻逼和大傻逼 另外这里还作了下判断,长度大于等于2才算一个词。运行下把分词后list遍历下。session
到了这里我忽然想看一下高频词到底有哪些,因此用了一下collections的Count来计算一下dom
c = Counter(words)
for word_freq in c.most_common(10):
word, freq = word_freq
print(word, freq)
复制代码
选出频率前10的词,因而获得了下面图片的数据函数
python生成词云固然是用wordcloud,wordcloud是基于matplotlib的专门生成词云的库。工具
用这个库最关键的就是WordCloud构造函数:
参数详解:
font_path:字体路径,就是绘制词云用的字体,好比monaco.ttf
width:输出的画布宽度,默认400像素
height:输出的画布宽度,默认200像素
margin:画布偏移,默认2像素
prefer_horizontal: 词语水平方向排版出现的频率,默认0.9,垂直方向出现几率0.1
mask:若是参数为空,则使用二维遮罩绘制词云。若是 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask,除全白(#FFFFFF)的部分将不会绘制,其他部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布必定要设置为白色(#FFFFFF),而后显示的形状为不是白色的其余颜色。能够用ps工具将本身要显示的形状复制到一个纯白色的画布上再保存,就ok了。
scale:按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
color_func:生成新颜色的函数,若是为空,则使用 self.color_func
max_words:显示的词的最大个数
min_font_size:显示的最小字体大小
stopwords:须要屏蔽的词(字符串集合),为空使用内置STOPWORDS
random_state:若是给出了一个随机对象,用做生成一个随机数
background_color:背景颜色,默认为黑色
max_font_size:显示的最大的字体大小
font_step:字体步长,若是步长大于1,会加快运算可是可能致使结果出现较大的偏差
mode:当参数为"RGBA",而且background_color不为空时,背景为透明。默认RGB
relative_scaling:词频和字体大小的关联性,默认5
regexp:使用正则表达式分隔输入的文本
collocations:是否包括两个词的搭配
colormap:给每一个单词随机分配颜色,若指定color_func,则忽略该方法
normalize_plurals:是否删除尾随的词语
fit_words(frequencies) //根据词频生成词云
generate(text) //根据文本生成词云
generate_from_frequencies(frequencies[, ...]) #根据词频生成词云
generate_from_text(text) #根据文本生成词云
process_text(text) #将长文本分词并去除屏蔽词(此处指英语,中文分词仍是须要本身用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) # 对现有输出从新着色。从新上色会比从新生成整个词云快不少。
to_array() #转化为 numpy array
to_file(filename) #输出到文件
看到这里是否是懵了?反正我是看懵了,算了,直接写吧!
在这里我遇到了中文生成词云只出现框框没有字的bug!!!
path = r'simfang.tff'
查了一下路径要写成这样要否则会出现OSError: cannot open resource
的问题。 因此就有了下面的的代码
def word_cloud(word):
path= r'C:\Windows\Fonts\simfang.ttf' # 字体路径
bg_pic= imread(r'D:\blog\20160303160528046.png') # 读取模板图片
image_colors= ImageColorGenerator(bg_pic) # 从模板图片生成颜色值
wc= WordCloud(font_path=path,
background_color="white",
mask=bg_pic,
stopwords=STOPWORDS.add("said"),
max_font_size=500,
color_func=image_colors,
scale=1.5)
wc= wc.generate(word)
wc.to_file(r'D:\blog\result.jpg')
复制代码
根据官方的照片例子的出来的词云是这样的:
可是既然是政府工做报告,那确定要上个人偶像,全世界最大公司的老总
词云仍是很好玩的,很简单,对看数据很直观。话说今天把爬虫和数据分析小小结合起来,虽然都是皮毛,可是咱们仍是有将来的(是的,我偶像是这么说的)!今天跟一个朋友聊天,聊到了日常都在爬什么数据,而后他说你连视频都没爬过,被深深的鄙视了一番,估计这个星期会把爬视频这个技能学会,哈哈,下一篇文章就是爬视频的文章了(就决定是你了)!
照例在最后附一下所有的代码:
# -*- coding:utf-8 -*-
# 做者:Jason
import jieba
from requests_htmlimport HTMLSession
from collectionsimport Counter
from wordcloudimport WordCloud, STOPWORDS, ImageColorGenerator
from scipy.miscimport imread
target_url= 'http://news.ifeng.com/a/20180305/56472392_0.shtml'
def get_info(url):
report= ''
session= HTMLSession()
response= session.get(url)
report_text= response.html.xpath('//*[@id="main_content"]/p/text()')[:-1] if response.htmlis not None else 'NULL'
print(report_text)
for i in report_text:
report+= i
return report
def handle_word(report):
words= [wordfor wordin jieba.cut(report,cut_all=True) if len(word) >= 2]
# c = Counter(words)
# for word_freq in c.most_common(10):
# word, freq = word_freq
# print(word, freq)
return words
def word_cloud(word):
path= r'C:\Windows\Fonts\simfang.ttf' # 字体路径
bg_pic= imread(r'D:\blog\20160303160528046.png') # 读取模板图片
image_colors= ImageColorGenerator(bg_pic) # 从模板图片生成颜色值
wc= WordCloud(font_path=path,
background_color="white",
mask=bg_pic,
stopwords=STOPWORDS.add("said"),
max_font_size=500,
color_func=image_colors,
scale=1.5)
wc= wc.generate(word)
wc.to_file(r'D:\blog\result.jpg')
if __name__== '__main__':
words= handle_word(get_info(target_url))
data= r" ".join(words)
word_cloud(data)
复制代码