最近上海好像有举行个什么维吾尔族的秘密时装秀,很好看的样子,不过我还没时间看。但是微博上已经吵翻了天,原因是
好吧,这不是我们关心的,我的心里只有学习
Python 爬虫
本次爬取的是这条微博
微博的移动版网页还是比较好爬的,首先打开这条 微博的页面 ,然后按下 F12,打开开发者工具,选择 network 面板
然后鼠标滚轮向下滑,可以看到 network 面板产生新的请求,我们选择按 Type 排序,找到 xhr 类型
可以看到出现了两个奇怪的请求,它们的尾部都跟着 page = * ,我们选择其中一个双击,来到了一个新的页面
这就是评论的 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万条网友评论。有的小伙伴就要开始问了,既然我们拿到了评论文本,现在是不是就可以进行分词了?
由于评论里包含了太多的 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()
有一点需要注意,这个 词云制作 网站是不支持中文字体的,所以你需要从网上下载一款中文字体,然后添加进去。
生成词云图
词频最高的词居然是“回复”
不过这也是情理之中,原创的评论有限,许多都是吵架,盖楼的。这里把我们把“回复”这个词删掉,用剩下的词重新制作一个词云
最终结果
郑重声明:最终结果不代表本人观点!
再见!