python的requests_html库和词云分析2018政府工做报告全文

用掘金半年多了,可是历来都没有写过文章,最近恰好有时间加上手痒痒全部就有了这第一篇掘金文章。html

恰好最近在开十九大,2018政府工做报告全文出来了,在凤凰网能细细研读。做为一个程序员,怎么能忍受看那么多中文呢!因此果断来搞事啊!

思路大概就是:使用最近刚发布的for humans的requests_html库获取到报告全文,而后使用jieba来进行分词把分好的词就能够用wordcloud来作词云了。python

1. 获取数据

百度关键字 2018政府工做报告 能够发现有不少,连接我就打出来了news.ifeng.com/a/20180305/… 那咱们就来看看网页结构吧!程序员

网页的html结构
划出重点了(懒人能够对着那一堆中文右键copy→copy xpath 一键获取xpath路径),获取到路径以后咱们就能够愉快的使用chrome的xpath插件来查看路径对不对了(固然若是你想用beautifulsoup的话就是 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)
复制代码

上面这个图片就是返回的list,而后咱们遍历一下取出所有数据后拼接返回给jieba分词。

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
复制代码

2. jieba分词

分词其实很简单,只须要下面这一行代码就能够实现了。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的词,因而获得了下面图片的数据函数

3.生成词云

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)
复制代码
相关文章
相关标签/搜索