一、bilibili视频的URL结构

人员素质测评理论与方法-06090-人力资源管理本科-江苏省高等教育自学考试_哔哩哔哩_bilibili

URL+P(参数)

二、编写程序输入URL和起始终止P

    # 输入bilibili视频的BV号# bv = input('视频BV号:')bv = 'BV15v411k75j'url = 'https://www.bilibili.com/video/' + bv# 选择视频从第几p开始到第几p结束# startPart = input('起始P:')startPart = 58# endPart = input('终止P;')endPart = 100

三、解析网页Chrome+F12,在<head>标签里,找到包含‘baseUrl’的<script>标签 具体是第几个,修改://head/script[5]/text()

ideoPlayInfo = str(_element.xpath('//head/script[5]/text()')[0].encode('utf-8').decode('utf-8'))[20:]

 找到User-Agent,替换headers

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36','Refer''er': 'https://www.bilibili.com/'}

四、下载视频和音频

区分GET和OPTION模式

五、合并视频和音频

ffmpeg实现时频和音频合并

def combineVideoAudio(videopath, audiopath, outpath):#command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i ' + '"' + audioDir + '"' ' -i ' + '"' + videoDir + '"' + ' -acodec copy -vcodec copy ' + '"' + outDir + '"'subprocess.call(("E:/ffmpeg/bin/ffmpeg -i " + videopath + " -i " + audiopath + " -vcodec copy -acodec copy " + outpath).encode("utf-8").decode("utf-8"), shell=True)os.remove(videopath)os.remove(audiopath)

整体下载源代码:

