详细介绍:DAY 15 复习日

@浙大疏锦行

数据使用爬虫爬取weibo数据,下面是代码

import datetime
import os
import csv
import time
import numpy as np
import random
import re
import urllib.parse
import requests
from fake_useragent import UserAgent
def init():
  if not os.path.exists('../weiboDeatail.csv'):
    with open('../weiboDeatail.csv', 'a', newline='', encoding='utf-8') as wf:
      writer = csv.writer(wf)
      writer.writerow(['articleId',
      'created_at',
      'likes_counts',
      'region',
      'content',
      'authorName',
      'authorGender',
      'authorAddress',
      'authorAvatar',])
      def save_to_file(resultData):
        with open('../weiboDeatail.csv', 'a', newline='', encoding='utf-8') as f:
          writer = csv.writer(f)
          writer.writerow(resultData)
          def get_data(url,params):
            headers = {
              'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
              'cookie': 'SINAGLOBAL=8782631946839.119.1699202998560; SUB=_2AkMQaTYef8NxqwFRmfoUz2jhb451yAzEieKmNcfFJRMxHRl-yj8XqhEbtRB6O-kY8WFdEr155S_EPSDhRZ5dRRmT-_aC; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWcQpMfOClpsGU0ylkr.Dg2; XSRF-TOKEN=pMdYpIdaKB-vThaLz_RPmMy7; _s_tentry=weibo.com; Apache=3448313847055.298.1731574115528; ULV=1731574115668:1:1:1:3448313847055.298.1731574115528:; WBPSESS=V0zdZ7jH8_6F0CA8c_ussWO_XbISeXyf_cdQhE-a7tA9YWqKR0HqFFlwwlm4O_tCVqfBbTqYra_IEAKvR3DtVLRWcGHqKNMZv9wHENJbx4l6rpBH3A2CNiiAuRQVin2ZNgg7rPufq9s7kOHoQJsAbLrUReKu8_UTai8PbfZrq7M='
            }
            response = requests.get(url, headers=headers,params=params)
            print(f"Response Status Code: {response.status_code}")
            print(f" response.text: { response.text }")
            if response.status_code == 200:
              return response.json()['data']
              else:
                return None
                def getAllArticleTypeList():
                  articleList=[]
                  with open('weibo1.csv', 'r', encoding='utf-8') as f:
                    readerCsv = csv.reader(f)
                    next(readerCsv)
                    for nav in readerCsv:
                      articleList.append(nav)
                      return articleList
                      def prase_json(response,articleId):
                        for comment in response:
                          articleId = articleId
                          created_at = datetime.datetime.strptime(comment['created_at'], '%a %b %d %H:%M:%S +0800 %Y').strftime('%Y-%m-%d %H:%M:%S')
                          likes_counts = comment['like_counts']
                          try:
                            region = comment['source'].replace('来自','')
                            except:
                              region = '无'
                              content = comment['text_raw']
                              authorName = comment['user']['screen_name']
                              authorGender = comment['user']['gender']
                              authorAddress = comment['user']['location']
                              authorAvatar = comment['user']['avatar_large']
                              print(articleId,
                              created_at,
                              likes_counts,
                              region,
                              content,
                              authorName,
                              authorGender,
                              authorAddress,
                              authorAvatar)
                              save_to_file([articleId,
                              created_at,
                              likes_counts,
                              region,
                              content,
                              authorName,
                              authorGender,
                              authorAddress,
                              authorAvatar])
                              # break
                              def start():
                                commentUrl='https://weibo.com/ajax/statuses/buildComments'
                                articleList=getAllArticleTypeList()
                                typeNumCount = 0
                                for article in articleList[1:]:
                                  articleId=article[0]
                                  print('正在获取id为%s的评论数据'%articleId)
                                  time.sleep(random.randint(1,5))
                                  params = {
                                    'id': int(articleId),
                                    'is_show_bulletin':3
                                  }
                                  response = get_data(commentUrl,params)
                                  prase_json(response,articleId)
                                  # break
                                  if __name__ == '__main__':
                                    init()
                                    start()

查看数据形状

