文 | 某某白米饭

来源: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站流量告急,技术男友轻松搞定!相关推荐

  1. 华为p60系列超级快充 Turbo技术,轻松搞定充电困扰!

    随着手机的功能越来越丰富,电量消耗也越来越快,当手机电量剩余20%时,是否有电量焦虑.为了满足大家快速充电的需求,华为P60系列配备了超级快充Turbo充电技术,让我们手机充电更快,用的更久,从此告别 ...

  2. UI设计培训技术分享:搞定萌萌哒可爱图标

    UI设计要学到的东西有很多,那么关于图标设计就是其中的一种,很多企业比较忠于萌萌哒的可爱图标,那么如何搞定萌萌哒可爱图标呢?来看看下面UI设计培训技术分享教程. UI设计培训技术分享:搞定萌萌哒可爱图 ...

  3. 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分

    本周您推脱老板的 #432 创新理由了吗?您是否尝试过推脱? 本系列的其他文章 读取.回收和重用:使用 Excel.XML 和 Java 技术轻松搞定报告,第 1 部分 有幸的是,您不必推脱.本系列的 ...

  4. python中装饰器修复技术_12步轻松搞定Python装饰器

    作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语 ...

  5. 浙江金华“刷脸看病”,挂号付款20秒搞定!

    资讯来源:浙江新闻 编辑:大和智付 版权说明:版权归原作者与平台所有,如有侵权,请联系删除. 浙江市卫健委信息中心介绍,目前市中医医院.市人民医院.市中心医院都已经上线"刷脸看病" ...

  6. 北风:史上最全wordpress建站攻略,无代码基础也能轻松搞定

    什么是执行力?就是特么的啥原理都不需要懂,只需要懂怎么做,然后按照步骤一个一个碾压过去,神挡杀神,佛挡杀佛.能做到这一点,就已经能超过很多人了.--北风 作为一个零代码基础的小白,建站过程中也是踩了好 ...

  7. wordpress怎么搜索别人_北风:史上最全wordpress建站攻略,无代码基础也能轻松搞定...

    什么是执行力?就是特么的啥原理都不需要懂,只需要懂怎么做,然后按照步骤一个一个碾压过去,神挡杀神,佛挡杀佛.能做到这一点,就已经能超过很多人了.--北风 作为一个零代码基础的小白,建站过程中也是踩了好 ...

  8. 还在用肉眼找不同吗?这个技术轻松搞定

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 概述 我想应该很多人都玩过腾讯的这款 ...

  9. 占内存小的qq_手机内存空间告急,这些办法就能轻松搞定!

    三月不减肥,四月徒伤悲.人吃多了体型会膨胀,但对内存有限的手机来说,存储太多的照片视频和应用,手机可吃不消. 虽然减肥对大家来说是难事,但清理内存让手机瘦身下来,小V可有一套秘籍.打开手机内置的i管家 ...

最新文章

  1. 固态器件理论(6)双极结型晶体管
  2. 迅达云成参观学习---感谢信
  3. 050_整形和字节数组转换
  4. linux改英语环境,CentOS6.8中/英文环境切换教程图解
  5. adb可以连接linux设备吗,Linux通过ADB与Android设备交互
  6. vue中怎么点击修改文字_Vue.js点击切换按钮改变内容
  7. 存储过程排版工具_我的绘图工具箱
  8. syntax error: unexpected end of file
  9. Enums and Structs in C#(C#里的枚举和结构) (from codeproject)
  10. java html entity encoding,实体“HTML.Version”的声明必须以''结尾
  11. java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务
  12. 微软Kubernetes服务AKS开发正式版空间服务
  13. 新拟物立体情人节主题图标来了,适合潮流现代的主题设计!
  14. 【树状数组 思维题】luoguP3616 富金森林公园
  15. golden gate 加initial load 在rac 上的配置
  16. Android 12 WiFi 框架
  17. 兄弟连php留言,LAMP兄弟连PHP课程学习笔记 第五天 循环语句
  18. 各个电脑品牌BIOS快捷启动热键
  19. Office Word如何设置页码(MacOS中为例)
  20. 在 vi 编辑器中的命令模式下,删除当前光标处的字符使用 __ 命 令。

热门文章

  1. 三种编程命名规则:驼峰命名法 (壹)
  2. [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platfor
  3. Nginx模块之SessionSticky
  4. nginx中SSI问题的研究
  5. 为PHP开发C语言扩展
  6. PHP自动加载spl_autoload_register()
  7. CSS3的box-shadow属性:给指定的区域加阴影
  8. C语言作业界面,c语言作业20191011121223
  9. views 多个文件夹 netcore_Visual Studio 2019发布.NET Core项目部署或者独立运行的方法...
  10. java把一个list_java 把一个大list分成N个小list,然后用map存储的小方法