点击上方蓝色小字,关注“涛哥聊Python

重磅干货,第一时间送达

来源:修炼Python

每周三个人直播,想和我聊天的欢迎来约

‍‍‍‍‍‍‍朝朝暮暮里,祝愿我们每个人都能沉淀过往,迎来新光,找到生生不息的热爱和梦想。‍‍‍‍‍‍‍

一、前言

大家好,我是涛哥!

B站上的漂亮的小姐姐真的好多好多,利用 you-get 大法下载了一个 B 站上跳舞的小姐姐视频,利用视频中的弹幕来制作一个漂亮小姐姐词云跳舞视频,一起来看看吧。

二、实现思路

1. you-get下载视频

安装you-get

pip install you-get -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

利用 you-get 下载 B 站视频到本地    视频链接:https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619

you-get -i https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619
you-get -o 本地保存路径 视频链接

更多 you-get 大法的详细使用,可以参考官方文档:

https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E

2. 爬取弹幕内容

写 python 爬虫,解析网页、提取弹幕数据保存到txt,注意构造 URL 参数和伪装请求头。

导入用到的库

import requests
import pandas as pd
import re
import time
import random
from concurrent.futures import ThreadPoolExecutor
import datetime
from fake_useragent import UserAgent# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
start_time = datetime.datetime.now()

爬取弹幕数据

def  Grab_barrage(date):# 伪装请求头headers = {"sec-fetch-dest": "empty","sec-fetch-mode": "cors","sec-fetch-site": "same-site","accept-encoding": "gzip","origin": "https://www.bilibili.com","referer": "https://www.bilibili.com/video/BV1rD4y1Q7jc?from=search&seid=10634574434789745619","user-agent": ua.random,"cookie": "_uuid=0EBFC9C8-19C3-66CC-4C2B-6A5D8003261093748infoc; buvid3=4169BA78-DEBD-44E2-9780-B790212CCE76155837infoc; sid=ae7q4ujj; rpdid=|(JJmlY|YukR0J'ulmumY~u~m; LIVE_BUVID=AUTO4315952457375679; CURRENT_QUALITY=80; blackside_state=1; CURRENT_FNVAL=80; PVID=1; fingerprint3=89f3acebeacc72a0a25afa9c05f6d87c; fingerprint=2c691e81ffde16dfbb39b8f6d20eb5f0; fingerprint_s=99dc5d2a438924de14f663d6a4cf9cc8; buivd_fp=4169BA78-DEBD-44E2-9780-B790212CCE76155837infoc; bp_video_offset_501048197=472333401972842834; buvid_fp=4169BA78-DEBD-44E2-9780-B790212CCE76155837infoc; buvid_fp_plain=0AE6F247-D84F-48C7-87A8-F8F35A578544184985infoc; bfe_id=1e33d9ad1cb29251013800c68af42315; DedeUserID=501048197; DedeUserID__ckMd5=1d04317f8f8f1021; SESSDATA=2ae431c2%2C1625306326%2Ca312a*11; bili_jct=d4edec1bd2ab84e0eb453adb3971b19a"}# 构造url访问   需要用到的参数  爬取指定日期的弹幕params = {'type': 1,'oid': '206344228','date': date}# 发送请求  获取响应response = requests.get(url, params=params, headers=headers)# print(response.encoding)   重新设置编码response.encoding = 'utf-8'# print(response.text)# 正则匹配提取数据  转成集合去除重复弹幕comment = set(re.findall('<d p=".*?">(.*?)</d>', response.text))# 将每条弹幕数据写入txtwith open('bullet.txt', 'a+') as f:for con in comment:f.write(con + '\n')print(con)time.sleep(random.randint(1, 3))   # 休眠

主函数

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  -----------> 弹幕数据成功保存到本地txt')

主函数调用

if __name__ == '__main__':# 目标urlurl = "https://api.bilibili.com/x/v2/dm/history"start = '20201201'end = '20210128'# 生成时间序列date_list = [x for x in pd.date_range(start, end).strftime('%Y-%m-%d')]print(date_list)count = 0# 调用主函数main()

结果如下:

3. 从视频中提取图片

经过测试,这个视频完整分离出图片来有 3347 张,本文截取 800 张图片来做词云。

import cv2# ============================ 视频处理 分割成一帧帧图片 =======================================
cap = cv2.VideoCapture(r"beauty.flv")
num = 1
while True:# 逐帧读取视频  按顺序保存到本地文件夹ret, frame = cap.read()if ret:if 88 <= num < 888:cv2.imwrite(f"./pictures/img_{num}.jpg", frame)   # 保存一帧帧的图片print(f'========== 已成功保存第{num}张图片 ==========')num += 1else:break
cap.release()   # 释放资源

结果如下:

4. 利用百度AI进行人像分割

创建一个人像分割的应用,记住你的AppID、API Key、Secret Key,后面会用到。

查看人像分割的Python SDK 文档,熟悉它的基本使用。

# -*- coding: UTF-8 -*-
"""
@File    :人像分割.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
@百度AI  :https://ai.baidu.com/tech/body/seg
"""
import cv2
import base64
import numpy as np
import os
from aip import AipBodyAnalysis
import time
import random# 利用百度AI的人像分割服务 转化为二值图  有小姐姐身影的蒙版
# 百度云中已创建应用的  APP_ID API_KEY SECRET_KEY
APP_ID = '23485847'
API_KEY = 'VwGY053Y1A8ow3CFBTFrK0Pm'
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(88, 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}张图像分割完成 ========')time.sleep(random.randint(1,2))

结果如下:

5. 小姐姐跳舞词云生成