import jsonimport osimport subprocessimport requestsfrom lxml import etreeimport shutil
# 防止因https证书问题报错requests.packages.urllib3.disable_warnings()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36','Refer''er': 'https://www.bilibili.com/'}'''获取bilibili视频的主要函数@param url 视频页面url 结构为:url?参数@param p 视频p数@param bv 视频bv数'''def getBiliBiliVideo(url, p, bv):session = requests.session()res = session.get(url=url, headers=headers, verify=False)_element = etree.HTML(res.content)# 获取window.__playinfo__的json对象,[20:]表示截取'window.__playinfo__='后面的json字符串videoPlayInfo = str(_element.xpath('//head/script[5]/text()')[0].encode('utf-8').decode('utf-8'))[20:]videoJson = json.loads(videoPlayInfo)# 获取视频链接和音频链接try:# 2018年以后的b站视频由.audio和.video组成videoURL = videoJson['data']['dash']['video'][0]['baseUrl']audioURl = videoJson['data']['dash']['audio'][0]['baseUrl']flag = 0except Exception:# 2018年以前的b站视频音频视频结合在一起,后缀为.flvvideoURL = videoJson['data']['durl'][0]['url']flag = 1# 指定文件生成目录,如果不存在则创建目录dirname = ("E:/result").encode("utf-8").decode("utf-8")if not os.path.exists(dirname):os.makedirs(dirname)print('文件夹创建成功!')# 获取每一集的名称name = bv + "-" + str(p)# 下载视频和音频print('正在下载 "' + name + '" 的视频····')fileDownload(homeurl=url, url=videoURL, name='E:/result/' + name + '_Video.mp4', session=session)if flag == 0:print('正在下载 "' + name + '" 的音频····')fileDownload(homeurl=url, url=audioURl, name='E:/result/' + name + '_Audio.mp3', session=session)print('正在组合 "' + name + '" 的视频和音频····')combineVideoAudio('E:/result/' + name + '_Video.mp4', 'E:/result/' + name + '_Audio.mp3','E:/result/Bilibili' + name + '_output.mp4')print(' "' + name + '" 下载完成!')'''使用session保持会话下载文件@param homeurl 访问来源@param url 音频或视频资源的链接@param name 下载后生成的文件名@session 用于保持会话
'''def fileDownload(homeurl, url, name, session=requests.session()):# 添加请求头键值对,写上 refered:请求来源headers.update({'Referer': homeurl})# 发送option请求服务器分配资源session.options(url=url, headers=headers, verify=False)# 指定每次下载1M的数据begin = 0end = 1024 * 512 - 1flag = 0while True:# 添加请求头键值对,写上 range:请求字节范围headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})# 获取视频分片res = session.get(url=url, headers=headers, verify=False)if res.status_code != 416:# 响应码不为为416时有数据begin = end + 1end = end + 1024 * 512else:headers.update({'Range': str(end + 1) + '-'})res = session.get(url=url, headers=headers, verify=False)flag = 1with open(name.encode("utf-8").decode("utf-8"), 'ab') as fp:fp.write(res.content)fp.flush()# data=data+res.contentif flag == 1:fp.close()break'''用于合并音频与视频@param videopath 视频路径@param audiopath 音频路径@param outpath 生成合并视频的路径'''def combineVideoAudio(videopath, audiopath, outpath):#command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i ' + '"' + audioDir + '"' ' -i ' + '"' + videoDir + '"' + ' -acodec copy -vcodec copy ' + '"' + outDir + '"'subprocess.call(("E:/ffmpeg/bin/ffmpeg -i " + videopath + " -i " + audiopath + " -vcodec copy -acodec copy " + outpath).encode("utf-8").decode("utf-8"), shell=True)os.remove(videopath)os.remove(audiopath)if __name__ == '__main__':# 输入bilibili视频的BV号# bv = input('视频BV号:')bv = 'BV15v411k75j'url = 'https://www.bilibili.com/video/' + bv# 选择视频从第几p开始到第几p结束# startPart = input('起始P:')startPart = 58# endPart = input('终止P;')endPart = 100for p in range(int(startPart), int(endPart) + 1):getBiliBiliVideo(url + '?p=' + str(p), p, bv)

bilibili上爬取视频相关推荐

  1. 使用python爬取视频

    写在前面:此博客仅用于参考学习,代码中部分网址已删 准备工作 python burpsuite 视频爬取 视频网址:https://v.qq.com/x/cover/mzc00200xnrv1u5.h ...

  2. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  3. Python爬取视频之爱情电影及解密TS文件和两种合并ts的方法

    俗话说,兴趣所在,方能大展拳脚.so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程. 实现功能: 从网站上爬取采 ...

  4. 项目三:爬取视频磁力链接

    项目三:爬取视频磁力链接 标签(空格分隔): 爬虫 BeautifulSoup -具体技术实现原理类似项目二 1. 项目任务分析 类似上一个小项目中爬取图片的技术原理,本次小项目尝试对相同网站上的可供 ...

  5. 超实用工具you-get(爬取视频数据神器)

    最近发现一款超实用的Python工具包,可以直接下载网页上的视频.适用于python3 安装方法: pip install you-get 使用方法: you-get https://v.qq.com ...

  6. 爬虫概念与编程学习之如何爬取视频网站页面(三)

    先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二) 不多说,直接上代码. 编写代码 运行 <! ...

  7. Python爬取视频之爱情电影及解密TS文件和两种合并ts!

    俗话说,兴趣所在,方能大展拳脚.so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程. 实现功能: 从网站上爬取采 ...

  8. 【python如何爬取视频】

    该文章实验了如何利用Python进行爬取网络视频,看完该文章基本是可以下载出视频的,如有不足请多多包涵 1.爬虫需要使用到的Python库. I.requests库II.re库III. jsonVI. ...

  9. python可以爬取的内容有什么_Python爬取视频(其实是一篇福利)过程解析 Python爬虫可以爬取什么...

    如何用python爬取视频网站的数据 如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都能选择伴你一生! 有哪位大神指导下,有些视频网站上的视频文件是通过 js 加载 ...

  10. 如何用python爬取视频_介绍Python爬取哔哩哔哩视频

    python视频教程栏目介绍如何爬取视频 本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流.好了 ...

最新文章

  1. HDU 2717 Catch That Cow(BFS)
  2. 最强大,最简洁的【禁止输入中文】
  3. python横向柱状图-python绘制横向水平柱状条形图Bar
  4. 最全面详细讲解Oracle入门
  5. 防火墙(16)——SNAT和DNAT,DNAT实践
  6. 庆祝.NET Core悄然崛起:免费送50本优秀技术书籍,请笑纳!!
  7. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter
  8. Ext JS 4.1 RC1发布
  9. [小技巧][JAVA]函数返回一个长度不确定的数组 (int[ ])
  10. Linux netfilter源码分析(5)
  11. 绑定到异步的ObservableCollection
  12. SIP协议之代理服务器
  13. centos7.X版本如何下载网络流量实时监控工具iftop
  14. 在 Solidity 中 ++i 为什么比 i++ 更省 Gas?
  15. docker registry http api v2(原创请注明出处)
  16. python文件对象
  17. 主机屋对php没反应,《php---简单的php小服务器》---可惜主机屋空间不允许使用某些函数。只能换别的了。...
  18. 数据科学|运筹学(OR)数据集介绍
  19. Symantec Ghost 8.3 DOS 版 下载
  20. 怎么入门网络安全,学这两类证书就够了NISP或CISP

热门文章

  1. 如何告别职场菜鸟,成为职场“老司机”!
  2. lef industries LEF 102-LC2-GR1
  3. 基于SpringBoot+小程序的校园闲置物品交易平台
  4. 第十一届蓝桥杯省赛C语言B组——试题 D: 跑步锻炼
  5. 【2023.7.4 学习进度汇报】
  6. ml5.js人工智能编程入门教程(5): 图像风格转换以及ml5.js总结
  7. java编程官方教程_读完《Java 8编程入门官方教程》
  8. 靶场笔记之sql注入石器篇2
  9. 基于“互联网+”农业的农场信息管理系统(JavaSSM+Web)
  10. LeetCode1-240题汇总,希望对你有点帮助!