周杰伦MV弹幕

  • 数据来源:B站爬虫
  • 导入模块包
    • 1. 中文分词库 jieba
    • 2. 数据分析包 pandas
    • 3. 可视化包 matplotlib
    • 4. 交互可视化包 pyecharts
    • 5. 正则表达式 re
  • 1. 数据预处理
    • 1.1 读取数据
    • 1.2 查看数据描述信息
    • 1.3各列数据的含义
    • 1.4 抽样查看数据
    • 1.5 查看前三行数据
    • 1.6 查看后三行数据
    • 1.7 查看重复数据
    • 1.8 清洗数据
  • 2. 数据提取和可视化
    • 2.1 专辑模块
      • 2.1.1 文件名中提取歌名和专辑名
      • 2.1.2 查看各专辑的弹幕数量(存在单曲的,只选择 1st 2nd 等开头的专辑)
      • 2.1.3 各专辑弹幕数
      • 2.1.4. 各专辑的用户参与人数
      • 2.1.5. 开屏弹幕最多的专辑(小于1秒)
      • 2.1.6 将参与人数,总弹幕数,开屏弹幕数合成一个新表
        • 统计各个专辑的颜色数目
      • 2.1.7 绘制雷达图
  • 3. 歌曲模块
    • 3.1. 每首歌的词云图
    • 3.2. 歌曲的弹幕颜色分布
    • 3.3. 歌曲的弹幕模式
    • 3.4. 歌曲的弹幕发表时刻
    • 3.5 对弹幕高峰时刻查看弹幕模式
    • 3.6 对弹幕高峰时刻查看内容词云图
    • 3.7 对弹幕高峰时刻查看颜色图
  • 4. 用户模块
    • 4.1 用户发送的弹幕总数
    • 4.2.用户最常发表的弹幕关键词
    • 4.3 用户最爱发弹幕的前N首歌曲
    • 4.4. 用户发送弹幕的时间
    • 4.5. 用户发送的颜色占比
    • 4.6 统计包含关键词的次数(一个用户在单首歌只统计一次)
    • 4.7 统计包含关键词的次数(一个用户在单首歌统计多次)

本文涉及pandas和pyecharts方法库使用,re和jieba库辅助文本处理

数据来源:B站爬虫

【经典】周杰伦全MV 【193P】
之前B站的弹幕接口可以使用,后来接口更新了,得到的弹幕是乱码

新的数据接口每首歌曲最多收集一千条,旧接口可以根据日期获取弹幕数据,需要自己对xml文件中信息提取
https://comment.bilibili.com/2154849.xml (2154849是视频号bid)

导入模块包

1. 中文分词库 jieba

2. 数据分析包 pandas

3. 可视化包 matplotlib

4. 交互可视化包 pyecharts

5. 正则表达式 re

import re
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import WordCloud
import jieba
from pyecharts.globals import SymbolType
from pyecharts.charts import Grid, Line, Scatter,Pie,Bar
import matplotlib
# 显示坐标中的负号
matplotlib.rcParams["axes.unicode_minus"] = False
# 显示中文字符
matplotlib.rc("font", family="SimHei", weight="bold", size=16)

1. 数据预处理

1.1 读取数据

如果内容列存在英文逗号,使用read_csv或出现列数不符合字段数

df = pd.read_csv("./周杰伦MV.csv")

1.2 查看数据描述信息

可以看到弹幕模式列出现异常,内容列存在缺失

df.info()

1.3各列数据的含义

发表时刻 : 弹幕出现的时间以秒数为单位。
弹幕模式: 弹幕的模式1…3 滚动弹幕 4底端弹幕 5顶端弹幕 6.逆向弹幕 7精准定位 8高级弹幕
字体大小 字号, 12非常小,16特小,18小,25中,36大,45很大,64特别大
颜色 字体的颜色以HTML颜色的十进制为准
时刻 Unix格式的时间戳。基准时间为 1970-1-1 08:00:00
弹幕池 0普通池 1字幕池 2特殊池【目前特殊池为高级弹幕专用】
发送者ID 发送者的ID,用于“屏蔽此弹幕的发送者”功能
弹幕ID 弹幕在弹幕数据库中rowID 用于“历史弹幕”功能。
文件名 包含歌名和专辑名,部分歌曲是单曲
内容 弹幕内容

