Py学习  »  Python

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

Python绿色通道 • 2 年前 • 158 次点击  

↑ 关注 + 星标 ,每天学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. 分享用 Python 获得 A股数据的 4 种方法

  2. 安装这5个插件后,PyCharm好用到起飞!

  3. 用Python写了一个图像文字识别OCR工具

  4. 我们计划招收300位Python爱好者,免费学习商业数据分析和人工智能




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125668
 
158 次点击