Python爬取视频指南

摘自:https://www.jianshu.com/p/9ca86becd86d

前言

前两天尔羽说让我爬一下菜鸟窝的教程视频,这次就跟大家来说说Python爬取视频的经验

正文

https://www.cniao5.com/

菜鸟窝上有很多教程视频,但是这些视频好像没有直接的下载地址,而且有些教程视频还是有期限的,那么问题就产生了
我看的速度比较慢而且视频又很多,没等我看完视频就到期了怎么办?这时候写一个爬虫将这些教程视频下载下来就很好地解决了这个问题

当然,对于某些视频网站的VIP电影、视频之类的,一般情况下是无法在没有开通VIP的情况下用爬虫下载的,因为涉及到利益问题,同时数据传输也是加密的;想要看的话还是得开通会员再进行爬取

回到这次的目标上来,我们要爬取的是

https://www.cniao5.com/course/lessons/10153

上面的24章,共计202个教程视频

接下来我们来看看我们应该如何获取这些视频
首先我们看一下这个界面的源代码中没有关于课程视频的信息,那么我们点进去一个视频看看

通过开发者工具我们可以看到左侧都是这次加载视频是动态加载的信息,我们一个个来看
首先是url,我们可以看到这个链接是 Post 方式请求的(然鹅实际上再通过postman测试可以知道,并不用带上什么参数请求,吓唬人呢...)

这就是url返回的数据,其中 hd 、shd 代表高清、超清的视频类型,而当你访问这个链接后会自动下载一个 m3u8 文件,这介绍一下

m3u8 文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放

而我们下载视频的方式就是通过向m3u8文件中的这些 .ts 的链接发送请求而下载一个个 ts视频流 (暂时这么称呼)

下一个就是 chapters ,这里呢则是包含了所有24章视频的一些基本信息

注意这里的 vid 参数,之后我们会用到

这个就是网页上加载的m3u8 文件

十一

这看似乱码的ts文件下载下来后就是一个几秒钟的视频了

十二

而我们最后要做的就是将这些 ts 文件合成为一个 mp4 文件

十三

十四

那么如何来操作呢?

思路

通过请求 chapters 的链接获取每一个章节中每一个lesson的播放 url 地址(就是返回中带有 hd 、shd的),取出并请求 hd 的链接,下载m3u8文件,匹配m3u8文件中的每一个 ts ,请求 ts 文件对应的链接并下载到本地,最后合成为一个mp4视频

来跟着代码看一下
首先小编是在本地先用代码创建好最终合成视频的存放的空文件夹以便访问

十五

十六

def mkd():
    for i in range(1, 25):
        finalpath = ‘D:\\Python\\PycharmProject\\FinalCniao5\\{}‘.format(i)
        # 判断路径文件是否存在,不存在则创建
        f = os.path.exists(finalpath)
        if not f:
            os.makedirs(finalpath)
            print(‘make file success...‘)
        else:
            print(‘file already exists...‘)

接着创建对应章节的文件夹

