前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用Python对某娅偷逃税进行微博舆情分析~

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

原创
作者头像
陈晨135
发布2021-12-25 09:42:50
8620
发布2021-12-25 09:42:50
举报
文章被收录于专栏:Python小课堂

大家好,我是陈晨

前几天某娅因偷逃税被罚了13.41亿元,此消息一出,可是在网上激起了千层浪,网友们直接炸锅了。都在感慨,这辈子挣的钱不知道有没有人家交的罚款的零头多。

所以我爬取了这条微博下的数据,进行了一个简单的舆情分析!

01 分析页面

因为从移动端来对微博进行爬取较为方便,所以我们此次选择从移动端来对微博进行爬取。

平时我们都是在这个地方输入关键字,来对微博内容进行搜索。

我通过在开发者模式下对这个页面观察发现,它每次对关键字发起请求后,就会返回一个XHR响应。

图片
图片

我们现在已经找到数据真实存在的页面了,那就可以进行爬虫的常规操作了。

02 数据采集

在上面我们已经找到了数据存储的真实网页,现在我们只需对该网页发起请求,然后提取数据即可。

1 发送请求

通过对请求头进行观察,我们不难构造出请求代码。

构造代码如下:

代码语言:javascript
复制
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)

2 解析响应

图片
图片

从上面我们观察发现这个数据可以转化成字典来进行爬取,但是经过我实际测试发现,用正则来提取是最为简单方便的,所以这里展示的是正则提取的方式,有兴趣的读者可以尝试用字典方式来提取数据。代码如下:

代码语言:javascript
复制
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])

3 存储数据

数据已经解析好了,我们直接存储就可以了,这里我是将数据存储到csv文件中,代码如下:

代码语言:javascript
复制
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 数据清洗

数据采集完后,需要对其进行清洗,使其达到分析要求才可以进行可视化分析。

1 导入数据

用pandas读取爬取后的数据并预览。

代码语言:javascript
复制
import pandas as pd

df = pd.read_csv('薇娅.csv',encoding='gbk')
print(df.head(10))

2 日期转换

我们发现,月份中的数据是英文缩写,我们需要将其转化成数字,代码如下:

代码语言:javascript
复制
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)

3 查看数据类型

查看字段类型和缺失值情况,符合分析需要,无需另做处理。

代码语言:javascript
复制
df.info()
图片
图片

04 可视化分析

我们来对这些数据进行可视化分析。

1 每日微博数量

这里只爬取了近100页的数据,可能是导致20和21号的微博数据较少的原因。

代码如下:

代码语言:javascript
复制
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] notin 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")

2 评论点赞top10

我们发现斗图君小海星这个用户所发表的评论点赞数最多,有7.5w+,下面让我们看看它的评论是什么,竟然让用户这么喜欢。

点赞这么多可能是发的时间早,位置比较靠前,另一个原因可能是内容符合大家的心声。

3 评论时间分布

对所有评论发布时间进行分析,我们发现21点发表的评论数量最多,当时上到热搜榜的时候差不多也是这个时间,看来上不上热搜榜对微博的影响还是很大的。

代码如下:

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv('weiya.csv',encoding='gbk')
c=[]
d={}
a = 0
for i in list(df['时']):
    if i notin 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")

4 词云图

通过词云图我们可以看出,关键词偷逃漏税非常多,符合主题,其次是注销、封杀和坐牢,看来大家对于违法的行为还是很仇恨的。

代码如下:

代码语言:javascript
复制
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 notin 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 小结

网红和明星作为公众人物更要做好表率,不能享受名利的同时还干着违法的行为。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 分析页面
  • 02 数据采集
    • 1 发送请求
      • 2 解析响应
        • 3 存储数据
        • 03 数据清洗
          • 1 导入数据
            • 2 日期转换
              • 3 查看数据类型
              • 04 可视化分析
                • 1 每日微博数量
                  • 2 评论点赞top10
                    • 3 评论时间分布
                      • 4 词云图
                      • 05 小结
                      相关产品与服务
                      数据保险箱
                      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档