1.4 抽样查看数据

df.sample(5)

1.5 查看前三行数据

df.head(3)

1.6 查看后三行数据

df.tail(3)

1.7 查看重复数据

df[df.duplicated()]

1.8 清洗数据

清理数据一般涉及检验重复值,缺失值,异常值

#如果文件名和发送者ID为空,去掉该数据,同时更新df
df.dropna(inplace=True,subset=['文件名', '发送者ID'])
print(df.shape)

数据规模 (303258, 10) 303258行,10列

2. 数据提取和可视化

将pyecharts的饼图封装成一个函数 ,详细需要阅读官网:pyecharts

def GetPieFig(data:dict,title:str,width="600px",height="400px"):"""use pyecharts to show pie figure-----------data: series into dict title: Figure title"""pie = (Pie(init_opts=opts.InitOpts(width=width,height=height)).add(title,[[i,j] for i,j in data.items()],center=["40%", "40%"],radius=["30%","50%"],label_opts=opts.LabelOpts(is_show=True)).set_global_opts(title_opts=opts.TitleOpts(title=title),legend_opts=opts.LegendOpts(type_="scroll",pos_left="80%",orient="vertical"),toolbox_opts=opts.ToolboxOpts(pos_bottom="10%"),).set_series_opts(label_opts=opts.LabelOpts( formatter="{b}:{c} ({d}%)",is_show=True)))return pie

弹幕内容存在特殊串

def FilterWords(x):"过滤特殊字符 只返回由中文字母数字和下划线组成的字符串"x = str(x)if x.startswith("[") and len(x.split(","))>6:return x.split(",")[4][1:-1]return " ".join(re.findall("\w+",x))
df["内容"] = df["内容"].apply(FilterWords)

2.1 专辑模块

2.1.1 文件名中提取歌名和专辑名

df["歌名"] = df["文件名"].str.extract("(\w+)")
def getAlbum(x):m = re.search("【([\w ]+)】",x)if m:return m.group(1)else:return x
df["专辑"] = df["文件名"].apply(getAlbum)
df[["歌名","专辑"]].sample(5)

2.1.2 查看各专辑的弹幕数量(存在单曲的,只选择 1st 2nd 等开头的专辑)

不需要获取所有的列

album = df[df["专辑"].str.contains(r'^(\d)')][["发表时刻","时刻","颜色","内容","发送者ID","专辑"]] #r'^(?:531|92|541[6-9])')]
album

2.1.3 各专辑弹幕数

albumName = album["专辑"].value_counts().index.tolist()
albumCount = album["专辑"].value_counts().values.tolist()
c = (Bar().add_xaxis(albumName).add_yaxis("周杰伦各专辑弹幕数", albumCount,).reversal_axis().set_series_opts(label_opts=opts.LabelOpts(position="right")).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),title_opts=opts.TitleOpts(title="周杰伦各专辑弹幕数", subtitle="水平柱状图/解决标签名字过长的问题"),)
)
c.render_notebook()


由此得到周杰伦的14张专辑的弹幕数量(赶紧出新专辑)

2.1.4. 各专辑的用户参与人数

  1. 专辑分组
  2. 去除同专辑中的相同发送者ID
join_dict = {}
for i in album["专辑"].unique():shape = album.groupby("专辑").get_group(i)["发送者ID"].unique().shape[0]join_dict[i] = shape
print(join_dict)

2.1.5. 开屏弹幕最多的专辑(小于1秒)

方法一:分组

albumDanmu = album[album["发表时刻"]<1].groupby("专辑")["发送者ID"].count()

方法二:对特定列计数

albumDanmu = album[album["发表时刻"]<1]["专辑"].value_counts()
import matplotlibmatplotlib.rcParams["axes.unicode_minus"] = False
matplotlib.rc("font", family="SimHei", weight="bold", size=16)albumDanmu.plot(kind="barh")

2.1.6 将参与人数,总弹幕数,开屏弹幕数合成一个新表

统计各个专辑的颜色数目