# 防止 requests 开得太多
s = requests.session()
r_chapters = s.get(‘https://www.cniao5.com/api/v1/course/10153/chapters‘)
json_chapters = r_chapters.json()
# print(json_chapters)
for chapter in json_chapters:
    # 每一个章节
    chapter_name = chapter[‘bsort‘]
    print(chapter_name)
    # 根据课程数创建对应的课程文件夹
    path1 = self.file_path1.format(chapter_name)
    f = os.path.exists(path1)
    if not f:
        os.makedirs(path1)
        print(‘make file success...‘)
    else:
        print(‘file already exists...‘)

对章节中的每一个课程,获取其 id、key、file_id 创建对应的课程文件夹(用来保存ts文件)

for lessons in chapter[‘lessons‘]:
    # 章节下的每一个课程
    lessons_name = ‘lessons‘ + str(lessons[‘bsort‘])
    # 获取其id
    video_id = lessons[‘video_info‘][‘vid‘]
    # 获取 key
    key = lessons[‘key‘]
    # 后面用到
    file_id = lessons[‘video_info‘][‘file_id‘]
    print(lessons_name, video_id)
    # 每个视频创建一个视频id的文件夹
    path = ‘D:\\Python\\PycharmProject\\Cniao5\\{}\\{}‘.format(chapter_name, lessons_name)
    f = os.path.exists(path)
    # 基于中断后,创建文件时判断,若存在该文件夹则跳过对该视频的下载,若不存在则继续

对于之后则需要分为两种情况,我不知道菜鸟窝是怎么想的,你可以看到对于有的视频 vid 有具体的数值,有的则是 0

2019-01-02_225429.png

2019-01-02_225453.png

2019-01-02_225509.png

也就是说对于 vid 有值的我们可以很容易构造 url 链接从而获取 m3u8 文件进而下载 ts 视频;但是对于没有的来说就麻烦了,我们不能直接构造这个 url 链接
而对于这一类视频则是这样的

2019-01-02_225808.png

2019-01-02_225827.png

2019-01-02_225904.png

这类视频不是通过 m3u8 来处理视频的而是直接给了一个 mp4 的地址,那么也就是说对于 vid 为0的视频我们需要访问

https://playvideo.qcloud.com/getplayinfo/v2/1255567694/5285890782726972640

才可以拿到这个视频,那么这个 url 中后面的两个参数是什么呢
这个 5285890782726972640 我们在上图中可以发现就是之前提到的 file_id 这也是我们为什么要获取的原因;而前面的1255567694你多看几个就知道这个是不变的

而当你去访问这个 MP4 的链接时菜鸟窝会告诉你,你没有权限请求这个链接,what?
而这时候你要知道所谓爬虫就是模拟人对浏览器进行的操作而获取一定的结果,那么我们可以带上请求头来试试,小编是在用 fiddler 抓包后肯定了这一点,最后测试发现只要带上 header 中的 referer 就可以访问

2019-01-02_230702.png

2019-01-02_231030.png

而这个 referer 也是有讲究的,这个后面跟的奇怪的参数正是上述中你们都快忘了的 key ,这个是每个 lesson 中都有的

所以对于这种情况,之后只要把请求 MP4 链接后的内容以二进制方式保存就行

此外还要注意对于 ts 文件,在请求时的前缀是
https://vodi97egsxf.vod.126.net/vodi97egsxf/

2019-01-02_231639.png

而在合并 ts 文件时,我用的是通过Python调用 windows 自带的合成的命令来合成,但是需要注意合成时候的文件名一定按 001,002,...,010,...,099,100...如此排列;而如果按 1,2,3,...,10,11,...,99,100 则合并不会成功

所以在保存时就应该注意指定文件的名称即可

好了看到这里相信你应该有了一个基本的认识了,需要完整源码的也可以联系小编

原文地址:https://www.cnblogs.com/LiuYanYGZ/p/12051579.html

时间: 2024-10-13 15:36:01

Python爬取视频指南的相关文章

python 爬取视频评论生成词云图

首先爬取评论写入文件,用上一篇爬取腾讯是视频的评论的方法提取评论http://blog.51cto.com/superleedo/2126099 代码需要稍作修改如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import re import urllib.request import time import urllib.error ##模拟浏览器安装headers headers=("User-Agent","Mozil

python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 "一出好戏" . 分析页面 我用的是chrome浏览器,F12进入查看.选择NetWork的Doc,发现主体部分的数据是从这个网站获取的. 在地址栏输入这个链接,跳转到了视频来源的播放页面. 当然,在这个页面就可以直接观看视频了,但是我们要把视频下载下来. 寻找视频文件 仍然是之前那个页面,在Other中,我们发现了一些奇怪的

都说抖音是毒品软件?我用Python爬取了里面的小视频!

简介 抖音,是一款可以拍短视频的音乐创意短视频社交软件,该软件于2016年9月上线,是一个专注年轻人的15秒音乐短视频社区.用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品.此APP已在Android各大应用商店和APP Store均有上线. 今天咱们就用Python爬取抖音视频 获得视频播放地址 查询的用户ID 视频名字列表 视频链接列表 用户昵称 获得带水印的视频播放地址 video_url:带水印的视频播放地址 download_url: 带水印的视频下载地址 视频下载

没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不是打广告的,没收广告费的) 同时,之前同事也发了一个贴吧的段子聚居地,客官稍等,马上奉上连接:段友之家?https://tieba.baidu.com/f?ie=... 然后呢,看到上面,确实好多段友在上面,于是乎,我就想爬取他们的图片和小视频,就有了这篇文章的主题: 其实吧,用Python爬取网站数据是最基

最后轻松一夏,周末利用python爬取“陈翔六点半”搞笑视频!

觉得程序员再忙也需要给自己安排一点娱乐时间,对自己好点,自己对自己不好,谁会? 自己娱乐一般会有:跑步.看电影.小视频,而小视频是最家常的娱乐方式,看得最多的小视频是「 陈翔六点半 」,咦! 拍得搞笑,演技也一流,也不乏有内涵!非常推荐大家看看. 时间太贵,我耗不起 正题 先上Python爬取小视频的效果图,duang.duang.duang.想下载什么就是什么,哈哈. 打开浏览器(电脑版,方便调试)输入微博 url 点击输入框,输入「陈翔六点半」,回车搜索 但是发现在这个页面就只用几个视频.滑

python爬取小视频,看完身体一天不如一天!

Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,都放在了文章结尾,欢迎前来领取!python爬取小视频记录学习python简单爬虫小程序,记录代码和学习过程环境信息python 2.7.12分析与步骤 要分析网站信息 http://www.budejie.com/video/ 查看网页不同页面的信息http://www.budejie.com/video/2http://www.budejie.

Python 爬取周杰伦instagram

Python 爬取周杰伦instagram 整体框架 使用国内能访问的某国外 app angine 爬取Jay的 Instagram 并显示,再使用国内的 sae 访问这个网站,再爬取一次并发送到微博小号. bs4 使用requests爬取 Instagram 时候,并没有加request header,Instagram 对 robot 还算友好,直接返回不带 js 的网页信息.通过bs4迅速定位到照片.视频信息,再用正则表达式提取到链接并下载.显示. from bs4 import Beau

使用python爬取csdn博客访问量

最近学习了python和爬虫,想写一个程序练练手,所以我就想到了大家都比较关心的自己的博客访问量,使用python来获取自己博客的访问量,这也是后边我将要进行的项目的一部分,后边我会对博客的访问量进行分析,以折线图和饼图等可视化的方式展示自己博客被访问的情况,使自己能更加清楚自己的哪些博客更受关注,博客专家请勿喷,因为我不是专家,我听他们说专家本身就有这个功能. 一.网址分析 进入自己的博客页面,网址为:http://blog.csdn.net/xingjiarong 网址还是非常清晰的就是cs

python爬取某个网站的图片并保存到本地

python爬取某个网站的图片并保存到本地 #coding:utf-8 import urllib import re import sys reload(sys) sys.setdefaultencoding('gb2312') #获取整个页面的数据 def getHtml (url): page = urllib.urlopen(url) html = page.read() return html #保存图片到本地 def getImg(html): reg = r'src="(.+?\.