# -*- coding: UTF-8 -*-
"""
@File    :词云.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
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('bullet.txt') as f:data = f.read()# 文本预处理  去除一些无用的字符   只提取出中文出来
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('stop_words.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/'for num in range(88, 888):img = f'./mask_img/mask_{num}'# 获取蒙版图片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}张词云图生成 ========')

结果如下:

6. 合成跳舞视频

# -*- coding: UTF-8 -*-
"""
@File    :生成视频.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
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()   # 释放资源

效果如下:

7. 视频插入音频

漂亮小姐姐跳舞那么好看,再加上自己喜欢的背景音乐,岂不美哉。

# -*- coding: UTF-8 -*-
"""
@File    :插入音频.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import moviepy.editor as mpy# 读取词云视频
my_clip = mpy.VideoFileClip('result.mp4')
# 截取背景音乐
audio_background = mpy.AudioFileClip('song.mp4').subclip(17, 44)
audio_background.write_audiofile('vmt.mp3')
# 视频中插入音频
final_clip = my_clip.set_audio(audio_background)
# 保存为最终的视频   动听的音乐!漂亮小姐姐词云跳舞视频!
final_clip.write_videofile('final_video.mp4')

结果如下:

往期链接:

这款开源的 Python 老照片修复工具火了

太棒了!Jupyter 与PyCharm 完美融合,Jupytext 来啦!

那些被低估了的 Python 库

每周三我会进行Python&个人成长&职场&副业相关直播,想和我交流的欢迎来直播间。

·················END·················

你好,我是Sitin涛哥,非著名程序员,项目经理,现在创业中。

在公众号和视频号「涛哥聊Python」分享我的升级打怪经验!

很开心能够遇到你,欢迎添加我的微信 pengtaoshow ,备注来意,一起进步。

利用Python做一个小姐姐词云跳舞视频相关推荐

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

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

  2. 利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏

    1 首先小编先打开IDLE,如下图: 2 然后这里点击菜单栏的'File',然后点击菜单"New File",如下图: 3 然后我们就在idle中新建了一个python文件,如下图 ...

  3. 利用Python做一个简单的对战小游戏

    利用Python做一个简单的文字对战小游戏 一.游戏介绍 1.大体介绍:文字版的对战小游戏,可以利用Python随机生成两个角色,角色带有各自的血量和攻击值两个指标.两人在对战时同时攻击对方,同时造成 ...

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

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

  5. 如何使用python实现一个优雅的词云?(超详细)

     什么是词云 "词云"就是对网络文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或"关键词渲染". 从 ...

  6. python做一个小游戏_利用python做个小游戏

    从本期开始,我们将利用几天的时间用python来做个小游戏,当然,在做小游戏之前,我们必须学会一个做小游戏的第三方库--pygame.可能有人会说,python不擅长或者说不适合用来做游戏,的确是这样 ...

  7. b站小姐姐词云视频制作学习记录

    目录 开头 视频下载及处理 人像分割转化为二值图 获取弹幕作成词云图片 生成的词云图片变成视频 视频插入音频 最后 开头 前几天看了 宅男福利!我用Python做了一个B站跳舞的小姐姐,满屏的美腿!. ...

  8. 怎样利用python做一个软件,python可以自己做软件吗

    python能做什么软件? 主要可以做小程序,爬虫程序,用于系统编程等等还是很广泛的.Python 的应用领域分为下面几类.下文将介绍一些Python 具体能帮我们做的事情. 但我们不会对各个工具进行 ...

  9. 用 Python 做个小姐姐代码蹦迪视频

    前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开! 看着仙紫小姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把小仙女的蹦迪视频转成代码舞呢? 说干就干,今天 ...

最新文章

  1. android ant打包
  2. html表单的数据保存在哪里,提交和保存表单数据
  3. Codeforces Round #443 (Div. 2) B. Table Tennis
  4. java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串
  5. Python精确指南——第四章-部署和技巧
  6. 以“智变”应万变,揭秘新华三六大数字化解决方案!
  7. 洛谷——P1554 梦中的统计
  8. php分享二十五:跨域请求
  9. 变邻域搜索算法(Variable Neighborhood Search,VNS)
  10. mac上配置java jdk环境
  11. 2022深圳杯/东三省数学建模ABCD题 赛题分析解题方案
  12. Vue 截取视频第一帧作为封面图 然后转成base64,base64转成图片
  13. 个税汇算清缴是怎么算的,为何有人补税几百,有人退税几千?
  14. Ol3中Map事件全解析
  15. 千挑万选, 终于确定了
  16. JavaScript通过下标获取对象(字典)指定键和值
  17. PDF不能打印和复制的问题如何解决?
  18. python自动化测试实战下载_Selenium 2自动化测试实战:基于Python语言 (虫师著) 完整pdf扫描版[44MB]...
  19. 【无标题】开心开心开心
  20. 2022-2028年中国生活垃圾转运站行业竞争现状及投资决策建议报告

热门文章

  1. Verilog状态机详述
  2. 阿里健康四面,阿里飞猪技术两面经历分享,已进阿里飞猪
  3. python turtle 绘图小猪佩奇_python海龟作图完成小猪佩奇
  4. SPOJ的账号注册方法
  5. 登录页面(使用数据库)
  6. Duplicate Finder for Mac 1.4.3 重复文件查找和删除 破解版下载
  7. 互联网金融概念股龙头有哪些
  8. Cocos精品《地下城堡2》:从挂机到RPG 唯有暗黑始终如一
  9. 做一个登陆效果,输入用户名和密码,如果用户名是:张三,密码是:123就提示登陆成功,否则提示登录失败。
  10. 远程 PC 访问软件