color_dict = {}
for i in albumName:color_dict[i] = album.groupby("专辑").get_group(i)["颜色"].unique().shape[0]
albumColor = pd.Series(color_dict)
# names: 索引命名
# keys: 列命名
albumTotalDanmu = album["专辑"].value_counts()
albumJoin = pd.Series(join_dict)
album_merge = pd.concat([albumJoin, albumTotalDanmu, albumDanmu,albumColor],keys=["弹幕参与人数","总弹幕数","开屏弹幕数","颜色数量"],names=["专辑"],axis=1)
album_merge

2.1.7 绘制雷达图

#雷达图的标签项
schema = []
for name,value in album_merge.max().to_dict().items():schema.append(opts.RadarIndicatorItem(name=name, max_=value))
name1,name2,name3 = "4th 叶惠美","5th 七里香","6th 十一月的萧邦"
## 获取所在行的所有值
album1 = album_merge.loc[name1,:]
album2 = album_merge.loc[name2,:]
album3 = album_merge.loc[name3,:]
## 值转换为二维数组
v1 = [album1.values.tolist()]
v2 = [album2.values.tolist()]
v3 = [album3.values.tolist()]import pyecharts.options as opts
from pyecharts.charts import Radar"""根据"弹幕参与人数","总弹幕数","开屏弹幕数","颜色数量" 绘制专辑的雷达图
"""
(Radar(init_opts=opts.InitOpts(width="800px", height="600px", bg_color="#CCCCCC")).add_schema(schema=schema,splitarea_opt=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),textstyle_opts=opts.TextStyleOpts(color="dodgerblue"),).add(series_name=name1,data=v1,linestyle_opts=opts.LineStyleOpts(color="#CD0000"),).add(series_name=name2,data=v2,linestyle_opts=opts.LineStyleOpts(color="#5CACEE"),).add(series_name=name3,data=v3,linestyle_opts=opts.LineStyleOpts(color="#05FF00"),).set_series_opts(label_opts=opts.LabelOpts(is_show=True)).set_global_opts(title_opts=opts.TitleOpts(title="基础雷达图",subtitle="single单例模式\nmultiple多选模式",subtitle_textstyle_opts={"color":"red"}), legend_opts=opts.LegendOpts(selected_mode="multiple"),).render_notebook()
)

3. 歌曲模块

3.1. 每首歌的词云图

获取停用词表

def get_stopword():"使用集合来获取停用词表的词组"s = set()with open(r"./百度停用词表.txt", encoding="utf-8") as f:for line in f:s.add(line.strip())  # 去掉每行末尾的换行符return s

获取文本的词频

def GetWordFrequency(content:str,pattern=None,mode="sub",min_length = 2,min_app=2)->dict:"""content: strpattern: str default [\W]+mode: str `sub` or `findall` min_length: shortest length of wordmin_app: word mininum appearance times--------------------------some sybolm: [,!\"#, -. : ; <=>^_`~!,。?、¥… ():【《》‘’“”\s]+chinese : [\u4e00-\u9fa5]+"""if not pattern:pattern = "[\W]+" # 非中文,字母 和 空格的就替换re_obj = re.compile(pattern)# 预编译,减少重复匹配text = Noneif mode=="sub":text = re_obj.sub("", content) #正则表达式替换else:text = "".join(re.findall(re_obj,content))wordList = jieba.cut(text) # 分词s = get_stopword() # 获取停用词集合# 字符集的最短长度为2,去除 类似啊啊啊的弹幕内容min_length = 2word_dict = {}for i in wordList:if (len(set(i))>=min_length) and (i not in s):word_dict[i] = word_dict.get(i,0) + 1result = {}for k,v in word_dict.items():if v>=min_app:result[k] = vreturn result

获取词云图

def GetWordCloud(word_dict,title="WordCloud")->WordCloud:"""word_dict: dict or listmin_app: word mininum appearance timesmin_length: shortest length of word"""if isinstance(word_dict,dict):word_dict = [(i,j) for i,j in word_dict.items()]wc = (WordCloud().add("", word_dict, word_size_range=[20, 100], shape=SymbolType.DIAMOND).set_global_opts(title_opts=opts.TitleOpts(title=title)))return wc
song = df[["发表时刻","颜色","时刻","发送者ID","歌名","内容"]]
songName = "七里香"
songContentSeris = song.groupby(["歌名"]).get_group(songName)["内容"]
songContentStr = "".join(songContentSeris.tolist())
# 只选出词频至少为50的中文字词
freq = GetWordFrequency(songContentStr,pattern="[\u4e00-\u9fa5]+",mode="findall",min_app=50)
GetWordCloud(freq,songName).render_notebook()

