Python实现视频下载功能


Posted in Python onMarch 14, 2017

最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容。如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站上,增加自己的人气,岂不美哉?

parker就是这样一个项目(项目地址:https://github.com/LiuRoy/parker),它采用celery框架定时爬取用户视频列表,将最新发布的视频通过you-get异步下载,可以很方便地实现分布式部署。因为各个网站的页面布局和接口更新比较频繁,为了保证程序的高可用,特意增加了Statsd监控,方便及时发现出错。

代码架构

Python实现视频下载功能

目前parker中只实现了B站和秒拍的下载,从框架图可以看出,针对每一类网站,需要实现两个异步接口:从用户视频主页解析发布视频的播放地址、根据播放地址下载视频。因此增加网站类型,不需要修改原来的代码,只需要添加新的解析和下载接口即可。针对视频下载完成之后的后续操作,我还没有实现,大家可以根据自己的需求自由的去实现。

在运行的时候,celery会将配置好的优质用户列表定时发送到对应网站的解析接口异步执行,筛选出最新发布的视频播放地址,交给对应的下载接口异步下载,下载完成之后再异步调用后续操作。因此需要启动一个celery beat进程发送定时任务,以及若干celery异步任务去执行解析和下载操作,对于比较大的视频,下载会相当耗时,建议根据任务列表的多少合理分配异步任务的个数。

程序运行

经验证,此程序可以在ubuntu和mac下正常运行, 由于本地windows下的celery无法正常启动,所以没有在windows环境做过验证。

依赖库安装

python版本为3.5,进入项目目录后,执行:

pip install -r requirements.txt

创建数据库表

提前在数据库中建好两张表(sql: https://github.com/LiuRoy/parker/blob/master/spider/models/tables.sql)

参数配置

config路径下的logging.yaml、params.yaml、sites.yaml分别对应日志配置、运行参数配置、热门用户配置。

日志配置

debug模式下日志会直接输出在标准输出流,release模式下会将日志内容输出到文件中,因此需要配置输出日志文件。

运行配置

  • mode debug调试模式,此模式下日志指向标准输出,并且没有监控数据;release模式下,日志输出到制定文件,并且有监控数据。
  • broker_url 对应于celery的BROKER_URL,可以配置为redis或者rabbitmq
  • mysql_url 数据库地址,需要提前建好两张表
  • download_path 视频下载路径
  • statsd_address 监控地址
  • video_number_per_page 每次从用户视频主页解析出多少条视频播放地址,因为大部分用户每次发布的视频个数很少,只需要设置成一个很小的值即可。在初次运行的时候,也不会下载大量久远的视频。
  • download_timeout 视频下载的超时时间

热门用户配置

parker会根据此配置生成一份celery beat scheduler列表。

  • name 规则是<网站类型>-<任务id>,parker会根据此作为scheduler任务名称
  • url 用户的发布视频主页
  • task 对应的celery解析异步任务
  • minute 多少分钟检查一次用户视频列表

启动任务

进入项目目录,执行下面命令启动celery worker

celery -A spider worker

执行下面命令启动celery beat定时任务

celery -A spider beat

监控

强烈安利一个docker镜像 https://hub.docker.com/r/samuelebistoletti/docker-statsd-influxdb-grafana/,一分钟配好监控环境有木有。之后只需要添加执行成功和执行异常的打点数据,就可以方便的监控程序是否正常运行了。

Python实现视频下载功能

以上所述是小编给大家介绍的Python实现视频下载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python多进程共享变量
Apr 06 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Django自定义认证方式用法示例
Jun 23 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
Django Rest framework权限的详细用法
Jul 25 Python
django 控制页面跳转的例子
Aug 06 Python
python实现登录密码重置简易操作代码
Aug 14 Python
python-numpy-指数分布实例详解
Dec 07 Python
Python求凸包及多边形面积教程
Apr 12 Python
python如何求圆的面积
Jul 01 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 #Python
python executemany的使用及注意事项
Mar 13 #Python
Python的标准模块包json详解
Mar 13 #Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 #Python
Python中functools模块函数解析
Mar 12 #Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 #Python
Python中str.format()详解
Mar 12 #Python
You might like
一个捕获函数输出的函数
2007/02/14 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
python文件名和文件路径操作实例
2017/09/29 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
人力资源部经理岗位职责规定
2014/02/23 职场文书
五四青年节演讲稿
2014/05/26 职场文书
关于保护环境的建议书
2014/08/26 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
教师年度考核个人总结
2015/02/12 职场文书
家庭经济困难证明
2015/06/23 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
利用Apache Common将java对象池化的问题
2022/06/16 Servers