用 python 爬取微博评论并手动分词制作词云

最近上海好像有举行个什么维吾尔族的秘密时装秀,很好看的样子,不过我还没时间看。但是微博上已经吵翻了天,原因是

好吧,这不是我们关心的,我的心里只有学习

我爱学习

Python 爬虫

本次爬取的是这条微博

这条微博

微博的移动版网页还是比较好爬的,首先打开这条 微博的页面 ,然后按下 F12,打开开发者工具,选择 network 面板
然后鼠标滚轮向下滑,可以看到 network 面板产生新的请求,我们选择按 Type 排序,找到 xhr 类型

寻找评论接口

可以看到出现了两个奇怪的请求,它们的尾部都跟着 page = * ,我们选择其中一个双击,来到了一个新的页面


评论的 json 数据

这就是评论的 json 格式数据,这样,我们就找到了微博评论的 API 接口。

接下来就是 python 爬虫代码,有了 API 接口,爬虫也就不难写了

scrap_ximengyao_weibo.py

import requests
import json
import re

# source_wei_wo_url = "https://m.weibo.cn/status/4176281144304232"


def get_comment(head_url, count):
    i = 1
    fp = open("奚梦瑶.txt", "a", encoding="utf8")
    while i <= count:
        try:
            url = head_url + str(i)
            resp = requests.get(url)
            resp.encoding = resp.apparent_encoding
            comment_json = json.loads(resp.text)
            comments_list = comment_json["data"]
            for commment_item in comments_list:
                username = commment_item["user"]["screen_name"]
                comment = commment_item["text"]
                label_filter = re.compile(r'</?\w+[^>]*>', re.S)
                comment = re.sub(label_filter, '', comment)
                fp.write(comment)
            print(i)
        except Exception as e:
            print(str(i) + "遇到异常")
            continue
        i += 1
    fp.close()


if __name__ == "__main__":
    head_url = "https://m.weibo.cn/api/comments/show?id=4176281144304232&page="
    get_comment(head_url, 40000)

本来每请求一次接口就会返回来 10 条评论,目前她微博有 36 万评论,所以我把 while 循环设为了请求 40000 次,但是要全部爬完花的时间太长了,我可没那闲工夫一直等着它跑完。所以爬到 1 万多次的时候我就手动停止爬虫了

爬虫运行停止之后,我们在爬虫的同名目录下得到了一个 “奚梦瑶.txt”,大约包含了10万条网友评论。有的小伙伴就要开始问了,既然我们拿到了评论文本,现在是不是就可以进行分词了?

Too Young!

由于评论里包含了太多的 emoji 表情,直接分词的话会导致解码错误,所以我们还要再对评论进行一次过滤,过滤掉非中文字符,准确来说,是过滤掉非 GBK 编码字符

评论过滤

过滤的原理很简单,就是用 python 把“奚梦瑶.txt”这个文件读取进来,换个编码,然后再写入一个新文件“ximengyao.txt”

filter_ximengyao_weibo.py

fp = open("奚梦瑶.txt", encoding="utf-8", errors="ignore")
new_fp = open("ximengyao.txt", "w", encoding="gbk", errors="ignore")
try:
    all_text = fp.read()
    new_fp.write(all_text)
finally:
    fp.close()
    new_fp.close()

分词

分词的解决方案有很多,本来我是想直接用 图悦 在线分词生成词云的,但是文本太多了,图悦已经奔溃,后来我选择了 结巴分词 来手动分词

首先安装结巴分词
pip install jieba

我们的目的是选取评论中词频最高的 100 个词组,以降序将他们排列,然后做成词云。我在简书找到了一位网友写的博客,正好满足我们的需求
用jieba分词提取关键词做漂亮的词云

其实接下来你就可以去看他的博客了

这里贴一下我的分词代码,毕竟我是一个有始有终的人

jieba_ximengyao_weibo.py

import jieba.analyse

path = 'ximengyao.txt'
file_in = open(path, 'r')
content = file_in.read()

try:
    # jieba.analyse.set_stop_words('你的停用词表路径')
    tags = jieba.analyse.extract_tags(content, topK=100, withWeight=True)
    for v, n in tags:
        #权重是小数,为了凑整,乘了一万
        print(v + '\t' + str(int(n * 10000)))

finally:
    file_in.close()

有一点需要注意,这个 词云制作 网站是不支持中文字体的,所以你需要从网上下载一款中文字体,然后添加进去。

生成词云图

???

词频最高的词居然是“回复”

我这暴脾气

不过这也是情理之中,原创的评论有限,许多都是吵架,盖楼的。这里把我们把“回复”这个词删掉,用剩下的词重新制作一个词云

删掉“回复”

最终结果

词云图

郑重声明:最终结果不代表本人观点!

再见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容