3.2. 歌曲的弹幕颜色分布

song[“十六进制颜色”] = song[“颜色”].astype(“int”).apply(lambda x:"#%06x"%x) 但是Pie内部好像不能识别不了这种格式的颜色

将float型的颜色转成int型,再根据需要转成rgb或者十六进制颜色

# 混略警告即可
song.loc[:,"颜色"] =song.loc[:,"颜色"].astype("int")# 自身替换
song.loc[:,"rgb"] = song.loc[:,"颜色"].apply(lambda x:f"rgb({x>>16},{(x>>8)&255},{x&255})")

饼图

def ColorPie(data,title,min_times=100,bg_color="#d9d9d9"):"data:Series"Data = data[(data>min_times)]colorIndex = Data.index.tolist()colorValue = Data.values.tolist()c = (Pie(init_opts=opts.InitOpts(bg_color=bg_color)).add("", [list(z) for z in zip(colorIndex,colorValue)],).set_colors(colorIndex).set_series_opts(label_opts=opts.LabelOpts( formatter="{c} ({d}%)",is_show=True)).set_global_opts(title_opts=opts.TitleOpts(title=title),legend_opts=opts.LegendOpts(type_="scroll",pos_left="80%",orient="vertical"),))return c

关闭饼图的白色图例后

说明七里香的弹幕颜色主要是红色 黄色 和 粉色

再来看看 一路向北的


真 一绿向北

3.3. 歌曲的弹幕模式

songName = "七里香"
# 弹幕模式映射
modeMap = {"1":"滚动弹幕","2":"滚动弹幕","3":"滚动弹幕","4":"底端弹幕","5":"顶端弹幕","6":"逆向弹幕","7":"精准定位","8":"高级弹幕"}
songMode = song.groupby(["歌名"]).get_group(songName)["弹幕模式"].map(modeMap).value_counts()
GetPieFig(songMode,songName+"弹幕模式").render_notebook()

输出:

3.4. 歌曲的弹幕发表时刻

