背景
数据分析是个好玩又有意义的事情,作为微博资深用户,通过词云来分析这些年自己到底写了些啥,从旁观者角度认识自己,想想都好玩,同时学习数据分析。
前提
需要爬取微博数据,在这之情弄清楚是否合法。因为爬取自己微博数据,只是学习使用,无商业目的,善意的爬虫,应该可以。
进入正题
1.工具&库
python3.7
引用python库:
jieba:python的中文分词组件,pip或者conda安装。三种分词模式:精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
缺点:对歧义词和停用词无法区分,可构造自定义词库规避该缺点。
imread:读取图片数据函数。很多词云案例中,给出的是从scipy中引入,但scipy官方最新版已经取消该函数的使用,若安装的最新版scipy,基本会报错。改用从imageio引入可解决,from imageio import imread。
matplotlib:python画图库
wordcloud:词云库
requests:Python HTTP 库
2.脚本步骤
步骤1:抓取微博数据使用chrome浏览器,打开微博移动端网址https://m.weibo.cn/,并打开浏览器调试功能,查看获取个人用户下的微博状态列表url,request和response。
其中API为:https://m.weibo.cn/api/container/getIndex,uid和containerid是与账户相关的query parameter,可写成抓取微博数据函数的入参。
获取目标:response中每条数据的mblog.text,该内容为微博发布内容,获取后存入txt文件,供生成词云使用。
url = "https://m.weibo.cn/api/container/getIndex"
params = {"uid": "{uid}",
"luicode": "20000174",
"featurecode": "20000320",
"type": "uid",
"value": "1705822647",
"containerid": "{containerid}",
"page": "{page}"}
def fetch_data(uid=None, container_id=None):
"""抓取数据,并保存到txt文件"""
page = 0
total = 660 #抓取的微博条数,可自定义
blogs = []
for i in range(0, total // 10):
params['uid'] = uid
params['page'] = str(page)
params['containerid'] = container_id
res = requests.get(url, params=params, headers=headers)
cards = res.json().get("data").get("cards")
for card in cards:
# 获取每条微博的正文内容
if card.get("card_type") == 9:
text = card.get("mblog").get("text")
text = clean_html(text)
blogs.append(text)
page += 1
print("抓取第{page}页,目前总共抓取了{count}条微博".format(page=page, count=len(blogs)))
with codecs.open('weibo1.txt', 'w', encoding='utf-8') as f:
f.write("\n".join(blogs))
步骤2:生成词云图将爬取的文本内容存入文本后,进入生成词云步骤
该步骤未做复杂处理,利用jieba分词功能进行分词,未做歧义和停用词处理
分词完毕后,用WordCloud生成词云
用matplotlib画出词云图
def generate_image():
data = []
jieba.analyse.set_stop_words("./stopwords.txt")
with codecs.open("weibo1.txt", 'r', encoding="utf-8") as f:
for text in f.readlines():
data.extend(jieba.analyse.extract_tags(text, topK=20))
data = " ".join(data)
mask_img = imread('111.jpeg')
wordcloud = WordCloud(
font_path='/Library/Fonts/Songti.ttc',
background_color='white',
max_words=100,
mask=mask_img
).generate(data)
plt.title(u"word cloud")
plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),
interpolation="bilinear")
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig('./myblog.jpg', dpi=1600)
plt.show()
运行结果
从自己微博的词云图,可以看出,我的微博真的是日常感想抒发地,多感觉词语,描述词语,而且每次旅行的时候更爱发微博,旅行地点基本都被记录了
参考资料:Python 任意中文文本生成词云 最终版本blog.csdn.netPython爬取微博数据生成词云图片blog.csdn.net