大家好,最近不少小伙伴在学 Python,想找个好玩的练手项目。那今天分享一个简单、好玩,适合新手的 Python 小项目。文章较长,建议收藏、喜欢关注、点赞,文末提供技术交流群。

以下是具体项目:


本文将以哔哩哔哩–乘风破浪视频为例,you-get下载视频。

同时利用 python 爬取 B 站视频弹幕,并利用 opencv 对视频进行分割,百度 AI 进行人像分割,moviepy 生成词云跳舞视频,并添加音频。

干货推荐

  • 深度盘点:这20套可视化炫酷大屏真香啊(附源码)
  • 值得收藏,这6种制作竞赛动图的方法妙不可言
  • 绝了,这6个精挑细选的机器学习资料简直太香了
  • Python数据分析三剑客真香啊,还有高清思维导图
  • Python编程从入门到实战,看这一篇足够了

导入模块

下载所需模块

我们需要下载很多的模块,所以我们可以使用os.system()方法来自动安装所需模块,当然也有可能下载失败,特别是opencv-python,多安装几次就好啦.

import os
import time
libs = {"lxml","requests","pandas","numpy","you-get","opencv-python","pandas","fake_useragent","matplotlib","moviepy"}
try:for lib in libs:os.system(f"pip3 install -i https://pypi.doubanio.com/simple/ {lib}")print(lib+"下载成功")
except:print("下载失败")

导入模块

在这里统一先导入所需的模块

import os
import re
import cv2
import jieba
import requests
import moviepy
import pandas as pd
import numpy as np
from PIL import Image
from lxml import etree
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from fake_useragent import UserAgent

视频处理

下载视频

从B站视频下载舞蹈视频。

可以使用 you-get,用它可以下载视频,先安装:

pip install you-get

找到想要下载视频的连接,使用如下指令,就可以下载:

you-get -i https://www.bilibili.com/video/BV11C4y1h7nX

标有 DEFAULT 为默认画质。

下载完的视频。


最后制作效果是这样的

视频分割

使用opencv,将视频的分隔为图片,本文截取 800 张图片来做词云。

opencv中通过VideoCaptrue类对视频进行读取操作以及调用摄像头

代码展示

# -*- coding:utf-8 -*-
import cv2
cap = cv2.VideoCapture(r"无价之姐~让我乘风破浪~~~.flv")
num = 1
while 1:# 逐帧读取视频  按顺序保存到本地文件夹ret,frame = cap.read()if ret:cv2.imwrite(f".\pictures\img_{num}.jpg",frame)   else:break
cap.release()   # 释放资源

结果展示

人像分割

创建应用

利用百度AI,创建一个人像分割的应用。

Python SDK参考文档

利用参考文档,来进行人像分割。

参考文档:

https://cloud.baidu.com/doc/BODY/s/Rk3cpyo93?_=5011917520845

代码展示

# -*- coding:utf-8 -*-
import cv2
import base64
import numpy as np
import os
from aip import AipBodyAnalysis
import time
import randomAPP_ID = '******'
API_KEY = '*******************'
SECRET_KEY = '********************'client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
# 保存图像分割后的路径
path = './mask_img/'# os.listdir  列出保存到图片名称
img_files = os.listdir('./pictures')
print(img_files)
for num in range(1, len(img_files) + 1):# 按顺序构造出图片路径img = f'./pictures/img_{num}.jpg'img1 = cv2.imread(img)height, width, _ = img1.shape# print(height, width)# 二进制方式读取图片with open(img, 'rb') as fp:img_info = fp.read()# 设置只返回前景   也就是分割出来的人像seg_res = client.bodySeg(img_info)labelmap = base64.b64decode(seg_res['labelmap'])nparr = np.frombuffer(labelmap, np.uint8)labelimg = cv2.imdecode(nparr, 1)labelimg = cv2.resize(labelimg, (width, height), interpolation=cv2.INTER_NEAREST)new_img = np.where(labelimg == 1, 255, labelimg)mask_name = path + 'mask_{}.png'.format(num)# 保存分割出来的人像cv2.imwrite(mask_name, new_img)print(f'======== 第{num}张图像分割完成 ========')

结果展示

弹幕爬取

由于技术原因,我们改为此视频来获取弹幕,哈哈哈哈哈。

https://www.bilibili.com/video/BV1jZ4y1K78N

网页分析

通过F12,找到pagelist,通过原始url,找到cid

观察历史弹幕

  • 清楚元素,展开弹幕列表

  • 日期列表,只有2021年的,点击其他日期,出来了history请求。

爬取弹幕

构造时间序列

该视频发布于2020-08-09,本文爬取该视频2020-08-08到2020-09-08日的历史弹幕数据,构造出时间序列:

