新浪微博生成词云

新浪微博生成Wordcloud(词云)


1 前言

1.1 目的

本篇主要介绍新浪微博内容生成Wordcloud(词云),我举了一个炒鸡简单的例子。

1.2 工具

  • Wordcloud 词云(pip install wordcloud安装即可)
  • jieba 分词(pip install jieba安装即可)

1.3 相关网址

Wordcloud API References:http://amueller.github.io/word_cloud/references.html
微博内容API:https://m.weibo.cn/api/container/getIndex?type=uid&value=2309846073&containerid=1076032309846073&page=1


2 过程

2.1 思路分析

  1. 爬取微博内容,这里爬取id为2309846073的大V,目标URL为https://m.weibo.cn/u/2309846073;
  2. 查看API,containerid固定为10760+uid,page递增即可,返回json数据;
    新浪微博生成词云_第1张图片
  3. 引入Wordcloud模块,生成词云。

2.2 步骤

  • 本人用Scrapy实现数据抓取,Spider下parse改写如下:
    def parse(self, response):
        json_body = json.loads(response.body)
        data = json_body['data']
        cards = data['cards']
        for card in cards:
            if card['card_type'] != 9:
                continue
            mblog = card['mblog']
            item = WeiboItem()
            item['text'] = mblog['text']
            item['source'] = mblog['source']
            item['reposts_count'] = mblog['reposts_count']
            item['comments_count'] = mblog['comments_count']
            item['attitudes_count'] = mblog['attitudes_count']
            yield item
        if self.page >= 100:
            raise FileNotFoundError
        self.page += 1
        next_url = self.base_url % (self.value, self.container_id, self.page)
        yield scrapy.Request(next_url)

其中:

if card['card_type'] != 9:
                continue

的因为json数据会将存在一些我们不需要的非微博内容,比如以下图片:
新浪微博生成词云_第2张图片
同时设定100页退出抓取。

  • pipeline中处理text内容,删除不需要的字符串,将内容输出到文本中。
class WeiboPipeline(object):
    def process_item(self, item, spider):
        if item['text'].find(') != -1:
            item['text'] = item['text'][:item['text'].find(')]
        if item['text'].find('//') != -1:
            item['text'] = item['text'][:item['text'].find('//')]
        if item['text'].find(') != -1:
            item['text'] = item['text'][:item['text'].find(')]
        with open('result.txt', 'a+', encoding='utf-8')as f:
            f.write(item['text'])
        return item
  • 生成词云
from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt
import jieba

with open('result.txt', 'r', encoding='utf-8') as f:
    f_text = f.read()
    res = jieba.cut(f_text)
    res_text = ' '.join(res)
    background_img = plt.imread('bg.jpg')
    STOPWORDS.add('via')
    wc = WordCloud(background_color="white",mask=background_img,stopwords=STOPWORDS, font_path='SourceHanSans-Normal.ttf').generate(res_text)
    plt.imshow(wc)
    plt.axis('off')
    plt.show()

其中,引用STOPWORDS是因用来去掉我不想显示的词(via),mask参数用来修改背景图片,否则是一个矩形,font_path用于引入自定义字体,默认字体不显示中文,matplotlib.pyplot用于显示生成的图片。
先放个最终效果图吧。
新浪微博生成词云_第3张图片
plt.axis('off'),意思是轴不显示,注释这行代码看看:
新浪微博生成词云_第4张图片
stopwords去掉,不去掉自定义词,即via,看看结果:
新浪微博生成词云_第5张图片
mask参数去掉,使用默认图片,就是一矩形,同时最好设置一下heightwidth,看看结果:
新浪微博生成词云_第6张图片
font_path去掉,使用默认字体,可以看到中文没有显示:
新浪微博生成词云_第7张图片


3 总结

最后说明一下:
* 自定义字体必须支持中文显示,不然还是会显示一个个口字;
* 背景图片最好选用分辨率高一点的,不然显示效果很差。
最最后再放个我用的背景图片吧:
新浪微博生成词云_第8张图片


以上。

你可能感兴趣的:(Python)