用Python对某娅偷逃税进行微博舆情分析~

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. 本文仅供学习参考,不做它用。


推荐阅读

  1. 最近给公司撸了一个可视化大屏。

  2. 好朋友出书了!SQL数据分析,给大家争取到了五折福利,另文末送书。

  3. 你的花呗额度为啥那么低?我用Python帮你做分析

  4. 微信和QQ,终于可以互通了!

  5. 2022年春晚小品提前泄露!



浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报