项目背景

今天一个朋友想下载东方财富网上的2019巴菲特股东大会直播视频,我觉得还挺有趣,之前没有爬取过视频,所以研究了下,用python实现了爬取这个视频。

其实,以现在的带宽网速及wifi普及,我们已经很少去下载视频了,很多视频,都是直接在线观看,但偶尔也有下载的需求,比如下载课程视频,或者下载一些视频后,剪辑合成一些视频,或者下载一些你觉得比较重要有帮助的视频,就像这个例子一样,巴菲特的股东大会视频对很多投资者来说,还是很有价值的。

项目思路

  • 确定相关的url
  • 爬取相应的ts文件
  • 合并ts文件

以下是要爬取的视频网站

url = "http://finance.eastmoney.com/a/201905041112402538.html"

F12打开开发者模式,Netwoking下,选择XHR,当视频播放时,会产生如下的带.ts的url,这实际上将整个视频,分成了众多的小视频片段,任意选择一个,复制网址,打开就会直接下载一个.ts格式的视频小片段,可以直接用播放器播放。所以,我们就是要爬取这些小视频片段,然后合并成一个视频即可。

这样看问题就简单多了,获取或者构造.ts的url,然后去爬取下载视频即可。

分析ts url

比较url_1和url_3,我们会发现,.ts前边是1和14,如果我们看了其他的ts url,会发现就是划分的视频小片段,而且一般划分数量都不少,这里有178个。

比较url_1和url_2,都是在14.ts下的,只不过后边start, end不一样,我们直接去掉 “?”后边的部分,打开前半部分的url后,可以下载整个14片段的视频,相当于这边视频片段14又进行了子划分,我们只需构造问号前半部分的url即可。

再比较url_1和url_3前半部分url,会发现只有“3228861720_780805890_14.ts” 与 “3228861720_1565367120_1.ts”这部分是不一样的,问题简化为,找到或者构造出这部分的内容,发现中间部分很难直接构造。

url_1:
http://1252033264.vod2.myqcloud.com/4697b79evodcq1252033264/3cea53065285890788726506999/
3228861720_780805890_14.ts?start=15163892&end=16534411&type=mpegtsurl_2:http://1252033264.vod2.myqcloud.com/4697b79evodcq1252033264/3cea53065285890788726506999/
3228861720_780805890_14.ts?start=12526252&end=15163891&type=mpegtsurl_3:
http://1252033264.vod2.myqcloud.com/4697b79evodcq1252033264/3cea53065285890788726506999/
3228861720_1565367120_1.ts?start=8069900&end=9171203&type=mpegts

这块让我很郁闷,看了网上的帖子后,继续分析Networking, 直到我发现了含有.m3u8的url,我直接打开后,或者打开去掉url后边的参数部分,会下载一个.m3u8的文件。打开文件后,发现里边包含了我们需要字段名,所以构造url的问题也解决了,访问这个网址获取文本内容,正则表达式匹配我们需要的部分,然后就可以构造我们的url了。

http://1252033264.vod2.myqcloud.com/4697b79evodcq1252033264/3cea53065285890788726506999/
playlist.m3u8?t=5f37a52f&exper=0&us=7106fcd370&sign=86432b5694bc6b668690312c790d7d11

以下是代码:

# -*- coding:utf-8 -*-
import requests
import re
from urllib.request import urlretrieve
import os
from concurrent.futures import ThreadPoolExecutor
from shutil import rmtreeclass DownloadVideo:def __init__(self, m3u8_url):self.m3u8_url = m3u8_urlself.ts_url = []self.count = 0# 分析networking中,可以找到一个m3u8的链接,其包含了所有ts video的url名字def get_ts_url(self):m3u8_text = requests.get(self.m3u8_url).text# 正则表达式获取.ts的字段re_list = re.findall(r".*?\.ts", m3u8_text)for ts_name in re_list:# 拼接出ts的urlpre_url = re.match(r"(.*?/)[A-Za-z0-9._]+\.m3u8.*", self.m3u8_url).group(1)target_url = pre_url + ts_nameif target_url not in self.ts_url:self.ts_url.append(target_url)return self.ts_url# 下载单个ts文件def __download_ts(self, url, i):# 创建存放ts的文件夹path = os.getcwd() + "/ts_file"if not os.path.exists(path):os.makedirs(path)name = "%03d" % i + ".ts"filename = path + "/" + name# 开始下载tsurlretrieve(url, filename=filename)# 多进程下载def pool_download(self):print("需要下载%d个文件" % len(self.ts_url))print('正在下载...所需时间较长,请耐心等待...')pool = ThreadPoolExecutor(max_workers=16)pool.map(self.__download_ts, self.ts_url, range(1, len(self.ts_url)+1))pool.shutdown()print("下载完成")def merge_ts(self):file = os.getcwd() + "\\ts_file\\*.ts"target = os.getcwd() + "\\video.ts"cmd = "copy /b " + file + " " + targettry:print("开始合并ts文件...")os.system(cmd)print("完成ts文件合并")# 合并完成后,删除其余的ts文件rmtree(os.getcwd() + "\\ts_file")except Exception as e:print(e)def execute(self):self.get_ts_url()print("获取ts url...")self.pool_download()self.merge_ts()print("完成")if __name__ == "__main__":url = "http://1252033264.vod2.myqcloud.com/4697b79evodcq1252033264/3cea53065285890788726506999/playlist.m3u8?"download_video = DownloadVideo(url)download_video.execute()