def GetLineFig(data,title:str,subtitle:str,series_name:str,):"""data: Series of Datatitle : figure main titlesubtitle: figure second titleseries_name: figure series name"""data.sort_index(inplace=True)x1 = [str(i) for i in data.index.tolist()]y1 = data.values.tolist()c11 = (Line(init_opts=opts.InitOpts(width="600px", height="400px")).add_xaxis(xaxis_data=x1,).add_yaxis(series_name=series_name,y_axis=y1,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值"),]),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),).set_global_opts(title_opts=opts.TitleOpts(title=title, subtitle=subtitle),tooltip_opts=opts.TooltipOpts(trigger="axis"),toolbox_opts=opts.ToolboxOpts(is_show=True),xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),))return c11

时刻向上取整,也可以用ceil函数

song["time"] = song["发表时刻"].apply(lambda x:int(x)+1)
songName = "七里香"
timeCount = song.groupby(["歌名"]).get_group(songName)["time"].value_counts()
GetLineFig(timeCount,songName,"各时刻的弹幕数量变化",songName).render_notebook()

结果


查看该时刻的词云图

3.5 对弹幕高峰时刻查看弹幕模式

由上图,将鼠标移动到一个高峰,看到时刻为84,查看该时刻的弹幕模式

songTime = song.groupby("歌名").get_group(songName)
timePoint = 84
modeMap = {"1":"滚动弹幕","2":"滚动弹幕","3":"滚动弹幕","4":"底端弹幕","5":"顶端弹幕","6":"逆向弹幕","7":"精准定位","8":"高级弹幕"}d1 = songTime[songTime["time"]==timePoint]["弹幕模式"].map(modeMap).value_counts().to_dict()
GetPieFig(d1,f"{songName}在{timePoint}秒时刻的弹幕模式词云图").render_notebook()


视频中的弹幕是这样的

3.6 对弹幕高峰时刻查看内容词云图

看看词云图

songTime = song.groupby("歌名").get_group(songName)
timePoint = 84
songContent = "".join(songTime[songTime["time"]==timePoint]["内容"].tolist())
word_dict = GetWordFrequency(songContent,"[\u4e00-\u9fa5]+","findall",min_app=1)
GetWordCloud(word_dict,f"{songName}在{timePoint}秒时刻的词云图").render_notebook()

3.7 对弹幕高峰时刻查看颜色图

再看颜色占比

songTime = song.groupby("歌名").get_group(songName)
song.loc[:,"rgb"] = song.loc[:,"颜色"].astype("int").apply(lambda x:f"rgb({x>>16},{(x>>8)&255},{x&255})")
timePoint = 84
singleSongStamp = songTime[songTime["time"]==timePoint]["rgb"].value_counts()
ColorPie(singleSongStamp,songName,min_times=1).render_notebook()

4. 用户模块

4.1 用户发送的弹幕总数

user = df[["发表时刻","颜色","弹幕模式","时刻","发送者ID","歌名","内容"]]
user["发送者ID"].value_counts().head(5)

4.2.用户最常发表的弹幕关键词

userID = "750ff223"
userDanmu = user.groupby(["发送者ID"]).get_group(userID)["内容"].tolist()
user_dict = GetWordFrequency("".join(userDanmu),"[\u4e00-\u9fa5]+","findall",min_app=10)
GetWordCloud(user_dict,title=userID+"的弹幕关键词").render_notebook()

结果:

4.3 用户最爱发弹幕的前N首歌曲

N = 10
# plot版: 适用于简单查看
user.groupby(["发送者ID"]).get_group(userID)["歌名"].value_counts().head(N).plot(kind="pie")

# pyecharts版本
userFav = user.groupby(["发送者ID"]).get_group(userID)["歌名"].value_counts().head(N).to_dict()
GetPieFig(userFav,f"{userID}最爱发的弹幕{N}首歌").render_notebook()

4.4. 用户发送弹幕的时间

user["hour"] = pd.to_datetime(user["时刻"],unit="s").dt.hour # 转换时间格式
user.head()

userTime = user.groupby(["发送者ID"]).get_group(userID)["hour"].value_counts()
GetLineFig(userTime,f"{userID}发送弹幕时间",None,userID).render_notebook()



这娃绝对是爱修仙的,让我们看看下一个选手

userID = "3c96c8ac"
userTime = user.groupby(["发送者ID"]).get_group(userID)["hour"].value_counts()
GetLineFig(userTime,f"{userID}发送弹幕时间",None,userID).render_notebook()


嗯嗯,这个娃修仙的道行低了点

4.5. 用户发送的颜色占比

user.loc[:,"颜色"] =user.loc[:,"颜色"].astype("int")# 自身替换
user.loc[:,"rgb"] = user.loc[:,"颜色"].apply(lambda x:f"rgb({x>>16},{(x>>8)&255},{x&255})")
userColor = user.groupby("发送者ID").get_group(userID)["rgb"].value_counts()
ColorPie(userColor,title=f"{userID}弹幕颜色占比",min_times=1,bg_color="gray").render_notebook()


此用户最常用的颜色是粉色和白色

4.6 统计包含关键词的次数(一个用户在单首歌只统计一次)

  1. 筛选出包含关键词的行
  2. 对歌名分类
  3. 对发送者ID取唯一值,计数
keyword = "全体起立"
min_times = 100
d1 = user[user["内容"].str.contains(keyword)][["发送者ID","歌名","内容"]]
d1.drop_duplicates(subset=["发送者ID","歌名"],inplace=True)
s1 = d1['歌名'].value_counts()
GetPieFig(s1[s1>min_times].to_dict(),f"包含{keyword}").render_notebook()

4.7 统计包含关键词的次数(一个用户在单首歌统计多次)

group = user[user["内容"].str.contains(keyword)].groupby(["歌名"])
keyword_dict = {}
min_times = 100
for name in group.groups.keys():size = group.get_group(name)["发送者ID"].sizeif size>=min_times:keyword_dict[name] = size
GetPieFig(keyword_dict,f"{keyword}").render_notebook()


完结
后期会尝试联系一些模型,如RFM模型,回归分析等

pandas数据分析和pyecharts可视化周杰伦MV弹幕(多图长文)相关推荐

  1. acfun网站400W用户数据分析和pyecharts可视化

    首先在这给我心爱的Acfun说句抱歉了,这几天进行的数据爬取如果对猴山产生了不好的影响,请接受我的道歉. 本次所有代码都会上传到GitHub上:爬虫部分和ip搜索部分 sql文件地址:百度云盘 密码: ...

  2. Python 爬取周杰伦《Mojito》MV 弹幕,这个评论亮了!

    作者 | 黄伟呢 来源 | 数据分析与统计学之美 6月12日凌晨0点,周杰伦最新单曲<Mojito>正式上线,仅上线1小时销售量就超过百万张,预计今天这首单曲的销量仍然会继续攀升.这次新歌 ...

  3. 周杰伦新歌发布,爬取《Mojito》MV弹幕,看看粉丝们都说的些啥!

    6月12日凌晨0点,Jay Chou最新单曲<Mojito>正式上线,仅上线1小时销售量就超过百万张,预计今天这首单曲的销量仍然会继续攀升.这次新歌的歌名叫做<Mojito>, ...

  4. 用 Python 爬取分析周杰伦《Mojito》MV弹幕

    2020年6月12日凌晨0点,Jay Chou最新单曲<Mojito>正式上线,仅上线1小时销售量就超过百万张,预计今天这首单曲的销量仍然会继续攀升.这次新歌的歌名叫做<Mojito ...

  5. 线程池+进程池爬虫—深圳房价+数据分析+pyecharts可视化

    这一部分转载于自己本人微信公众号: 眼光梭映一世豪,欢迎骚扰!这篇文字只出于想要玩一下数据分析,小白一个,欢迎大家指点批评. 文章目录 01 第一部分,制作缘由. 02第二部分:爬虫的过程 03 第三 ...

  6. Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)

    Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...

  7. 干货资料《Pandas数据分析与实战》配套资料下载,速领

    " 希望你有很好的朋友,可以跟他说说心里话:希望你有喜欢的事,可以暂时摆脱世界困扰:希望你难过的时候,有一份美食与一份音乐:希望你有关注我们,可以一起学习一起进步. " 今天小编给 ...

  8. pandas数据可视化_5利用Pandas进行强大的可视化以进行数据预处理

    pandas数据可视化 One of the most common pitfalls I observe repeatedly among relatively junior data scient ...

  9. 数据分析---疫情数据可视化(地图)

    数据分析---疫情数据可视化(地图) 安装pyecharts库 爬取所需要的数据(网上直接爬取数据) 绘制全国地图 绘制省份地图(以湖北省为例) 在全国地图上加入湖北省数据 导入数据(本地导入数据) ...

最新文章

  1. python计算消费总额_【数据分析案例】用户消费行为
  2. .net core独立发布文件过多的问题
  3. python基础——使用__slots__
  4. OCA第5部分中的Java难题
  5. 中国电子协会考评中心_中国电子学会考评中心和CPA青少年编程能力等级测评有什么不同?...
  6. java基础应用_Java基础(应用篇)
  7. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  8. bzoj 4002: [JLOI2015]有意义的字符串(特征根法+矩阵快速幂)
  9. css画三角形以及各种图形
  10. 22个开源的PHP框架
  11. Python的Django框架中的URL配置与松耦合
  12. linux打包根目录
  13. 量子计算机怎样输入数据,量子计算入门
  14. java-php-python-ssm在线装机报价系统计算机毕业设计
  15. 1143 Lowest Common Ancestor (30分) 附测试点分析
  16. html里怎么旋转视频文件,拍摄的视频如何旋转 三种方法教你旋转视频
  17. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-堆和优先队列(二)
  18. Scrapy中Spiders的用法
  19. O3-开源框架使用之Butterknife 8.8.1及源码浅析
  20. 韦东山第二期课程内容概要

热门文章

  1. matplotlib 饼图 plt.pie()
  2. 关于使用selenium工具调用Firefox浏览器登录淘宝、京东web端的试验
  3. c语言程序实践感受心得,C语言实践心得体会
  4. 前端小白浅谈seo优化以及web性能优化方案
  5. 基于树莓派和LD3320模块的语音识别控制
  6. linux etc目录讲解
  7. 生产者消费问题以及多生产者—消费者问题实现思想
  8. 阿噗啊噗服务器维护,这些App我能笑一年!阿噗整理的20个奇葩App,没玩过你就OUT了!...
  9. ChatGPT能接入微信了
  10. CentOS7 挂载新加硬盘(大于2T)操作说明