范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何用Python爬虫实现哔哩哔哩视频下载?

  作者:段小草
  链接:https://www.zhihu.com/question/486484268/answer/2911872392
  来源:知乎
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  人之所以区别于动物,是会使用工具。现成的工具有太多了,程序员更倾向于不重复造轮子。直接使用 you-get
  题主只说了使用 Python,没说具体如何使用。众所周知, you-get 所有代码都是由 Python 完成的。
  除了 B站,you-get 还支持几乎所有市面主流的视频网站。
  使用方法也非常简单。
  安装:pip install you-get
  使用$ you-get 视频链接
  作为命令行工具,you-get 也提供了丰富的可供选择,比如选择分辨率、查看视频信息等,详见 Github 仓库:
  https://github.com/soimort/you-getgithub.com/soimort/you-get分析 you-get 源码
  如果题主不单单是为了工具,而是想自己写代码,或者是为了完成某门作业之类的。比较快捷的做法是去查看 you-get 源码中关于 B站的部分。不过可能会缺少下载的部分,因为 you-get 的下载器是同一的,bilibili.py 更偏向于视频播放地址的解析。
  详见:
  https://github.com/soimort/you-get/blob/1c841f7e8ce60130572a8f03fb038eda99deff6a/src/you_get/extractors/bilibili.pygithub.com/soimort/you-get/blob/1c841f7e8ce60130572a8f03fb038eda99deff6a/src/you_get/extractors/bilibili.py自己观察视频加载播放
  如果题主不想吃做好的饭,非要挑战自己,尝试重新造轮子的话。那就需要自己去找真实的播放链接了。
  一般来讲,获取网站的视频播放有几种方式:
  ①最简单的情况下,直接查看network,会看到一个体积巨大的请求,右键,在新链接打开,直接下载就是了。
  ②一些网站会把视频切割成 .ts 的分段文件,然后用一个 .m3u8 的文件,可以下载所有的 .ts 文件后进行拼接重新输出。(可以搜索 m3u8 ts 拼接这些关键字,这里不展开了)
  ③在源码里分析,看会不会找到真实播放地址的线索,等等。
  我之前设想过一个工作流:自动监测某个账号的视频更新-下载视频-语音转文字-摘要成笔记。因为现在长视频的内容太多了,其中确实有一些优秀视频,但看视频远比图文费时间,其中的主要内容还不能直接复制/粘贴整理。不过后来由于懒一直没有执行…
  发布于 2023-02-26 16:37・IP 属地河南
  ​赞同 19​​2 条评论​分享​收藏​喜欢​收起​更多回答
  拾柒
  合格证书
  ​ 关注前言
  嗨喽,大家好呀~这里是爱看美女的茜茜呐
  又到了学Python时刻~
  现在好看的妹子真的太多啦~
  如何一次性把这些好看的视频全保存下来捏?
  开发环境:版 本: python 3.8编辑器: pycharm 2022.3.2 专业版requests >>> pip install requestsffmpeg 音视频合成软件( 源码、教程、文档、软件点击此处跳转跳转文末名片加入君羊,找管理员小姐姐领取呀~ )
  实现一个案例的流程:
  一. 思路分析
  案例的分析 视频 media .mp4 .mp3 .m4a m3u8视频流
  .m4s: 视频/音频 格式
  数据来源分析: 找到视频内容
  network抓包
  二. 代码实现(代码实现基本流程)发送请求 使用代码的方式访问网站获取数据 取出网页源代码解析数据 提取视频链接保存数据
  代码展示
  PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取
  导入模块import requests import re       # 正则表达式模块 import json import pprint import subprocess import os
  伪装(请求头)headers = {     # 用户信息     "cookie": "buvid3=355AA300-6A61-04E5-A05C-E891D886F69632716infoc; b_nut=1675085932; i-wanna-go-back=-1; _uuid=387EA3810-FBF5-E92C-827E-2510B578C5B9A33232infoc; buvid4=15C69C98-F6A7-EC6A-872F-E69C1840DD6D33724-023013021-1pW1w45e5fZS9RtebDiGZw%3D%3D; nostalgia_conf=-1; CURRENT_FNVAL=4048; rpdid=|(kmJY|k))lY0J"uY~l|)lmY|; SESSDATA=17eb9f1a%2C1690782878%2C6a25c%2A22; bili_jct=4af9076b42f76603dfe4cf018ad2000f; DedeUserID=422789639; DedeUserID__ckMd5=fc4901c78719b545; CURRENT_QUALITY=80; b_ut=5; b_lsid=51ED8F105_1861C3EEC10; theme_style=light; is-2022-channel=1; sid=66dafqju; fingerprint=97ca5a8b555e63aca787c9cd27273c7e; buvid_fp_plain=undefined; buvid_fp=8cc52ae38b592ff26dc2b393eebd890b; PVID=2; innersign=1; bp_video_offset_422789639=758803412994228200",     # 防盗链     "referer": "https://www.****.com/",     # 浏览器基本信息     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" }
  发送请求url = "https://www.***.com/video/BV1qv4y1k7UE/?vd_source=8f216a44bce0dbe14e3447c34c2ab3e2" response = requests.get(url, headers=headers)
  获取数据html_data = response.text
  解析数据json_str = re.findall("__playinfo__=(.*?)", html_data)[0] # 

(.*?)

title = re.findall("

(.*?)

", html_data)[0] # Python基础 字典 json_data = json.loads(json_str) # pprint.pprint(json_data) audio_url = json_data["data"]["dash"]["audio"][0]["baseUrl"] print(audio_url) video_url = json_data["data"]["dash"]["video"][0]["baseUrl"] print(video_url)   保存数据audio_data = requests.get(audio_url, headers=headers).content with open(f"{title}.mp3", mode="wb") as f: f.write(audio_data) video_data = requests.get(video_url, headers=headers).content with open(f"{title}.mp4", mode="wb") as f: f.write(video_data) ffmpeg = f"ffmpeg -i {title}.mp4 -i {title}.mp3 -acodec copy -vcodec copy {title+"-out.mp4"}" subprocess.run(ffmpeg) os.remove(f"{title}.mp4") os.remove(f"{title}.mp3")   尾语   感谢你观看我的文章呐~本次航班到这里就结束啦   希望本篇文章有对你带来帮助 ,有学习到一点知识~   躲起来的星星 也在努力发光,你也要努力加油(让我们一起努力叭)。   发布于 2023-02-10 22:56   ​赞同​​添加评论​分享​收藏​喜欢​收起​   苛岚异梦   ​ 关注   5 人赞同了该回答一:由于哔哩哔哩的视频文件和音频文件是分离的,所有这里分别下载后在使用ffmepg进行合成   ffmpeg官网下载 https://ffmpeg.org/ (下载后需要配置环境变量)需要重启! 链接:https://pan.baidu.com/s/1aDSlIQ1kPOOUsVOAmcFfHw 提取码:gvw4   gitee地址 https://gitee.com/ddpoi/bili   博客地址https://www.ddblog.xyz/articles/53欢迎大佬前来指点# import time import requests import re import os import subprocess # import sys,io # sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding="gb18030") headers = { "referer": "https://www.bilibili.com/video/BV1J3411h7pm?spm_id_from=333.5.0.0", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69" } # 获取视频bvid def get_bvid(mid,path): """ 这里ps=30,是一页的视频数量,pn代表页数,可以自己加一个循环 """ url = "https://api.bilibili.com/x/space/arc/search?mid={}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp".format(mid) response = requests.get(url=url,headers=headers).json() mm = response["data"]["list"]["vlist"] for i in mm: title = (i["title"]) bvid = (i["bvid"]) # print(title) # print(bvid) get_cid(bvid,title,path) # 获取cid def get_cid(bvid,title,path): url = "https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp".format(bvid) response = requests.get(url=url,headers=headers).json() nn = response["data"] for i in nn: cid = (i["cid"]) # print(cid) get_video(bvid,cid,title,path) # 获取视频,音频的url def get_video(bvid,cid,title,path): url = "https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn=120&type=&otype=json&fourk=1&fnver=0&fnval=4048&session=521a3c69be48043423dab7dfacc0dfde".format(cid,bvid) response = requests.get(url=url,headers=headers).json() video_url = response["data"]["dash"]["video"][0]["baseUrl"] audio_url = response["data"]["dash"]["audio"][0]["baseUrl"] # print(audio_url) # print(video_url) save(title,video_url,audio_url,path) # 保存视频,音频文件,(下载时文件名取第一个字符,防止含有特殊符号而报错) def save(title,video_url,audio_url,path): try: video = requests.get(url=video_url,headers=headers) with open(path+title[:1]+".mp4","ab") as f: f.write(video.content) print("{}下载完成....".format(title + ".mp4")) audio = requests.get(url=audio_url, headers=headers) with open(path+title[:1]+".mp3","ab") as f: f.write(audio.content) print("{}下载完成....".format(title + ".mp3")) except: pass video_add(title,path) """ 由于有些up主视频标题包含特殊字符,例如 ? | / 等。所以需要将这些字符过滤出去 """ # 将下载的视频,音频进行合成 def video_add(title,path): intab = "?/|.><:*" for s in intab: if s in title: # 将特殊字符转化为空格 print(s) title = title.replace(s, "") # 如果程序异常,选择忽略 try: # print(title) print("开始合成") os.chdir(path) cmd = f"ffmpeg -i {title[:1]}.mp4 -i {title[:1]}.mp3 -c:v copy -c:a aac -strict experimental {title[:1]}_1.mp4" # print(cmd) subprocess.call(cmd, shell=True) """选择是否删除原mp3、mp4文件""" os.remove(title[:1]+".mp4") os.remove(title[:1]+".mp3") os.rename(title[:1] + "_1.mp4", title + ".mp4") print("合成结束") except: pass # 判断输入的是mid还是视频链接 def main(mid,path): if mid == "": print("错误,请重新输入") # mid输入不能为空 return False if re.match(r"[a-zA-Z]", mid): # 用正则来判断输入的mid类型 bvid = (mid.split("?")[0]).split("/")[4] # 取出视频链接中的bvid print(bvid) title = input("请输入视频名称:") # 手动指定视频名称 get_cid(bvid,title,path) else: get_bvid(mid,path) if __name__ == "__main__": mid = input("请输入up主的mid或视频链接:") print("路径一定要加/,默认为当前目录") file_path = input("请输入保存文件路径:") # 输入文件路径 if file_path == "" : path = "./" else: path = file_path main(mid,path)

高质量文案短句1时间可以治愈一切,给时间多一点时间。2爱得其所,自在自如!3生活就是这样,一边回忆,一边继续。4愿你所拼命争取的,最后都能如你所愿。5希望所有事情都像长胖一样简单。6一生弥足珍贵散文万物入秋,淡染人间美好作者子墨九月中秋,这几日天气有了秋天的模样,虽不算最美,但是一早一晚走出去,享受到的也是秋天的美好。九月的窗外,依旧是郁郁葱葱的深绿,偶尔夹杂着黄与红的点缀,配色自然,而风中还有淡人间清醒文案值得阅读1你的好运都藏在努力与付出里2真正懂你的人,无须太多的解释,3哪怕变好一点点,也觉得欣慰。e4重要的不是角色,而是角色中真实的自己。5世界很大,应该去寻找另一个自己。6所有的安全感被骗后的幸福无与伦比哈哈,想起这件事情,我就高兴的不要不要的,虽然是被人骗了,被别人忽悠了,而且是个比自己孩子还要小的小孩,但是自私点讲,我自己内心是欢娱的,甚至是快乐的,因为我觉得我的童心还在,而那幸福生活是这样的分享你认为幸福生活是怎样的俄国作家托尔斯泰说过,幸福的家庭都是一样的,诚然,幸福的生活也是这样的家庭和睦,妻贤子孝,有花不完的钱,有享不尽的荣华,做自己想做的事。这些是理想状态。事保存板栗,直接冷冻还是煮熟再冻?教你正确做法,香甜软糯很新鲜保存板栗,直接冷冻还是煮熟再冻?教你正确做法,香甜软糯很新鲜中秋节前后,正是板栗成熟上市的季节,菜市场上络绎不绝,每一种食物的上市时间,都是不一样的,只有上市这段时间,才是最新鲜最时隔6年再看王宝强离婚,他真的不简单,输了脸面却赢了人生8月23日,有媒体拍到王宝强和女友的约会视频。消息一出,引发网友热议。女友冯清披着一头飘逸的长发,一双美腿又长又白。她先登上王宝强的黑色大G,启动后,王宝强又在助理的安排下坐上副驾好事将近?王钟瑶收到鲜花说很幸福,球迷追问是不是谈恋爱了?众所周知,虽然不及娱乐圈那样美女如云,但在国内的体育圈里面,还是有不少美女运动员的,而且,她们的颜值和身材,丝毫不逊色于一些当红女明星,比如大家熟悉的九球天后潘晓婷,就很出色和优秀五年没有新债务的乐视,想卖出更多的电视手机2012年9月19日,乐视正式进军电视行业,推出了乐视超级电视产品。之后的几年间,每年9月19日乐视都会围绕这块消费硬件业务举办优惠促销活动,称作919乐迷节。十年后的今天,不少人熬夜加班对身体的危害很多人因为工作繁忙导致经常加班,经常熬夜也是很常见的现象之一。但也要重视起来,经常熬夜对人的视力方面和健康方面有会有产生很大的影响。有些严重的情况会造成失眠,或是皮肤质量低下等症状经常感觉莫名心慌的人要注意两天前门诊接诊了一位患者,平时经常感觉心慌,其他什么症状都没有,经过检查确诊是脑梗。心慌导致脑梗,可能很多朋友都没有听说过,不过,甘博士在这里告诉大家,心慌和脑梗是有关系的,心慌,
伞咖生态发布暨ESG双碳产业高峰论坛在福州成功举办碳寻未来,伞亮可期。2023年3月25日,由伞亮科技福建服务中心主办,伞亮科技上海总部品牌文化杂志社协办的伞咖生态发布暨ESG双碳产业高峰论坛在美丽的海滨城市福州成功举办。来自省内45年了,小井之变让产业链更粗更长早春时节,东明县小井镇小井村绿意萌动,春意正浓。1978年,小井村启动包产到户包干到户改革,成为全国最早一批实行分田到户落实家庭联产承包责任制的村庄。通过包产到户,1979年,小井超市中的这四款平价洗发水,导购都不会主动推荐,好用不贵超市中的这四款平价洗发水,导购都不会主动推荐,好用不贵很多不懂拒绝的女孩子去超市买洗发水的时候,经常会被导拉着买一些打折产品。但是一般这种打折产品都是又贵又不好用的,因为卖不出去,陕西省白酒产业链工作专班考察调研西凤集团公司白酒产业发展情况阳光讯(记者芮扬通讯员刘丽娜)3月23日,陕西省工信厅消费品工业处处长李洁带领省白酒产业链工作专班来西凤集团调研公司白酒产业发展情况,宝鸡市工信局局长巨绪昌,西凤股份公司副总经理肖买酒新风尚,捡漏白酒?可以体验一下,但耗费太多时间不划算自从酒水有了收藏价值的附属属性之后,一些名酒好酒就不再是日常消费品,而变成了高档奢侈品。那一些爱好研究酒水收藏酒水的平民百姓想要买到一些好酒少不了要耗费一大笔积蓄。日常生活中就有很茅台葡萄酒牵手家乐福中国,锁定粉丝经济营造新消费场景摘要茅台葡萄酒牵手家乐福近日,茅台葡萄酒牵手家乐福中国,开启以觥乐敬春来为主题的茅台葡萄酒粉丝节活动,锁定粉丝经济营造新消费场景。家乐福中国与茅台葡萄酒有着良好的合作基础,一直以来漳州最牛驾驶员!50度白酒一路吹瓶,然后50度的白酒当白开水骑着摩托车停停喝喝走走一路从长泰古农农场喝到溪东喝到撞了车赔了钱面临着判刑这瓶白开水的代价实在有点大2023年1月5日下午,长泰交警大队接到事故警情,立即赶赴现四川一名酒再度腾飞,曾3入国家名酒,也曾差点破产,今涅槃重生自古川酒甲天下!但川酒的天下,可不是纯靠五粮液泸州老窖打下的,另一款曾家喻户晓的名酒,也曾出了不少力。而这款酒便是曾赫赫有名全兴大曲!崛起此酒的前身,原叫成都府大曲,在以前便已畅销双减后中小学生睡得好吗?调查发现时长普遍无法达到要求睡眠占据了人一生中三分之一的时间,然而,失去睡眠已不是成年人的专属烦恼,对正处于生长发育期的青少年而言,保障充足的睡眠时间提升睡眠质量也是眼下至关重要的课题。可是,根据中国睡眠协会态度力度温度!常德经开区公安局在优化营商环境中显担当所获锦旗。红网时刻新闻通讯员曾小娟罗鸣报道为全面深入学习宣传贯彻党的二十大精神,持续深化公安行政管理服务改革,对接企业所需民生所盼,常德经开区公安局积极作为,进一步推出惠民利企新举味蕾上的江苏本土美食志日历雨花汤圆看似石,闻香甜,尝软糯来源交汇点新闻客户端编者按江苏跨江滨海水网密布土地肥沃物产丰盈,是我国有名的美食大省,八大菜系之一的淮扬菜就诞生于此。千百年来,在这片人文荟萃的土地上,厨师和食客们融合南北烹饪技艺