用Python对某娅偷逃税进行微博舆情分析~
共 4472字,需浏览 9分钟
·
2022-01-03 04:57
↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼包
前天某娅因偷逃税被罚了13.41亿元,此消息一出,可是在网上激起了千层浪,网友们直接炸锅了。志斌也很感慨,这辈子挣的钱不知道有没有人家交的罚款的零头多。
所以志斌爬取了这条微博下的数据,进行了一个简单的舆情分析!
01
分析页面
因为从移动端来对微博进行爬取较为方便,所以我们此次选择从移动端来对微博进行爬取。
平时我们都是在这个地方输入关键字,来对微博内容进行搜索。
我通过在开发者模式下对这个页面观察发现,它每次对关键字发起请求后,就会返回一个XHR响应。
我们现在已经找到数据真实存在的页面了,那就可以进行爬虫的常规操作了。
02
数据采集
在上面我们已经找到了数据存储的真实网页,现在我们只需对该网页发起请求,然后提取数据即可。
01
发送请求
通过对请求头进行观察,我们不难构造出请求代码。
构造代码如下:
key = input("请输入爬取关键字:")
for page in range(1,10):
params = (
('containerid', f'100103type=1&q={key}'),
('page_type', 'searchall'),
('page', str(page)),
)
response = requests.get('https://m.weibo.cn/api/container/getIndex', headers=headers, params=params)
02
解析响应
从上面我们观察发现这个数据可以转化成字典来进行爬取,但是经过我实际测试发现,用正则来提取是最为简单方便的,所以这里展示的是正则提取的方式,有兴趣的读者可以尝试用字典方式来提取数据。代码如下:
r = response.text
title = re.findall('"page_title":"(.*?)"',r)
comments_count = re.findall('"comments_count":(.*?),',r)
attitudes_count = re.findall('"attitudes_count":(.*?),',r)
for i in range(len(title)):
print(eval(f"'{title[i]}'"),comments_count[i],attitudes_count[i])
03
存储数据
数据已经解析好了,我们直接存储就可以了,这里我是将数据存储到csv文件中,代码如下:
for i in range(len(title)):
try:
with open(f'{key}.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([eval(f"'{title[i]}'"),comments_count[i],attitudes_count[i],reposts_count[i],created_at[i].split()[-1],created_at[i].split()[1],created_at[i].split()[2],created_at[i].split()[0],created_at[i].split()[3]])
except:
pass
03
数据清洗
数据采集完后,需要对其进行清洗,使其达到分析要求才可以进行可视化分析。
01
导入数据
用pandas读取爬取后的数据并预览。
import pandas as pd
df = pd.read_csv('薇娅.csv',encoding='gbk')
print(df.head(10))
02
日期转换
我们发现,月份中的数据是英文缩写,我们需要将其转化成数字,代码如下:
c = []
for i in list(df['月']):
if i == 'Nov':
c.append(11)
elif i == 'Dec':
c.append(12)
elif i == 'Apr':
c.append(4)
elif i == 'Jan':
c.append(1)
elif i == 'Oct':
c.append(10)
else:
c.append(7)
df['月'] = c
df.to_csv('薇娅.csv',encoding='gbk',index=False)
03
查看数据类型
查看字段类型和缺失值情况,符合分析需要,无需另做处理。
df.info()
04
可视化分析
我们来对这些数据进行可视化分析。
01
每日微博数量
志斌这里只爬取了近100页的数据,可能是导致20和21号的微博数据较少的原因。
代码如下:
from pyecharts.charts import Bar
from pyecharts import options as opts
from collections import Counter # 统计词频
c=[]
d={}
a = 0
for i in list(df['月']):
if i == 12:
if list(df['日'])[a] not in c:
c.append(list(df['日'])[a])
a+=1
a = 0
for i in c:
d[i]=0
for i in list(df['月']):
if i == 12:
d[list(df['日'])[a]]+=1
a += 1
columns = []
data = []
for k,v in d.items():
columns.append(k)
data.append(v)
bar = (
Bar()
.add_xaxis(columns)
.add_yaxis("条数", data)
.set_global_opts(title_opts=opts.TitleOpts(title="每日微博数量"))
)
bar.render("词频.html")
02
评论点赞top10
我们发现斗图君小海星这个用户所发表的评论点赞数最多,有7.5w+,下面让我们看看它的评论是什么,竟然让用户这么喜欢。
点赞这么多可能是发的时间早,位置比较靠前,另一个原因可能是内容符合大家的心声。
03
评论时间分布
对所有评论发布时间进行分析,我们发现21点发表的评论数量最多,当时上到热搜榜的时候差不多也是这个时间,看来上不上热搜榜对微博的影响还是很大的。
代码如下:
import pandas as pd
df = pd.read_csv('weiya.csv',encoding='gbk')
c=[]
d={}
a = 0
for i in list(df['时']):
if i not in c:
c.append(i)
a = 0
for i in c:
d[i]=0
for i in list(df['时']):
d[i]+=1
print(d)
from collections import Counter # 统计词频
from pyecharts.charts import Bar
from pyecharts import options as opts
columns = []
data = []
for k,v in d.items():
columns.append(k)
data.append(v)
bar = (
Bar()
.add_xaxis(columns)
.add_yaxis("时间", data)
.set_global_opts(title_opts=opts.TitleOpts(title="时间分布"))
)
bar.render("词频.html")
04
词云图
通过词云图我们可以看出,关键词偷逃漏税非常多,符合主题,其次是注销、封杀和坐牢,看来大家对于违法的行为还是很仇恨的。
代码如下:
from imageio import imread
import jieba
from wordcloud import WordCloud, STOPWORDS
with open("weiya.txt",encoding='utf-8') as f:
job_title_1 = f.read()
with open('停用词表.txt','r',encoding='utf-8') as f:
stop_word = f.read()
word = jieba.cut(job_title_1)
words = []
for i in list(word):
if i not in stop_word:
words.append(i)
contents_list_job_title = " ".join(words)
wc = WordCloud(stopwords=STOPWORDS.add("一个"), collocations=False,
background_color="white",
font_path=r"K:\苏新诗柳楷简.ttf",
width=400, height=300, random_state=42,
mask=imread('xin.jpg', pilmode="RGB")
)
wc.generate(contents_list_job_title)
wc.to_file("推荐语.png")
05
小结
1. 网红和明星作为公众人物更要做好表率,不能享受名利的同时还干着违法的行为。
2. 本文仅供学习参考,不做它用。
推荐阅读