import pandas as pd
a = pd.date_range("2020-08-08","2020-09-08")
print(a)
DatetimeIndex(['2020-08-08', '2020-08-09', '2020-08-10', '2020-08-11','2020-08-12', '2020-08-13', '2020-08-14', '2020-08-15','2020-08-50', '2020-08-17', '2020-08-18', '2020-08-19','2020-08-20', '2020-08-21', '2020-08-22', '2020-08-23','2020-08-24', '2020-08-25', '2020-08-26', '2020-08-27','2020-08-28', '2020-08-29', '2020-08-30', '2020-08-31','2020-09-01', '2020-09-02', '2020-09-03', '2020-09-04','2020-09-05', '2020-09-06', '2020-09-07', '2020-09-08'],dtype='datetime64[ns]', freq='D')

爬取数据

添加cookie,修改oid即可

import requests
import pandas as pd
import re
import csv
from fake_useragent import UserAgent
from concurrent.futures import ThreadPoolExecutor
import datetimeua = UserAgent()
start_time = datetime.datetime.now()def  Grab_barrage(date):headers = {"origin": "https://www.bilibili.com","referer": "https://www.bilibili.com/video/BV1jZ4y1K78N?from=search&seid=1084505810439035065","cookie": "","user-agent": ua.random(),}params = {'type': 1,'oid' : "222413092",'date': date}r= requests.get(url, params=params, headers=headers)r.encoding = 'utf-8'comment = re.findall('<d p=".*?">(.*?)</d>', r.text)for i in comments:df.append(i)a = pd.DataFrame(df)a.to_excel("danmu.xlsx")
def main():with ThreadPoolExecutor(max_workers=4) as executor:executor.map(Grab_barrage, date_list)"""计算所需时间"""delta = (datetime.datetime.now() - start_time).total_seconds()print(f'用时:{delta}s')
if __name__ == '__main__':# 目标urlurl = "https://api.bilibili.com/x/v2/dm/history"start,end = '20200808','20200908'date_list = [x for x in pd.date_range(start, end).strftime('%Y-%m-%d')]count = 0main()

结果展示

生成词云图

评论内容机械压缩去重

对于一条评论来说,有些人可能手误,或者凑字数,会出现将某个字或者词语,重复说多次,因此在进行分词之前,需要做“机械压缩去重”操作。

def func(s):for i in range(1,int(len(s)/2)+1):for j in range(len(s)):if s[j:j+i] == s[j+i:j+2*i]:k = j + iwhile s[k:k+i] == s[k+i:k+2*i] and k<len(s):   k = k + is = s[:j] + s[k:]    return s
data["短评"] = data["短评"].apply(func)

添加停用词和自定义词组

import pandas as pd
from wordcloud import WordCloud
import jieba
from tkinter import _flatten
import matplotlib.pyplot as pltjieba.load_userdict("./词云图//add.txt")
with open('./词云图//stoplist.txt', 'r', encoding='utf-8') as f:stopWords = f.read()

生成词云图

from wordcloud import WordCloud
import collections
import jieba
import re
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
with open('barrages.txt') as f:data = f.read()
jieba.load_userdict("./词云图//add.txt")# 读取数据
with open('barrages.txt') as f:data = f.read()
jieba.load_userdict("./词云图//add.txt")
# 文本预处理  去除一些无用的字符   只提取出中文出来
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = "/".join(new_data)# 文本分词
seg_list_exact = jieba.cut(new_data, cut_all=True)result_list = []
with open('./词云图/stoplist.txt', encoding='utf-8') as f:con = f.read().split('\n')stop_words = set()for i in con:stop_words.add(i)for word in seg_list_exact:# 设置停用词并去除单个词if word not in stop_words and len(word) > 1:result_list.append(word)# 筛选后统计词频
word_counts = collections.Counter(result_list)
path = './wordcloud/'img_files = os.listdir('./mask_img')
print(img_files)
for num in range(1, len(img_files) + 1):img = fr'.\mask_img\mask_{num}.png'# 获取蒙版图片mask_ = 255 - np.array(Image.open(img))# 绘制词云plt.figure(figsize=(8, 5), dpi=200)my_cloud = WordCloud(background_color='black',  # 设置背景颜色  默认是blackmask=mask_,      # 自定义蒙版mode='RGBA',max_words=500,font_path='simhei.ttf',   # 设置字体  显示中文).generate_from_frequencies(word_counts)# 显示生成的词云图片plt.imshow(my_cloud)# 显示设置词云图中无坐标轴plt.axis('off')word_cloud_name = path + 'wordcloud_{}.png'.format(num)my_cloud.to_file(word_cloud_name)    # 保存词云图片print(f'======== 第{num}张词云图生成 ========')

合成视频

