查看原文
其他

【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈丹慧,中南财经政法大学金融学院

本文编辑:石 艳

技术总编:王子一

Stata&Python云端课程来啦!

     寒雪梅中尽,春风柳上归。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》;原价600元的正则表达式课程,现在仅需49.9元,详情请查看推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》;原价600元的基本字符串函数课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》;另外原价600元的网络爬虫课程,现在仅需49.9元,更多信息请查看推文《与春天有个约会,爬虫俱乐部重磅推出网络爬虫专题课程。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
上周,中美高层战略对话正式展开。#中美高层战略对话##中国人不吃这一套##美方预料到中方强硬回应##美方要求记者离开中方据理力争#等话题频上微博热搜,中国外交官的回应振奋人心,短短几个字看得热血沸腾。的确,两个甲子过去了,世界还是那个世界,但中国不再是曾经的那个中国,中国人不吃美国这一套!

今天呢,小编带大家走进人民日报官微,从数据角度看看走在冲浪前线的中国网民的态度。
一、爬取微博评论

本文今天将爬取的是人民日报这条点赞量高达150多万的微博下的高赞评论。

本次爬取的是这条微博的移动端,这是一种ajax异步数据交换动态网页,首先来认识下它的表象:我们进入目标网址(https://m.weibo.cn/detail/4616441393320149) ,按下F12,点击Network,选择XHR,刷新页面,可以找到含有评论信息的json文件。鼠标下滑,会不断出现新的json文件。因此称这种网页是一种ajax异步数据交换动态网页。

前三页json文件的链接如下:

首页链接:https://m.weibo.cn/comments/hotflow?id=4616441393320149&mid=4616441393320149&max_id_type=0

第二页链接:https://m.weibo.cn/comments/hotflow?id=4616441393320149&mid=4616441393320149&max_id=606829996884589&max_id_type=0

第三页链接:https://m.weibo.cn/comments/hotflow?id=4616441393320149&mid=4616441393320149&max_id=184342653876737&max_id_type=0

下面我们来探索其本质:分析json文件的链接,可以发现,https://m.weibo.cn/comments/hotflow?id=4616441393320149&mid=4616441393320149 是所有链接的共同部分,idmid两个参数是此条微博的标志。除了首页外,其他页的链接都带有一个参数max_id,可以判断这个参数是一个分页参数。并且,下一页链接的分页参数来自上一页请求返回的数据。如下图所示,首页返回的json文件中,max_id=606829996884589,包含在第二页的链接中。

因此,我们可以用requests.get()获取本页的相关数据和下一页的参数,在发送下一页请求时,提交从上一页获取的相关参数即可。

在爬取微博评论过程中还有两点值得注意

  • 首先,爬取微博评论需要登录。因此,在headers里一定要提交自己的cookie。
  • 另外,有些博主,如人民日报,开启了精选评论等过滤策略(如下图所示),发送请求的数据会返回{ok:0},此时,获取的评论就到达了极限。


1import os
2import requests
3import time
4import json
5
6os.makedirs("./新浪微博评论")
7os.chdir("./新浪微博评论")
8file='./人民日报微博评论.csv'
9with open(file,'w'as f:
10    f.write("评论人id,评论人昵称,评论人性别,内容,点赞量\n")
11BOOL=0
12max_id=0 #初始参数为0
13max_id_type=0 
14used_id=[] #用来储存分页参数
15headers={
16    "cookie""这里请输入您的cookie",
17    "referer":"https://m.weibo.cn/detail/4616441393320149",
18    "sec-fetch-dest""empty",
19    "sec-fetch-mode""same-origin",
20    "sec-fetch-site""same-origin",
21    "user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Mobile Safari/537.36"
22}
23for i in range(1,10000):
24    print("正在爬取第%s页"%i)
25    sourcecode = True
26    url="https://m.weibo.cn/comments/hotflow?id=4616441393320149&mid=4616441393320149"
27    pars={
28        "max_id":max_id,
29        "max_id_type":max_id_type
30    }
31    while sourcecode:
32        try:
33            html=requests.get(url,headers=headers,params=pars) #获取链接内容
34            sourcecode=False
35        except:
36            time.sleep(3)  
37    results=html.json() #解析为字典
38    try:
39        #获取下一个页面链接的参数
40        max_id = results["data"]["max_id"]  
41        max_id = int(max_id)  # 转为数字
42        max_id_type = results["data"]["max_id_type"]
43        max_id_type = int(max_id_type)
44        #从字典的子字典以及列表元素中提取所需信息
45        for i in results["data"]["data"]:
46            user_id=i["user"]["id"]
47            user_name=i["user"]["screen_name"]
48            user_gender=i["user"]["gender"]
49            comment=i["text"]
50            like_count=i["like_count"]
51            with open(file,'a',errors='ignore'as f: #添加ignore,忽略部分特殊符号报错
52                f.write('%s,%s,%s,%s,%s,%s\n'%(user_id,user_name,user_gender,comment,like_count,reply_count))
53            time.sleep(3)
54        print(max_id)
55        if max_id in used_id:
56            BOOL=1
57        used_id.append(max_id) 
58    except:
59        BOOL=1
60    if BOOL: #爬取出错或爬取完毕,则跳出循环
61        break
62    time.sleep(2)
最终爬取的部分数据如下图所示:

二、数据可视化 

这里我们省略数据清洗步骤,直接看图。

1.评论者性别差异

微博的json文件对评论者的相关信息给的十分全面,评论者的个人主页链接、个性签名、关注与被关注数、城市、院校等用户公开信息都能找到,感兴趣的读者可以在爬取时自行提取相关信息。

本文爬取了评论者的性别信息,结果令人十分惊奇。一般来说,男性用户更加关注军事财经新闻,女性更加关注时尚娱乐新闻。但在人民日报这条微博下,被高赞用户女性居多,在样本中占比接近80%,这或许能打破一些刻板印象。
1import pandas as pd
2from pandas import DataFrame
3
4import matplotlib.pyplot as plt
5data = pd.read_csv("人民日报微博评论.csv",encoding="gbk"#读取人民日报微博评论.csv
6df=data["评论人性别"].value_counts() #统计频数
7df.plot.pie(figsize=(5,5),title="高赞评论性别差异",autopct="%.2f%%",legend=True,fontsize=10)


2.情感分析

对获取的微博评论进行情感分析,发现大多数评论的情绪指数较高,个别评论情绪指数较低。这反映了网民们一边群情激昂地支持人民日报的观点,一边难以抑制愤怒之情在评论下方批判美方做法。积极评论的占大多数,也说明今天的中国人充满了实力自信与文化自信。

3.词云图

词云图的基本制作,在之前的推文的介绍过多次。今天导入ImageColorGenerator模块,改掉之前的花花绿绿,将字体颜色设置成中国红。
1import  numpy as np
2from wordcloud import ImageColorGenerator #导入对应模块
3from PIL import Image
4
5graph=Image.open("颜色.jpg"#选取图片
6colorgraph=np.array(graph)
7image_color=ImageColorGenerator(colorgraph)
8#生成词云图时,添加color_func=image_color参数即可
人民日报这条微博评论的词云图如下所示。


“中国人不吃这一套”是词频最高的语句(ps:对于这种特定话题,在词云图中,需要添加到词典,避免被分词),可以强势的表达出中国人民的态度。“自强”“硬气”“威武”“实力”等也是典型的高频词,体现了网民们对我们日益强盛国力由衷的自豪感,对我们伟大祖国强烈的认同感!百年了,我们的国家不再低头,而是满怀自信的平视这个世界!盛气凌人,以势压人,不是对话的正确方式,中国人不吃这一套 !

最后要感谢我国得力的外交官及其中国代表团,您们辛苦了,向您们致以崇高的敬意!


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐
进化的标签管理助手——elabel命令

“学术明星”——双重差分法(DID)的Stata操作

偷懒小妙招| selenium之玩转鼠标键盘操作(上)

【爬虫实战】南京地铁又上热榜——客流量分析

renfiles:批量重命名文件的利器

Stata中字符串的处理

物以类聚——浅述k-means聚类算法

我在哪里?调用高德API获取地址经纬度信息

超级简单的条件函数,轻松生成虚拟变量

Python云端课程福利大放送!0基础也能学~

【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤

“人像动漫化”—Python实现抖音特效

跨框架合并数据|frlink的用法,你get到了吗

《唐探3》做错了什么?|来自150万字影评的证据

爬虫俱乐部年度总结|《请回答2020》

春节假期临近,来爬爬豆瓣看看有什么好剧

putdocx生成Word文档so easy!

模糊匹配我只用这一招!

利用tushare获取财务数据

爬虫实战|Selenium爬取微信公众号标题与链接

轻轻一点,就知有没有|rqrs命令介绍

强大的正则表达式

自动群发邮件(二)——附带附件

自动群发邮件--email和smtplib基本模块的使用

批量处理变量名和标签的小方法

计算工作日的小能手——workdays

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存