【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析
本文作者:陈丹慧,中南财经政法大学金融学院
本文编辑:石 艳
技术总编:王子一
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 是所有链接的共同部分,id和mid两个参数是此条微博的标志。除了首页外,其他页的链接都带有一个参数max_id,可以判断这个参数是一个分页参数。并且,下一页链接的分页参数来自上一页请求返回的数据。如下图所示,首页返回的json文件中,max_id=606829996884589,包含在第二页的链接中。
在爬取微博评论过程中还有两点值得注意。
首先,爬取微博评论需要登录。因此,在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)
二、数据可视化
这里我们省略数据清洗步骤,直接看图。
微博的json文件对评论者的相关信息给的十分全面,评论者的个人主页链接、个性签名、关注与被关注数、城市、院校等用户公开信息都能找到,感兴趣的读者可以在爬取时自行提取相关信息。
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.词云图
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元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
“学术明星”——双重差分法(DID)的Stata操作
【爬虫实战】南京地铁又上热榜——客流量分析
Stata中字符串的处理
我在哪里?调用高德API获取地址经纬度信息
超级简单的条件函数,轻松生成虚拟变量
Python云端课程福利大放送!0基础也能学~
【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤
“人像动漫化”—Python实现抖音特效
《唐探3》做错了什么?|来自150万字影评的证据
爬虫俱乐部年度总结|《请回答2020》
模糊匹配我只用这一招!
利用tushare获取财务数据
爬虫实战|Selenium爬取微信公众号标题与链接
强大的正则表达式
自动群发邮件(二)——附带附件
自动群发邮件--email和smtplib基本模块的使用
计算工作日的小能手——workdays
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。