使用新浪新闻制作词云图

2018.07.21新浪要闻词云图.png

想法

今天又不务正业了。
早上无意中看到了一个词云图,就想要是我也能做就好了。接着就上网搜索了一下,原来用Python也能做,而且也不是很难。于是就来了一个主意:要是能够每天,将新浪要闻的内容自动爬下来,生成一个词云图,应该很好玩。

新浪要闻.png

学习

想法明确了,第二步就是先学习。要实现目标,主要需要两个步骤。一是要想办法从新浪网新闻中爬出所有要闻的标题和内容,存放在文本文件中。第二个步聚就是将中文文本文件中的词提出来,按频率制作词云图。技术不懂不要紧,我问了度娘,找到了两篇相关主题的好文章,一个是博主Frange的 python用requests爬取新浪财经首页要闻 和博主温润有方的python3 wordcloud词云。这两个文单都写得特别好,果断收入印象笔记中,认真学习,并且做了费曼笔记。对其中看不懂的,例如lxml.etree,也是问百度对各个知识点各个击破。以前有一点点基础,两个小时以后,也就差不多弄懂了。他们的代码也很棒,我就不重复造轮子,很多代码在后就直接引用了。我后面的内容与得很简略,对这个主题感兴趣的请直接点击看大神的原文。

准备工作

  1. 安装Python 3 ,建议用Anaconda安装
  2. 安装Sublime
  3. 安装第三方库
    requests模块,
    lxml模块
    jieba模块
    WordCloud模块
  4. 找个图片做为词云背景图,我百度了个中国地图

实现

  1. 打开新浪新闻网首页http://news.sina.com.cn , 右击要闻内的新闻,检查元素(Edge浏览器), 我们得知要闻的div的id="syncad_1"。 所有要闻的url都存在于该div下面。

    新浪要闻

  2. 思路:
    2.1 用requests.get打开网页,然后用xpath("//div[@id='syncad_1']//a//@href")解析出所有重要新闻的网址url
    2.2 一个一个地打开要闻的url, 分别用xpath('//h1/text()')[0]和xpath('//div[@class="article"]/p//text()')打开文章的标题和内容,然后存入news.txt文件中。
    2.3 打开news.txt文件内容,使用jieba.cut_for_search将中文文本文件内容切分成词组,并存入一个list中。
    2.4 使用wordcloud,制作词云图。其中我们使用了test.jpg(一个中国地图)来设定了词云图的样子。
    2.5 将词云图存入test.png中

  3. 代码
    直接引用了两位原作者的大量代码,只是作了少量的修改。我没有重复造轮子,在此对原作者表示感谢。

#--------第一部分下载重要新闻---------------

import requests
from lxml import etree


def search_article(url):
    """
    请求所传的url
    args:
        url: 所要请求的url
    return:
        类lxml.etree._Element的元素, 可以直接用xpath解析
    """

    header = {
        'Accept': '*/*',
        'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                        'AppleWebKit/537.36 (KHTML, like Gecko) '
                        'Chrome/66.0.3359.181 Safari/537.36'
    }
    resp = requests.get(url, headers=header)
    html_str = str(resp.content, 'utf-8')
    selector = etree.HTML(html_str)
    return selector


def parse_html(selector):
    """
    解析提取的lxml.etree._Element的元素
    return:
        type:dict
            key:news title
            value: contents of news
    """
    try:
        title_text = selector.xpath('//h1/text()')[0]
        # 获取class=article的div下面的p标签的所有text()
        article_text = selector.xpath('//div[@class="article"]/p//text()')

        return {title_text: article_text}
    except Exception as e:
        return {'解析错误': [e]}


def write_article(article):
    """
    将所传的新闻字典写入文件news.txt中
    args:
        article:dict {news_title:[contents,]}
    No return
    """
    file_name = 'news.txt'
    f = open(file_name, 'a', encoding='utf-8')
    
    title = list(article.keys())[0]
    f.write("《"+title + "》"+'\n')
    #f.write(title + '\n')
   
    for content in article[title]:
        f.write(content+"\n")
    f.write("\n\n")
    f.close()


def extract_url(url):
    href_lists = search_article(url).xpath("//div[@id='syncad_1']//a//@href")
    return href_lists


if __name__ == '__main__':
    url = "http://news.sina.com.cn/"
    href_list = extract_url(url=url)
    file_name = 'news.txt'

    #清空文件
    f = open(file_name, 'w', encoding='utf-8')
    f.truncate()
    f.close()

    for href in href_list:
        # 排除非新浪连接
        if href.startswith("http://news.sina.com.cn/"):
            try:
                html = search_article(href)
                article = parse_html(html)
                write_article(article)
            except Exception as e:
                print(e)


####--------第二部份,生成词云---------------------------------------------

import jieba #jieba分词
import matplotlib.pyplot as plt#绘制图形
from scipy.misc import imread#处理图像
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator#词云

#一.文本获取,利用jieba分词获取文本中的词
file=open('news.txt',encoding='UTF-8').read()
word=' '.join(jieba.cut_for_search(file))


#二.词云背景图像获取
image=imread('test.jpg')  # 解析该图片

#三.词云设置
wc=WordCloud(
    mode='RGBA',#设置透明底色
    background_color='white',
    mask=image, #词云形状设置为背景图像
    max_words=200,#显示的词的最大个数
    font_path="C:\\Windows\\Fonts\\STFANGSO.ttf",#设置字体,否则中文可能会出现乱码
    scale=3#扩大三倍
)

#生成词云
image_colors = ImageColorGenerator(image)# 基于背景颜色设置字体色彩
wc.generate(word)#根据文本生成词云

#显示
plt.imshow(wc)#显示词云图
plt.axis("off")#关闭坐标轴
plt.show()#显示窗口
wc.to_file('test.png')# 保存图片

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容