import pandas as pd
# 读取数据
# 读取数据并添加表头
data = pd.read_csv(r'weiboDeatail.csv', header=None, names=['articleId', 'created_at', 'likes_counts', 'region', 'content', 'authorName', 'authorGender', 'authorAddress', 'authorAvatar'])
# 打印数据集的基本信息(列名、非空值数量、数据类型等)
print("data.info() - 数据集的基本信息(列名、非空值数量、数据类型等):")
print(data.info())
# 打印数据集的形状(行数和列数)
print("\ndata.shape - 数据集的形状(行数, 列数):")
print(data.shape)
# 打印数据集的所有列名
print("\ndata.columns - 数据集的所有列名:")
print(data.columns)
# 查看前5行数据
print("\n查看前5行数据:")
print(data.head())
# 查看后5行数据
print("\n查看后5行数据:")
print(data.tail())
# 查看是否有缺失值
print("\n查看是否有缺失值:")
print(data.isnull().sum())
# 检测是否有重复值
print("\n检测是否有重复值:")
print(data.duplicated().sum())
# 描述性统计
print("\n描述性统计:")
print(data.describe(include='all'))
# 删除操作:删除某一列(例如删除authorAvatar列)
print("\n删除操作:删除authorAvatar列")
data = data.drop(columns=['authorAvatar'])
print(data.columns)
# 查询操作:查询点赞数大于100的文章
print("\n查询操作:查询点赞数大于100的文章")
filtered_data = data[data['likes_counts'] > 100]
print(filtered_data)
# 排序操作:按点赞数降序排序
print("\n排序操作:按点赞数降序排序")
sorted_data = data.sort_values(by='likes_counts', ascending=False)
print(sorted_data.head())
# 分组操作:按地区分组并统计每个地区的文章数量
print("\n分组操作:按地区分组并统计每个地区的文章数量")
grouped_data = data.groupby('region').size()
print(grouped_data)

绘制分析图

可视化需求和图表类型
需求:绘制文章点赞数分布直方图
图表类型:直方图
含义:展示文章点赞数的分布情况,观察点赞数的集中区间和分布趋势。
需求:绘制文章发布地区分布柱形图
图表类型:柱形图
含义:展示不同地区发布文章的数量,识别文章发布最活跃的地区。
需求:绘制作者性别分布饼图
图表类型:饼图
含义:展示作者性别的比例,了解性别在作者群体中的分布情况。
需求:绘制文章内容关键词词云图
图表类型:词云图
含义:通过关键词的大小和颜色展示文章内容中最常见的词汇,识别热门话题。
需求:绘制文章作者地址分布柱形图
图表类型:柱形图
含义:展示不同地址的作者数量,识别作者分布最集中的地区。
需求:绘制文章发布时间分布直方图
图表类型:直方图
含义:展示文章发布时间的分布情况,观察文章发布的高峰时段。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import matplotlib.font_manager as fm
# 设置matplotlib支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题
# 读取数据
# 读取数据并添加表头
data = pd.read_csv(r'weiboDeatail.csv', header=None, names=['articleId', 'created_at', 'likes_counts', 'region', 'content', 'authorName', 'authorGender', 'authorAddress', 'authorAvatar'])
# 1. 绘制文章点赞数分布直方图
plt.figure(figsize=(10, 6))
sns.histplot(data['likes_counts'], bins=30, kde=True)
plt.title('文章点赞数分布直方图')
plt.xlabel('点赞数')
plt.ylabel('频数')
plt.show()
# 2. 绘制文章发布地区分布柱形图
plt.figure(figsize=(12, 6))
region_counts = data['region'].value_counts().head(10)
sns.barplot(x=region_counts.index, y=region_counts.values)
plt.title('文章发布地区分布柱形图')
plt.xlabel('地区')
plt.ylabel('文章数量')
plt.xticks(rotation=45)
plt.show()
# 3. 绘制作者性别分布饼图
plt.figure(figsize=(8, 8))
gender_counts = data['authorGender'].value_counts()
plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=140)
plt.title('作者性别分布饼图')
plt.show()
# 4. 绘制文章内容关键词词云图
plt.figure(figsize=(12, 8))
# 获取系统中的中文字体路径
font_path = fm.findfont(fm.FontProperties(family=['SimHei']))
wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(' '.join(data['content']))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('文章内容关键词词云图')
plt.show()
# 5. 绘制文章作者地址分布柱形图
plt.figure(figsize=(12, 6))
address_counts = data['authorAddress'].value_counts().head(10)
sns.barplot(x=address_counts.index, y=address_counts.values)
plt.title('文章作者地址分布柱形图')
plt.xlabel('作者地址')
plt.ylabel('作者数量')
plt.xticks(rotation=45)
plt.show()
# 6. 绘制文章发布时间分布直方图
plt.figure(figsize=(10, 6))
data['created_at'] = pd.to_datetime(data['created_at'])
sns.histplot(data['created_at'].dt.hour, bins=24, kde=True)
plt.title('文章发布时间分布直方图')
plt.xlabel('小时')
plt.ylabel('频数')
plt.show()
posted @ 2025-07-23 20:34  yjbjingcha  阅读(5)  评论(0)    收藏  举报