如官方文档所介绍的,moviepy是一个用于视频编辑Python库,可以切割、拼接、标题插入,视频合成(即非线性编辑),进行视频处理和自定义效果的设计。总的来说,可以很方便自由地处理视频、图片等文件。

图片合成

import cv2
import os# 输出视频的保存路径
video_dir = 'result.mp4'
# 帧率
fps = 30
# 图片尺寸
img_size = (1920, 1080)fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')  # opencv3.0 mp4会有警告但可以播放
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
img_files = os.listdir('.//wordcloud')for i in range(88, 888):img_path = './/wordcloud//wordcloud_{}.png'.format(i)frame = cv2.imread(img_path)frame = cv2.resize(frame, img_size)   # 生成视频   图片尺寸和设定尺寸相同videoWriter.write(frame)      # 写进视频里print(f'======== 按照视频顺序第{i}张图片合进视频 ========')videoWriter.release()   # 释放资源

结果展示:

音频添加

import moviepy.editor as mpy# 读取词云视频
my_clip = mpy.VideoFileClip('result.mp4')
# 截取背景音乐
audio_background = mpy.AudioFileClip('song.mp3').subclip(0,25)
audio_background.write_audiofile('song1.mp3')
# 视频中插入音频
final_clip = my_clip.set_audio(audio_background)
# 保存为最终的视频   动听的音乐!漂亮小姐姐词云跳舞视频!
final_clip.write_videofile('final_video.mp4')


技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

其实特简单,Python 做一个漂亮女孩词云跳舞的视频相关推荐

  1. 利用python做微信聊天记录词云分析——记录美好回忆

    目录 1 概述 2 数据准备 2.1 安卓设备 2.1.1 Root手机,安装Root Explorer 2.1.2 用Root Explorer将聊天记录的数据文件导出并存入电脑 2.1.3 对En ...

  2. 利用Python做一个漂亮小姐姐词云跳舞视频

    最近不少小伙伴在学 Python,想找个好玩的练手项目. 那今天分享一个,简单,适合新手的 Python 小项目. 以下是具体项目: 本文将以哔哩哔哩–乘风破浪视频为例,you-get下载视频. 同时 ...

  3. 【Python】如何用python做一个简单的输入输出交互界面?

    看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...

  4. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  5. 利用Python做一个小姐姐词云跳舞视频

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来源:修炼Python 每周三个人直播,想和我聊天的欢迎来约 ‍‍‍‍‍‍‍朝朝暮暮里,祝愿我们每个人都能沉淀 ...

  6. python怎么写游戏脚本_用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  7. 用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  8. 用python做一个简单GUI小软件

    用python做一个简单软件 前言 这是一个课设,用python做一个扫描王软件 我主要做的GUI部分,记录分享一下.也是第一次用python做小软件,python的方便果然是名不虚传 遇到问题 1. ...

  9. 用python做一个简单的游戏,用python写一个小游戏

    大家好,本文将围绕如何用python做一个简单的小游戏展开说明,python编写的入门简单小游戏是一个很多人都想弄明白的事情,想搞清楚用python做一个简单的游戏需要先了解以下几个事情. 1.Pyt ...

最新文章

  1. LeetCode OJ:Remove Element(移除元素)
  2. Mysql 数据库重置ID排序
  3. 小白视觉第一步保存图片
  4. java transient_【转】Java中的关键字 transient
  5. KMPLAYER无法播放rmvb格式的解决办法
  6. 纯java生成excel
  7. DataGridRow的创建
  8. HBase 手动 flush 机制梳理
  9. .net环境下如何使用MySql数据库
  10. [AtCoder Beginner Contest 133]F - Colorful Tree
  11. 三运放差分放大电路分析_运放19——三运放仪表放大器工作原理分析
  12. 微信小程序:人生重开模拟器
  13. 动荡市场的利剑——“统计套利”
  14. win10 无声音 耳机设备不显示 驱动显示正常 就是没有声音
  15. 疫情之下春运人口回流“硬核”预测:往返这些超级网络节点城市有更大感染风险
  16. java应届生如何找工作?
  17. Praat使用 | 辅助Praat进行标注的工具
  18. 使用VISA编程入门教程
  19. 小猪o2o生活通系统安装后空白页面是什么原因怎么解决?
  20. python画图为什么运行不出来_python matplotlib画的图怎么显示不出来

热门文章

  1. 工作日志22-04-22
  2. Switch组件的使用
  3. windows CMD命令大全及详细解释和语法
  4. 测试架构需要具备哪些能力
  5. wpf matlab混编,WPF(C#)与MATLAB混合编程
  6. 16含参数的极限问题
  7. 如何第一次办理港澳通行证、护照、台湾通行证
  8. 婚恋交友网站比相亲更靠谱!幸福婚姻算法了解一下
  9. 电音(5)Bass类电音
  10. 【SDX12】高通SDX12 NatType功能分析及实现