几点说明:

  1. 根据ts url下载视频,我们采用了urllib.request模块下的 urlretrieve(url, filename=filename)函数来下载ts视频片段
  2. 在__download_ts中,下载ts前,会在当前工作目录下,创建./ts_file文件夹,用来临时存放下载的ts文件,后期合并后(函数merge_ts),会通过shutil.rmtree来移除整个ts_file文件夹和ts文件。
  3. 我们采用多进程进行下载,使用了concurrent.futures模块中的ThreadPoolExecutor(max_woker=16),以及map(func, iterable)函数,来实现多进程下载。

PS: 如果你有疑问,或者意见、建议,欢迎讨论!!!

python爬取视频--下载2019巴菲特股东大会直播视频相关推荐

  1. python代码示例下载-python爬取音频下载的示例代码

    抓取"xmly"鬼故事音频 import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块 import requests headers = { & ...

  2. Python爬取De下载站相关代码

    Python爬取De下载站相关代码,因为没有设置代理,所以爬到800页左右就被干掉了,后续要加上 import urllib.request import bs4 import re import t ...

  3. python爬取b站数据_如果利用Python爬取B站上千万数据?B站直播都是大屌萌妹吗?...

    粉丝独白 说起热门的B站相信很多喜欢玩动漫的,看最有创意的Up主的同学一定非常熟悉.我突发奇想学Python这么久了,为啥不用Python爬取B站中我关注的人,已经关注的人他们关注的人,看看全站里面热 ...

  4. python 爬取电影下载链接

    #!/usr/bin/python #coding=UTF-8 import sys import urllib2 import os import chardet from bs4 import B ...

  5. Python爬取《明日之子》(腾讯视频)评论和弹幕,看看大家都在吐槽什么

    微信公众号原文链接 今年夏天各电视和视频平台同步播出了许多音乐综艺节目,包括热度较高的<乐队的夏天>.<明日之子>.<声入人心>.<我是唱作人>.< ...

  6. 小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来源:凹凸数据 看到标题, 啪的一下你就进来了吧! 如果有经常刷B站的小伙伴,肯定都知道B站鬼畜现在的顶流是谁 ...

  7. python爬取并下载代码_python 爬取并批量下载网易云歌单源代码

    #!/usr/bin/env python#!--*--coding:utf-8 --*-- #![url=home.php?mod=space&uid=238618]@Time[/url]  ...

  8. 使用python爬取电影下载地址并使用transmissionrpc下载

    说明 python练手,爬取电影天堂的新电影,获取到磁力链接,输出到日志文件,使用transmissionrpc下载, 涉及知识点: 1.python 操作mongodBD,参考文档 2.Beauti ...

  9. 怎么用python爬取老师_小年轻不讲武德,竟用Python爬取B站上1.4w条马保国老师视频数据进行分析...

    看到标题,啪的一下你就进来了吧!如果有经常刷B站的小伙伴,肯定都知道B站鬼畜现在的顶流是谁? 印度:没错正是在下 那必须是当代大师浑元形意太极拳掌门人「马保国」先生啊! 实话讲,马保国走进大家视野还是 ...

最新文章

  1. CFCC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
  2. 技术关注:搜索引擎经验
  3. ubuntu16.04下安装emacs
  4. 对于一颗具有n个结点,度为4的树来说,( )
  5. html循环自动点击事件,js循环遍历ul中li的点击事件,给给选中li添加css
  6. android中ActionBar的几个属性
  7. 考研复习——时间安排小结
  8. 从短信类到短信平台之设计篇
  9. 【java】输入输出流
  10. Java基础——环境变量配置、注释、关键字、标识符
  11. 基于JAVA藏宝阁游戏交易系统计算机毕业设计源码+系统+lw文档+部署
  12. Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
  13. Oracle索引概述
  14. 查看临时表空间的使用情况(以此为准)
  15. B.FRIENDit:键盘轴体零死角剖析,挑选机械式键盘不必烦恼!
  16. 图像采集及传输速率计算
  17. 解决ubuntu18.04版本点击右键无法创建空白文档的问题
  18. 使用pydub的坑-----Permission denied: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\tmpmt80te3g.wav'
  19. STM8系列5大主流成员(S,L,T,AF,AL)
  20. JPA当天时间范围查询

热门文章

  1. 十九、RTC实时时钟
  2. 论文导读 | 图数据流子图查询
  3. 如何办理icp许可证,没有icp许可证有什么影响
  4. (附源码)计算机毕业设计SSM游泳馆管理平台
  5. html下拉菜单制作方法,CSS3制作Dropdown下拉菜单的方法
  6. 【汉字转拼音工具】Java 汉字转拼音
  7. 世界观、价值观和人生观三者之间的关系
  8. 亚马逊云计算服务将支持甲骨文数据库
  9. 浏览器翻译插件 沙拉查词;图片翻译;pdf 阅读器软件、pdf翻译工具
  10. 网络安全学习(十四)IP协议