新浪微博生成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 思路分析
- 爬取微博内容,这里爬取id为2309846073的大V,目标URL为https://m.weibo.cn/u/2309846073;
- 查看API,containerid固定为10760+uid,page递增即可,返回json数据;

- 引入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数据会将存在一些我们不需要的非微博内容,比如以下图片:
同时设定100页退出抓取。
- pipeline中处理text内容,删除不需要的字符串,将内容输出到文本中。
class WeiboPipeline(object):
def process_item(self, item, spider):
if item['text'].find('<span') != -1:
item['text'] = item['text'][:item['text'].find('<span')]
if item['text'].find('//') != -1:
item['text'] = item['text'][:item['text'].find('//')]
if item['text'].find('<a') != -1:
item['text'] = item['text'][:item['text'].find('<a')]
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用于显示生成的图片。
先放个最终效果图吧。
plt.axis('off'),意思是轴不显示,注释这行代码看看:
把stopwords去掉,不去掉自定义词,即via,看看结果:
把mask参数去掉,使用默认图片,就是一矩形,同时最好设置一下height和width,看看结果:
把font_path去掉,使用默认字体,可以看到中文没有显示:

3 总结
最后说明一下:
* 自定义字体必须支持中文显示,不然还是会显示一个个口字;
* 背景图片最好选用分辨率高一点的,不然显示效果很差。
最最后再放个我用的背景图片吧:

以上。
本文介绍如何利用Scrapy爬取新浪微博内容,然后使用Wordcloud库生成词云。通过爬取指定UID的大V微博,解析JSON数据,过滤不需要的内容,处理后的文本通过词云展示。文章详细讲解了抓取过程、数据处理和词云生成的步骤,并给出了不同参数设置对词云效果的影响。
1335

被折叠的 条评论
为什么被折叠?



