11月份的头条,是属于马保国的。

一位69岁的老同志,惨遭年轻人偷袭,不讲武德。

看看把老同志欺负的…

要不是马老师讲仁义讲道德,甩手就是一个五连鞭。

哈哈哈,所以本期我们就用Python给马保国老师做一个闪电五连鞭动态词云图

词云数据来自B站,使用stylecloud词云库绘制。

主要参考百度AI Studio上的一个开源项目,使用PaddleSeg对人像进行分割。

年轻人不讲武德这样好吗耗子尾汁

 

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1156465813

 

没从B站上直接爬取,使用第三方库bilibili_api

这是一个用Python写的调用Bilibili各种API的库,范围涵盖视频、音频、直播、动态、专栏、用户、番剧等。

地址:https://passkou.com/bilibili_api/docs/

使用video模块下面的两个方法,可以获取11月每天的视频弹幕。

首先需要获取SESSDATACSRF(bili_jct)的值。

谷歌浏览器可以通过下图查看,域名选择bilibili.com。

以点击量为排序,选取排行第一的视频获取弹幕。没想到马老师老早就火了,耗子尾汁。

点击排名第一的视频,然后在浏览器的访问栏获取BV号,BV1HJ411L7DP。

获取弹幕代码如下。

  1. from bilibili_api import video, Verify
  2. import datetime
  3.  
  4. # 参数
  5. verify = Verify("你的SESSDATA值", "你的bili_jct值")
  6.  
  7. # 获取存在历史弹幕的日期列表
  8. days = video.get_history_danmaku_index(bvid="BV1HJ411L7DP", verify=verify)
  9. print(days)
  10.  
  11. # 获取弹幕信息,并保存
  12. for day in days:
  13. danmus = video.get_danmaku(bvid="BV1HJ411L7DP", verify=verify, date=datetime.date(*map(int, day.split(\'-\'))))
  14. print(danmus)
  15.  
  16. f = open(r\'danmu.txt\', \'a\')
  17. for danmu in danmus:
  18. print(danmu)
  19. f.write(danmu.text + \'\n\')
  20. f.close()

得到结果。

 

 

我大E了啊,没有闪。

使用jieba对弹幕数据进行分词处理

  1. import jieba
  2. def get_text_content(text_file_path):
  3. \'\'\'
  4. 获取填充文本内容
  5. \'\'\'
  6. text_content = \'\'
  7. with open(text_file_path, encoding=\'utf-8\') as file:
  8. text_content = file.read()
  9. # 数据清洗,只保存字符串中的中文,字母,数字
  10. text_content_find = re.findall(\'[\u4e00-\u9fa5a-zA-Z0-9]+\', text_content, re.S)
  11. text_content = \' \'.join(jieba.cut(str(text_content_find).replace(" ", ""), cut_all=False))
  12. print(text_content)
  13. return text_content
  14.  
  15.  
  16. text_content = get_text_content(\'danmu.txt\')

选取马保国原版素材视频,B站上有高清的。

地址:https://www.bilibili.com/video/BV1JV41117hq

参考网上的资料,运行如下代码即可下载B站视频

  1. from bilibili_api import video, Verify
  2. import requests
  3. import urllib3
  4.  
  5. # 参数
  6. verify = Verify("你的SESSDATA值", "你的bili_jct值")
  7.  
  8. # 获取下载地址
  9. download_url = video.get_download_url(bvid="BV1JV41117hq", verify=verify)
  10. print(download_url["dash"]["video"][0][\'baseUrl\'])
  11.  
  12. baseurl = \'https://www.bilibili.com/video/BV1JV41117hq\'
  13. title = \'马保国\'
  14.  
  15.  
  16. def get_video():
  17. urllib3.disable_warnings()
  18.  
  19. headers = {
  20. \'user-agent\': \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\',
  21. \'Accept\': \'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\',
  22. \'Accept-Encoding\': \'gzip, deflate, br\',
  23. \'Accept-Language\': \'zh-CN,zh;q=0.9,en;q=0.8\'
  24. }
  25. headers.update({\'Referer\': baseurl})
  26. res = requests.Session()
  27. begin = 0
  28. end = 1024 * 1024 - 1
  29. flag = 0
  30.  
  31. temp = download_url
  32.  
  33. filename = "./" + title + ".flv"
  34. url = temp["dash"]["video"][0][\'baseUrl\']
  35. while True:
  36. headers.update({\'Range\': \'bytes=\' + str(begin) + \'-\' + str(end)})
  37. res = requests.get(url=url, headers=headers, verify=False)
  38. if res.status_code != 416:
  39. begin = end + 1
  40. end = end + 1024 * 1024
  41. else:
  42. headers.update({\'Range\': str(end + 1) + \'-\'})
  43. res = requests.get(url=url, headers=headers, verify=False)
  44. flag = 1
  45. with open(filename, \'ab\') as fp:
  46. fp.write(res.content)
  47. fp.flush()
  48. if flag == 1:
  49. fp.close()
  50. break
  51.  
  52. print(\'--------------------------------------------\')
  53. print(\'视频下载完成\')
  54. filename = "./" + title + ".mp3"
  55. url = temp["dash"]["audio"][0][\'baseUrl\']
  56. while True:
  57. headers.update({\'Range\': \'bytes=\' + str(begin) + \'-\' + str(end)})
  58. res = requests.get(url=url, headers=headers, verify=False)
  59. if res.status_code != 416:
  60. begin = end + 1
  61. end = end + 1024 * 1024
  62. else:
  63. headers.update({\'Range\': str(end + 1) + \'-\'})
  64. res = requests.get(url=url, headers=headers, verify=False)
  65. flag = 1
  66. with open(filename, \'ab\') as fp:
  67. fp.write(res.content)
  68. fp.flush()
  69. if flag == 1:
  70. fp.close()
  71. break
  72.  
  73. print(\'音频下载完成\')

记得添加SESSDATA和CSRF(bili_jct)的值

 

基于百度AI Studio的项目,项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/1176398

首先下载解压安装PaddleSeg相关依赖包。

  1. # 下载PaddleSeg
  2. git clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.git
  3.  
  4. cd PaddleSeg/
  5.  
  6. # 安装所需依赖项
  7. pip install -r requirements.txt

通常去「GitHub」上下载东西,速度都比较慢,可以使用加速链接。

这里的fastgit.org一加,下载速度就能从几十K飙升到几兆每秒。

  1. # 新建文件夹
  2. mkdir work/videos
  3. mkdir work/texts
  4. mkdir work/mp4_img
  5. mkdir work/mp4_img_mask
  6. mkdir work/mp4_img_analysis

新建一些文件夹,主要用来存放相关文件的。

这里可以将之前爬取到的视频和音频放置在videos中。

先对素材视频进行抽帧,就是获取视频每帧的图片。

  1. def transform_video_to_image(video_file_path, img_path):
  2. \'\'\'
  3. 将视频中每一帧保存成图片
  4. \'\'\'
  5. video_capture = cv2.VideoCapture(video_file_path)
  6. fps = video_capture.get(cv2.CAP_PROP_FPS)
  7. count = 0
  8. while (True):
  9. ret, frame = video_capture.read()
  10. if ret:
  11. cv2.imwrite(img_path + \'%d.jpg\' % count, frame)
  12. count += 1
  13. else:
  14. break
  15. video_capture.release()
  16.  
  17. filename_list = os.listdir(img_path)
  18. with open(os.path.join(img_path, \'img_list.txt\'), \'w\', encoding=\'utf-8\') as file:
  19. file.writelines(\'\n\'.join(filename_list))
  20.  
  21. print(\'视频图片保存成功, 共有 %d \' % count)
  22. return fps
  23.  
  24.  
  25. input_video = \'work/videos/Master_Ma.mp4\'
  26. fps = transform_video_to_image(input_video, \'work/mp4_img/\')

一共是获取到了564张图片。

然后使用PaddleSeg将所有的视频图片,进行人像分割,生成mask图片。

  1. # 生成mask结果图片
  2. python 你的路径/PaddleSeg/pdseg/vis.py \
  3. --cfg 你的路径/work/humanseg.yaml \
  4. --vis_dir 你的路径/work/mp4_img_mask

使用模型进行预测,其中humanseg.yaml文件是作者提供的,可以进行图像分割。

预训练模型deeplabv3p_xception65_humanseg,需下载解压安装放在PaddleSeg/pretrained_model下。

由于预训练模型较大,就不放网盘上了,直接访问下面这个链接即可下载。

  1. # 下载预训练模型deeplabv3p_xception65_humanseg
  2. https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz

记得需要将humanseg.yaml文件中的路径信息,修改成你自己的路径。

运行上面那三行命令,最后就会生成564张mask文件。

 

使用stylecloud词云库生成词云,使用字体方正兰亭刊黑。

  1. def create_wordcloud():
  2. for i in range(564):
  3. file_name = os.path.join("mp4_img_mask/", str(i) + \'.png\')
  4. # print(file_name)
  5. result = os.path.join("work/mp4_img_analysis/", \'result\' + str(i) + \'.png\')
  6. # print(result)
  7. stylecloud.gen_stylecloud(text=text_content,
  8. font_path=\'方正兰亭刊黑.TTF\',
  9. output_name=result,
  10. background_color="black",
  11. mask_img=file_name)

因为stylecloud库无法自定义词云图片,所以我修改了它的代码。

给gen_stylecloud添加了mask_img这个参数,最终作用在gen_mask_array这个函数上。

如此就能将mask图片转化成词云图!

将这些词云图片合并成视频。

 

  1. def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):
  2. \'\'\'
  3. 合并图像到视频
  4. \'\'\'
  5. fourcc = cv2.VideoWriter_fourcc(*\'mp4v\')
  6.  
  7. file_items = [item for item in os.listdir(comb_path) if item.endswith(\'.png\')]
  8. file_len = len(file_items)
  9. # print(comb_path, file_items)
  10. if file_len > 0:
  11. print(file_len)
  12. temp_img = cv2.imread(os.path.join(comb_path, file_items[0]))
  13. img_height, img_width, _ = temp_img.shape
  14.  
  15. out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height))
  16.  
  17. for i in range(file_len):
  18. pic_name = os.path.join(comb_path, \'result\' + str(i) + ".png")
  19. print(pic_name)
  20. if is_print:
  21. print(i + 1, \'/\', file_len, \' \', pic_name)
  22. img = cv2.imread(pic_name)
  23. out.write(img)
  24. out.release()
  25.  
  26.  
  27. combine_image_to_video(\'work/mp4_img_analysis/\', \'work/mp4_analysis.mp4\', 30)

使用ffmpeg对视频进一步的处理,裁剪+重叠。

  1. # 视频裁剪
  2. ffmpeg -i mp4_analysis_result.mp4 -vf crop=iw:ih/2:0:ih/5 output.mp4
  3.  
  4. # 视频重叠
  5. ffmpeg -i output.mp4 -i viedeos/Master_Ma.mp4 -filter_complex "[1:v]scale=500:270[v1];[0:v][v1]overlay=1490:10" -s 1920x1080 -c:v libx264 merge.mp4
  6.  
  7. # 添加音频
  8. ffmpeg -i merge.mp4 -i videos/Master_Ma.mp4 -c:v copy -c:a copy work/mp4_analysis_result2.mp4 -y
  9.  
  10. # 生成gif图
  11. ffmpeg -ss 00:00:22 -t 3 -i merge.mp4 -r 15 a.gif

ffmpeg的安装及使用就得靠大伙自己百度啦~

注意:如果你是打算找python高薪工作的话。我建议你多写点真实的企业项目积累经验。不然工作都找不到,当然很多人没进过企业,怎么会存在项目经验呢? 所以你得多找找企业项目实战多练习下撒。如果你很懒不想找,也可以进我的Python交流圈:1156465813。群文件里面有我之前在做开发写过的一些真实企业项目案例。你可以拿去学习,不懂都可以在裙里找我,有空会耐心给你解答下。

 

以下内容无用,为本篇博客被搜索引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是干什么的 零基础学 python 要多久 python 为什么叫爬虫
python 爬虫菜鸟教程 python 爬虫万能代码 python 爬虫怎么挣钱
python 基础教程 网络爬虫 python python 爬虫经典例子
python 爬虫
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上内容无用,为本篇博客被搜索引擎抓取使用

版权声明:本文为shuchongzeishuai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shuchongzeishuai/p/14040968.html