本篇主要介绍新浪微博内容生成Wordcloud(词云),我举了一个炒鸡简单的例子。
pip install wordcloud
安装即可)pip install jieba
安装即可)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
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页退出抓取。
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
用于显示生成的图片。
先放个最终效果图吧。
plt.axis('off')
,意思是轴不显示,注释这行代码看看:
把stopwords
去掉,不去掉自定义词,即via
,看看结果:
把mask
参数去掉,使用默认图片,就是一矩形,同时最好设置一下height
和width
,看看结果:
把font_path
去掉,使用默认字体,可以看到中文没有显示:
最后说明一下:
* 自定义字体必须支持中文显示,不然还是会显示一个个口字;
* 背景图片最好选用分辨率高一点的,不然显示效果很差。
最最后再放个我用的背景图片吧:
以上。