女友刷B站流量告急,技术男友轻松搞定!
文 | 某某白米饭
来源:Python 技术「ID: pythonall」
B 站大家都熟悉,尤其是它的舞蹈区。有 100W+ 的舞蹈视频。在没有 wifi 的情况下,就欣赏不了这些视频了。作为一个 python 程序员,小编就写一个 Python 脚本在晚上下载舞蹈区的所有视频。
抓取列表
首先点开舞蹈区先选择宅舞列表。
然后打开 F12 的控制面板,可以找到一条 https://api.bilibili.com/x/web-interface/newlist?rid=20&type=0&pn=1&ps=20&jsonp=jsonp&callback=jsonCallback_bili_57905715749828263
的 url,其中 rid 是 B 站的小分类,pn 是页数。
小编试着在浏览器将地址打开居然报了 404,可是在控制面板中这个地址的返回值明明就是视频列表。试着去掉 callback 的参数,意外的得到了想要的结果。
众所周知 bid 是一个 B 站视频的唯一 ID,想要获取 bid 可以从上面 url 的返回值中提取 aid,然后将 aid 转换为 bid。
# aid 转 bid 代码取自:https://zhuanlan.zhihu.com/p/117358823Str = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' # 准备的一串指定字符串
Dict = {}# 将字符串的每一个字符放入字典一一对应 , 如 f对应0 Z对应1 一次类推。
for i in range(58):Dict[Str[i]] = is = [11, 10, 3, 8, 4, 6, 2, 9, 5, 7] # 必要的解密列表
xor = 177451812
add = 100618342136696320 # 这串数字最后要被减去或加上def algorithm_enc(av):ret = avav = int(av)av = (av ^ xor) + add# 将BV号的格式(BV + 10个字符) 转化成列表方便后面的操作r = list('BV ')for i in range(10):r[s[i]] = Str[av // 58 ** i % 58]return ''.join(r)def find_bid(p):bids = []r = requests.get('https://api.bilibili.com/x/web-interface/newlist?&rid=20&type=0&pn={}&ps=50&jsonp=jsonp'.format(p))data = json.loads(r.text)archives = data['data']['archives']for item in archives:aid = item['aid']bid = algorithm_enc(aid)bids.append(bid)return bids
获取视频的 CID
想要下载 1080 的视频,光有 bid 是不够的,还需要 登录后 Cookie 中的 SESSDATA 值和 cid 。
首先登录 B 站将 Cookie 中的 SESSDATA 复制到对象头中。用地址为 https://api.bilibili.com/x/player/pagelist?bvid=
url 返回 cid。
def get_cid(bid):url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bidheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','Cookie': 'SESSDATA=182cd036%2C1636985829%2C3b393%2A51','Host': 'api.bilibili.com'}html = requests.get(url, headers=headers).json()infos = []data = html['data']cid_list = datafor item in cid_list:cid = item['cid']title = item['part']infos.append({'bid': bid, 'cid': cid, 'title': title})return infos
下载视频
下载视频的 https://api.bilibili.com/x/player/playurl
来自于每次视频播放完之后的推荐列表。
最后使用 urllib.request.urlretrieve 函数下载视频。
def get_video_list(aid, cid, quality):url_api = 'https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn={}'.format(cid, aid, quality)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','Cookie': 'SESSDATA=182cd036%2C1636985829%2C3b393%2A51','Host': 'api.bilibili.com'}html = requests.get(url_api, headers=headers).json()video_list = []for i in html['data']['durl']:video_list.append(i['url'])return video_listdef schedule_cmd(blocknum, blocksize, totalsize):percent = 100.0 * blocknum * blocksize/ totalsizes = ('#' * round(percent)).ljust(100, '-')sys.stdout.write('%.2f%%' % percent + '[' + s + ']' + '\r')sys.stdout.flush()def download(video_list, title, bid):for i in video_list:opener = urllib.request.build_opener()opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'),('Accept', '*/*'),('Accept-Language', 'en-US,en;q=0.5'),('Accept-Encoding', 'gzip, deflate, br'), ('Range', 'bytes=0-'), ('Referer', 'https://www.bilibili.com/video/'+bid),('Origin', 'https://www.bilibili.com'),('Connection', 'keep-alive'),]filename=os.path.join('D:\\video', r'{}_{}.mp4'.format(bid,title)) try:urllib.request.install_opener(opener)urllib.request.urlretrieve(url=i, filename=filename, reporthook=schedule_cmd) except:print(bid + "下载异常,文件:" + filename)
总结
本篇介绍了通过爬虫的方式下载 B 站视频,代码量不多就 130 行左右。大家也可以扩展一下,自动下载关注 up 主的视频。
参考
[1] AID 转 BID https://zhuanlan.zhihu.com/p/117358823
推荐阅读
Pandas处理数据太慢,来试试Polars吧!
懒人必备!只需一行代码,就能导入所有的Python库
绝!关于pip的15个使用小技巧
介绍10个常用的Python内置函数,99.99%的人都在用!
可能是全网最完整的 Python 操作 Excel库总结!
女友刷B站流量告急,技术男友轻松搞定!相关推荐
- 华为p60系列超级快充 Turbo技术,轻松搞定充电困扰!
随着手机的功能越来越丰富,电量消耗也越来越快,当手机电量剩余20%时,是否有电量焦虑.为了满足大家快速充电的需求,华为P60系列配备了超级快充Turbo充电技术,让我们手机充电更快,用的更久,从此告别 ...
- UI设计培训技术分享:搞定萌萌哒可爱图标
UI设计要学到的东西有很多,那么关于图标设计就是其中的一种,很多企业比较忠于萌萌哒的可爱图标,那么如何搞定萌萌哒可爱图标呢?来看看下面UI设计培训技术分享教程. UI设计培训技术分享:搞定萌萌哒可爱图 ...
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分
本周您推脱老板的 #432 创新理由了吗?您是否尝试过推脱? 本系列的其他文章 读取.回收和重用:使用 Excel.XML 和 Java 技术轻松搞定报告,第 1 部分 有幸的是,您不必推脱.本系列的 ...
- python中装饰器修复技术_12步轻松搞定Python装饰器
作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语 ...
- 浙江金华“刷脸看病”,挂号付款20秒搞定!
资讯来源:浙江新闻 编辑:大和智付 版权说明:版权归原作者与平台所有,如有侵权,请联系删除. 浙江市卫健委信息中心介绍,目前市中医医院.市人民医院.市中心医院都已经上线"刷脸看病" ...
- 北风:史上最全wordpress建站攻略,无代码基础也能轻松搞定
什么是执行力?就是特么的啥原理都不需要懂,只需要懂怎么做,然后按照步骤一个一个碾压过去,神挡杀神,佛挡杀佛.能做到这一点,就已经能超过很多人了.--北风 作为一个零代码基础的小白,建站过程中也是踩了好 ...
- wordpress怎么搜索别人_北风:史上最全wordpress建站攻略,无代码基础也能轻松搞定...
什么是执行力?就是特么的啥原理都不需要懂,只需要懂怎么做,然后按照步骤一个一个碾压过去,神挡杀神,佛挡杀佛.能做到这一点,就已经能超过很多人了.--北风 作为一个零代码基础的小白,建站过程中也是踩了好 ...
- 还在用肉眼找不同吗?这个技术轻松搞定
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 概述 我想应该很多人都玩过腾讯的这款 ...
- 占内存小的qq_手机内存空间告急,这些办法就能轻松搞定!
三月不减肥,四月徒伤悲.人吃多了体型会膨胀,但对内存有限的手机来说,存储太多的照片视频和应用,手机可吃不消. 虽然减肥对大家来说是难事,但清理内存让手机瘦身下来,小V可有一套秘籍.打开手机内置的i管家 ...
最新文章
- 固态器件理论(6)双极结型晶体管
- 迅达云成参观学习---感谢信
- 050_整形和字节数组转换
- linux改英语环境,CentOS6.8中/英文环境切换教程图解
- adb可以连接linux设备吗,Linux通过ADB与Android设备交互
- vue中怎么点击修改文字_Vue.js点击切换按钮改变内容
- 存储过程排版工具_我的绘图工具箱
- syntax error: unexpected end of file
- Enums and Structs in C#(C#里的枚举和结构) (from codeproject)
- java html entity encoding,实体“HTML.Version”的声明必须以''结尾
- java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务
- 微软Kubernetes服务AKS开发正式版空间服务
- 新拟物立体情人节主题图标来了,适合潮流现代的主题设计!
- 【树状数组 思维题】luoguP3616 富金森林公园
- golden gate 加initial load 在rac 上的配置
- Android 12 WiFi 框架
- 兄弟连php留言,LAMP兄弟连PHP课程学习笔记 第五天 循环语句
- 各个电脑品牌BIOS快捷启动热键
- Office Word如何设置页码(MacOS中为例)
- 在 vi 编辑器中的命令模式下,删除当前光标处的字符使用 __ 命 令。
热门文章
- 三种编程命名规则:驼峰命名法 (壹)
- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platfor
- Nginx模块之SessionSticky
- nginx中SSI问题的研究
- 为PHP开发C语言扩展
- PHP自动加载spl_autoload_register()
- CSS3的box-shadow属性:给指定的区域加阴影
- C语言作业界面,c语言作业20191011121223
- views 多个文件夹 netcore_Visual Studio 2019发布.NET Core项目部署或者独立运行的方法...
- java把一个list_java 把一个大list分成N个小list,然后用map存储的小方法