当前位置: 首页 > article >正文

爬取网易云歌单信息并分析

一、项目介绍

1. 操作环境

(1)操作系统:Windows10;

(2)JDK版本:1.8;

(3)MySQL版本:8.0.20;

(4)Python版本:3.10.9;

(5)PyCharm版本:2022;

2. 项目目的

(1)通过爬虫技术爬取网易云音乐歌单信息,包括歌单索引信息、详情信息等,然后保存到本地。

(2)将爬取到的信息进行数据预处理、数据清洗,包括是否有缺失值、处理缺失值、数据转换等。

(3)将爬取到的信息保存到MySQL数据库中。

(4)采用统计汇总和统计的方法对数据进行总结,将数据可视化出来。

二、爬虫获取数据并解析数据

1. 找到存储歌曲地址的url界面

首先进入网易云的web界面,随意选择一首歌曲,打开开发者工具查看相应的界面。

在这些界面中我们需要查找存储有音乐文件的url,直接打开全局搜索进行搜索。

进行查看

从上面的界面中可以知道该界面返回了哪些参数,如 “code:200”成功请求,“id”歌曲的id号,即身份证号,“url”地址等。

2. 对比寻找需要的传递解密参数

尝试打开不同的歌曲发现返回的参数不完全相同,就要设置一些措施来解决这个问题,即反爬。希望在每一个爬虫时都要构造请求头,需要注意浏览器自带的代理地址、cookie有时效性的身份认证,里面有时带有必要的参数,需要破解。

3. 先爬取歌单索引页

这里选择了华语热门歌单页面,通过爬虫获取歌单播放量、名称、作者及歌单详情页链接。

代码:

from bs4 import BeautifulSoup
import requests
import time
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
for i in range(0, 1330, 35):
    print(i)
    time.sleep(2)
    url = 'https://music.163.com/discover/playlist/?cat=欧美&order=hot&limit=35&offset=' + str(i)
    response = requests.get(url=url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    # 获取包含歌单详情页网址的标签
    ids = soup.select('.dec a')
    # 获取包含歌单索引页信息的标签
    lis = soup.select('#m-pl-container li')
    print(len(lis))
    for j in range(len(lis)):
        # 获取歌单详情页地址
        url = ids[j]['href']
        # 获取歌单标题,替换英文分割符
        title = ids[j]['title'].replace(',', ',')
        # 获取歌单播放量
        play = lis[j].select('.nb')[0].get_text()
        # 获取歌单贡献者名字
        user = lis[j].select('p')[1].select('a')[0].get_text()
        # 输出歌单索引页信息
        print(url, title, play, user)
        # 将信息写入CSV文件中
        with open('music_list.csv', 'a+', encoding='utf-8-sig') as f:
            f.write(url + ',' + title + ',' + play + ',' + user + '\n')

运行结果:

共获取了1330张华语歌单。

4. 再爬取歌单详情页

根据歌单索引表,去获取每张歌单里面的歌单详情信息,包括歌单名、标签、介绍、收藏量、评论数、播放量等。运行代码时,出现如下错误:

问题出现在试图访问 soup.select('#content-operation i')[1] 的索引为1的元素时,而实际上这个列表的长度可能小于2,导致 "list index out of range" 错误。解决方法,将

collection = soup.select('#content-operation i')[1].get_text().replace('(', '').replace(')', '')

改为:

if soup.select('#content-operation i'):
    collection_elements = soup.select('#content-operation i')
    if len(collection_elements) > 1:
        collection = collection_elements[1].get_text().replace('(', '').replace(')', '')
    else:
        collection = "未获取到收藏量"
else:
    collection = "未获取到收藏量"

最终代码为:

from bs4 import BeautifulSoup
import pandas as pd
import requests
import time
df = pd.read_csv('music_list.csv', header=None, on_bad_lines='skip', names=['url', 'title', 'play', 'user'])
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
for i in df['url']:
    time.sleep(2)
    url = 'https://music.163.com' + i
    response = requests.get(url=url, headers=headers)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    # 获取歌单标题
    title_elements = soup.select('h2')
    if title_elements:
        title = title_elements[0].get_text().replace(',', ',')
    else:
        title = "未找到标题"
    # 获取标签
    tags = []
    tags_message = soup.select('.u-tag i')
    for p in tags_message:
        tags.append(p.get_text())
    # 对标签进行格式化
    if len(tags_message) > 0:
        for p in tags_message:
            tags.append(p.get_text())
        # 对标签进行格式化
        if len(tags) > 1:
            tag = '-'.join(tags)
        else:
            tag = tags[0]
    else:
        tag = "无标签"
    # 获取歌单介绍
    if soup.select('#album-desc-more'):
        text = soup.select('#album-desc-more')[0].get_text().replace('\n', '').replace(',', ',')
    else:
        text = '无歌单介绍'
    # 获取歌单收藏量
    if soup.select('#content-operation i'):
        collection_elements = soup.select('#content-operation i')
        if len(collection_elements) > 1:
            collection = collection_elements[1].get_text().replace('(', '').replace(')', '')
        else:
            collection = "未获取到收藏量"
    else:
        collection = "未获取到收藏量"
    # 歌单播放量
    play = soup.select('.s-fc6')[0].get_text()
    # 歌单内歌曲数
    playlist_track_count_elements = soup.select('#playlist-track-count')
    if playlist_track_count_elements:
        songs = playlist_track_count_elements[0].get_text()
    else:
        songs = "未获取到该歌单的歌曲数"
    # 歌单评论数
    comments_element = soup.select('#cnt_comment_count')
    if comments_element:
        comments = comments_element[0].get_text()
    else:
        comments = '未找到评论'
    # 输出歌单详情页信息
    print(title, tag, text, collection, play, songs, comments)
    # 将详情页信息写入CSV文件中
    with open('music_message.csv', 'a+', encoding='utf-8-sig') as f:
        f.write(title + ',' + tag + ',' + text + ',' + collection + ',' + play + ',' + songs + ',' + comments + '\n')
    # 获取歌单内歌曲名称
    li = soup.select('.f-hide li a')
    for j in li:
        with open('music_name.csv', 'a+', encoding='utf-8-sig') as f:
            f.write(j.get_text() + '\n')

运行代码,并查看结果数据:

三、数据清洗

将获取到的数据进行进行清洗:

df = pd.read_csv('music_message.csv', header=None)
# 数据清洗
dom = []
for i in df[3]:
    dom.append(int(i.replace('万', '0000')))

df['collection'] = dom

# 爬取到评论数列,有些为“评论”将其设置为默认值
df['love'] = [int(i.replace('评论', '0')) for i in df[6]]

运行时出现如下错误:

因为有些信息为爬取到,就用中文代替了,将:

for i in df[3]:
    dom.append(int(i.replace('万', '0000')))

改为:

for i in df[3]:
    if i.isdigit():
        dom.append(int(i.replace('万', '0000')))
    else:
        # 如果不是数字字符,表示未获取到收藏量,将其设置为0
        dom.append(0)

然后用Excel打开music_message.csv文件进行查看数据,发现:

有三条未爬取到的数据,将其删除。然后运行代码,进行数据清洗。

四、保存到MySQL数据库

先用Python创建数据库连接,连接到data数据库,再创建music_list、music_massage表,再读入CSV文件,分别将其写入到数据库中。代码:

import pymysql
import pandas as pd
from sqlalchemy import create_engine
# 连接数据库
try:
    db = pymysql.connect(host='localhost', user='root',
                         password='123456', database='data', charset='utf8')
except Exception:
    print("连接数据库失败")
# 创建一个游标对象
cursor = db.cursor()

# 创建第一个表的SQL语句
create_music_list_query = '''
CREATE TABLE IF NOT EXISTS music_list (
    web varchar(100) primary key,
    title varchar(100),
    play varchar(100),
    user varchar(60)
);
'''
# 创建第二个表的SQL语句
create_music_message_query = '''
CREATE TABLE IF NOT EXISTS music_message (
    title varchar(100) primary key,
    tag varchar(60),
    text varchar(100),
    collection varchar(20),
    play varchar(20),
    songs varchar(20),
    comments varchar(20)
);
'''
# 执行创建表的SQL语句
cursor.execute(create_music_list_query)
cursor.execute(create_music_message_query)
# 提交更改
db.commit()

# 创建 SQLAlchemy 引擎对象
engine = create_engine('mysql+pymysql://root:123456@localhost/data', echo=False)
# 读取CSV文件到DataFrame
path1 = 'music_list.csv'
df1 = pd.read_csv(path1)
# 将DataFrame的数据插入数据库表
df1.to_sql('music_list', con=engine, if_exists='replace', index=False)
# 读取CSV文件到DataFrame
path2 = 'music_message.csv'
df2 = pd.read_csv(path2)
# 将DataFrame的数据插入数据库表
df2.to_sql('music_message', con=engine, if_exists='replace', index=False)
# 关闭数据库连接
db.close()

在Workbench中查看data数据库,是否已经成功创建music_list、music_message表,并且是否将本地的数据传达sql数据库中。

从结果来看,已成功创建表和写入数据。

五、数据可视化

将预处理过后的数据进行数据可视化。

1. 统计收藏量前十的歌单数据

names = df.sort_values(by='collection', ascending=False)[0][:10]
collections = df.sort_values(by='collection', ascending=False)['collection'][:10]
# 设置显示数据
names = [i for i in names]
names.reverse()
collections = [i for i in collections]
collections.reverse()
data = pd.Series(collections, index=names)
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
# 设置坐标轴颜色
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
# 设置坐标轴刻度
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制柱状图,设置柱状图颜色
data.plot.barh(ax=ax, width=0.7, alpha=0.7, color=(8/255, 88/255, 121/255))
# 添加标题,设置字体属性
ax.set_title('网易云音乐华语歌单收藏 TOP10', fontsize=18, fontweight='light')
# 添加歌单收藏数量文本
for x, y in enumerate(data.values):
    num = str(y/10000)
    plt.text(y+20000, x-0.08, '%s' % (num + '万'), ha='center')
# 显示图片
plt.show()

从上图可以得出运动音乐为榜首,并且收藏量前四的歌单都超过了9.5万。

2. 歌单收藏量分布情况

为了方便绘图,先将歌单的收藏量进行取对数,然后绘制其整体的分布情况。

代码:

dom = []
for i in df[3]:
    dom.append(np.log(int(i.replace('万', '0000'))))
df['collection'] = dom
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 12
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
# 设置坐标轴颜色
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制直方图,设置直方图颜色
ax.hist(df['collection'], bins=30, alpha=0.7, color=(147/255, 112/255, 219/255))
ax.set_title('华语歌单收藏数量分布情况', fontsize=20)
# 显示图片
plt.show()

运行结果:

从上图结果来看,歌单收藏量数目很高和很低的都比较少,其中3到5之间的歌单最多,5到11分布相对较为均匀。

3. 歌单评论数前十

统计分析歌单的评论数,并画出条形图。

代码:

df['love'] = df[6]
# 数据排序
names = df.sort_values(by='love', ascending=False)[0][:10]
comments = df.sort_values(by='love', ascending=False)['love'][:10]
# 设置显示数据
names = [i for i in names]
names.reverse()
comments = [i for i in comments]
comments.reverse()
data = pd.Series(comments, index=names)
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
# 设置坐标轴颜色
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
# 设置坐标轴刻度
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制柱状图,设置柱状图颜色
data.plot.barh(ax=ax, width=0.7, alpha=0.7, color=(175/255, 135/255, 254/255))
ax.set_title('网易云音乐华语歌单评论 TOP10', fontsize=18, fontweight='light')
# 添加歌单评论数量文本
for x, y in enumerate(data.values):
    plt.text(y+200, x-0.08, '%s' % y, ha='center')
# 显示图片
plt.show()

运行结果:

从运行结果,可以看出,歌单“欧美私人雷达”评论数是最多的,高达34487条,并且远超其他歌单,说明其最受欢迎并且歌迷更愿意去交流。前五个歌单各自的评论数相差较大,后五个的歌单评论数相差不大,在2.5万到2.8万之间。

4. 歌单播放量前十

统计分析各个歌单的播放量数据,

代码:

df['play'] = df[4]
# 数据排序
names = df.sort_values(by='play', ascending=False)[0][:10]
plays = df.sort_values(by='play', ascending=False)['play'][:10]
# 设置显示数据
names = [i for i in names]
names.reverse()
plays = [i for i in plays]
plays.reverse()
data = pd.Series(plays, index=names)
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
# 设置坐标轴颜色
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
# 设置坐标轴刻度
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制柱状图,设置柱状图颜色
data.plot.barh(ax=ax, width=0.7, alpha=0.7, color=(187/255, 96/255, 178/255))
# 添加标题,设置字体属性
ax.set_title('网易云音乐华语歌单播放 TOP10', fontsize=18, fontweight='light')
# 添加歌单收藏数量文本
for x, y in enumerate(data.values):
    num = str(int(y / 10000))
    plt.text(y+1800000, x-0.08, '%s' % (num + '万'), ha='center')
# 显示图片
plt.show()

运行结果:

从结果可以得出,歌单“欧美私人雷达”的播放量最多,并且远超其他歌单的播放量,高达45823万,并且该歌单也是评论数最多的,由此更加证实了其是最受欢迎的歌单。

5. 歌单播放数量分布情况

为了方便描述坐标,先将歌单的播放量数据进行去对数,再绘图。代码:

dom = []
for i in df[4]:
    dom.append(np.log(i))
df['collection'] = dom
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['STXihei']
plt.rcParams['font.size'] = 12
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
# 设置坐标轴颜色
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制直方图,设置直方图颜色
ax.hist(df['collection'], bins=30, alpha=0.7, color=(244/255, 122/255, 117/255))
ax.set_title('华语歌单播放数量分布情况', fontsize=20)
# 显示图片
plt.show()

运行结果:

从结果来看,各个歌单的播放量整体较为集中。

6. 歌单标签信息分布情况

统计这些歌单的标签的占比,代码:

# 处理标签信息
tags = []
dom2 = []
for i in df[1]:
    c = i.split('-')
    for j in c:
        if j not in tags:
            tags.append(j)
        else:
            continue
for item in tags:
    num = 0
    for i in df[1]:
        type2 = i.split('-')
        for j in range(len(type2)):
            if type2[j] == item:
                num += 1
            else:
                continue
    dom2.append(num)
# 数据创建
data = {'tags': tags, 'num': dom2}
frame = pd.DataFrame(data)
df1 = frame.sort_values(by='num', ascending=False)
name = df1['tags'][:10]
income = df1['num'][:10]
# 绘图details
colors = ['#3398DB', '#8085e9',  '#f7a35c', '#f15c80', '#6b8e23', '#009966', '#FF6600', '#FF0033', '#009999', '#3cb371']
plot = squarify.plot(sizes=income, label=name, color=colors, alpha=1, value=income, edgecolor='white', linewidth=1.5)
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['font.size'] = 8
plt.rcParams['axes.unicode_minus'] = False
# 设置标签大小为1
plt.rc('font', size=6)
# 设置标题大小
plot.set_title('网易云音乐歌单标签图', fontsize=13, fontweight='light')
# 除坐标轴
plt.axis('off')
# 除上边框和右边框刻度
plt.tick_params(top=False, right=False)
# 图形展示
plt.show()

运行结果:

从运行结果可以看出,欧美歌单占比最多,其次是无标签的歌单、流行歌单、Soul歌单、放松歌单等。

7. 歌单贡献最多的UP

从爬取到的歌单创建者music_name.csv文件中,统计每一个博主总共创建的歌单数,并将前十可视化出来。代码:

df = pd.read_csv('music_name.csv', header=None, error_bad_lines=False, names=['url', 'title', 'play', 'user'])
# 数据聚合分组
place_message = df.groupby(['user'])
place_com = place_message['user'].agg(['count'])
place_com.reset_index(inplace=True)
place_com_last = place_com.sort_index()
dom = place_com_last.sort_values('count', ascending=False)[0:10]
# 设置显示数据
names = [i for i in dom.user]
names.reverse()
nums = [i for i in dom['count']]
nums.reverse()
data = pd.Series(nums, index=names)
# 设置图片显示属性,字体及大小
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['font.size'] = 10
plt.rcParams['axes.unicode_minus'] = False
# 设置图片显示属性
fig = plt.figure(figsize=(16, 8), dpi=80)
ax = plt.subplot(1, 1, 1)
ax.patch.set_color('white')
# 设置坐标轴属性
lines = plt.gca()
lines.spines['right'].set_color('none')
lines.spines['top'].set_color('none')
lines.spines['left'].set_color((64/255, 64/255, 64/255))
lines.spines['bottom'].set_color((64/255, 64/255, 64/255))
# 设置坐标轴刻度
lines.xaxis.set_ticks_position('none')
lines.yaxis.set_ticks_position('none')
# 绘制柱状图,设置柱状图颜色
data.plot.barh(ax=ax, width=0.7, alpha=0.7, color=(153/255, 0/255, 102/255))
# 添加标题,设置字体大小
ax.set_title('歌单贡献UP主 TOP10', fontsize=18, fontweight='light')
# 添加歌曲出现次数文本
for x, y in enumerate(data.values):
    plt.text(y+0.3, x-0.12, '%s' % y, ha='center')
plt.show()

运行结果:

从运行结果可知, “Boom!!”创建的歌单最多,创建了4个,其他都只创建了一个。

8. 词云图

根据爬取到的每张歌单的介绍信息,统计其词频信息,并且剔除掉一些无用的信息,如:封面、介绍、歌曲等信息,然后绘制词云图。代码:

from wordcloud import WordCloud, ImageColorGenerator
import jieba
text = ''
for line in df[2]:
    text += ' '.join(jieba.cut(line, cut_all=False))
backgroud_Image = plt.imread('music.png')
stopwords = set('')
stopwords.update(['封面', 'none介绍', '介绍', '歌曲', '我们', '自己', '没有', '就是', '可以', '知道', '一起', '不是', '因为', '什么', '时候', '还是', '如果', '不要', '那些', '那么', '那个', '所有', '一样', '一直', '不会', '现在', '他们', '这样', '最后', '这个', '只是', '有些', '其实', '开始', '曾经', '所以', '不能', '你们', '已经', '后来', '一切', '一定', '这些', '一些', '只有', '还有'])
wc = WordCloud(
    background_color='white',
    mask=backgroud_Image,
    font_path='C:\Windows\Fonts\STZHONGS.TTF',
    max_words=2000,
    max_font_size=150,
    random_state=30,
    stopwords=stopwords
)
wc.generate_from_text(text)
# 看看词频高的有哪些,把无用信息去除
process_word = WordCloud.process_text(wc, text)
sort = sorted(process_word.items(), key=lambda e:e[1], reverse=True)
print(sort[:50])
img_colors = ImageColorGenerator(backgroud_Image)
wc.recolor(color_func=img_colors)
plt.imshow(wc)
plt.axis('off')
wc.to_file("music.jpg")
print('生成词云成功!')

运行结果:

从生成的词云图,可以看出节奏、旋律、年代、摇滚等的词频相对较高。可知大多数人们喜欢音乐是因为喜欢其节奏、旋律,或许能带给他们灵魂的享受,同时有年代感的音乐也备受欢迎,说明有很多人用音乐来怀旧。喜欢的音乐风格不尽相同,比如喜欢欧美、浪漫、说唱、爵士、摇滚等。有些是为了放松、情感需求等,去选择听哪种音乐。


http://www.kler.cn/a/566635.html

相关文章:

  • 有向图的拓扑排序-BFS求解
  • 如何选择DevOps平台?GitHub、GitLab、BitBucket、Jenkins对比与常见问题解答
  • javascript经典练习题-语法与特性
  • word转换为pdf后图片失真解决办法、高质量PDF转换方法
  • HTML 基础 (快速入门)详细步骤和示例
  • 编程小白冲Kaggle每日打卡(17)--kaggle学堂:<机器学习简介>随机森林
  • UniApp 中封装 HTTP 请求与 Token 管理(附Demo)
  • 运维安全之Linux网络安全(iptables)
  • Spring Boot Admin 踩坑
  • JWT+redis实现令牌刷新优化方案
  • esp8266 rtos sdk开发环境搭建
  • 如何使用大模型、知识库和AI工作流创建AI应用(扣子平台)
  • element中el-table表头通过header-row-style设置样式
  • springboot之HTML与图片生成
  • win本地vscode通过代理远程链接linux服务器
  • 若依spring框架升级到JDK17 + spring boot3 + spring framework6的趟坑记录
  • 3.2实验filebeat->logstash->es
  • 爬虫:mitmproxy抓包工具的使用和实时抓包处理案例
  • DeepSeek开源周第二弹!DeepEP:解锁混合专家模型的高效通信之钥
  • 在Spring Boot项目中将中文转换为拼音:从入门到实践