鱼C论坛

 找回密码
 立即注册
查看: 1629|回复: 0

[作品展示] Bilibili视频下载【第一步】:登陆并获得视频信息【更新】

[复制链接]
发表于 2021-10-5 10:14:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 591821661 于 2021-10-5 22:50 编辑

Bilibili视频下载过程为:
1.登录会员账号,获取SESSDATA。(这样才能下载高清视频)
2.解析视频下载链接,并下载视频音频文件(m4s)。
3.合并视频音频文件(ffmpeg)为MP4格式。

核心就是之后会利用bilibili自带的API
`https://api.bilibili.com/x/player/playurl?cid=&bvid=视频bv号&qn=视频清晰度&type=&otype=json&fourk=&fnver=0&fnval=&session=`
运行截图:

运行截图

运行截图


  1. # -*- coding: utf-8 -*-
  2. """
  3. I love FishC.com
  4.                      -Sharpstar
  5. """
  6. import qrcode
  7. import urllib.request
  8. import json
  9. import time
  10. import http.cookiejar
  11. import re
  12. import gzip
  13. from io import BytesIO
  14. # 观测视频地址
  15. video_url       = 'https://www.bilibili.com/video/BV1rf4y1n78w'
  16. # 所用到的API
  17. qrurl      = 'http://passport.bilibili.com/qrcode/getLoginUrl'  # 登陆二维码
  18. checkurl   = 'http://passport.bilibili.com/qrcode/getLoginInfo' # 登陆状态
  19. mydataurl  = 'https://api.bilibili.com/x/web-interface/nav'     # 用户状态
  20. proxy = ''
  21. UA    = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
  22. tabvideourl = 'https://t.bilibili.com/?tab=8'
  23. if proxy:
  24.     proxy_support = urllib.request.ProxyHandler({
  25.             'http'  : proxy,
  26.             'https' : proxy,
  27.             })
  28. else:
  29.     proxy_support = urllib.request.ProxyHandler({
  30.             })
  31. # 自动保存cookies
  32. cookiejar = http.cookiejar.CookieJar()
  33. cookie_support = urllib.request.HTTPCookieProcessor(cookiejar)
  34. # urllib钢铁侠安装各个组件
  35. opener = urllib.request.build_opener(proxy_support,cookie_support)
  36. opener.addheaders = [('User-Agent', UA),]
  37. urllib.request.install_opener(opener) #使得所有urllib默认使用此opener
  38.    
  39. qrurl_res  = urllib.request.urlopen(qrurl)
  40. qrurl_json = json.loads(qrurl_res.read())
  41. qroauthKey = qrurl_json['data']['oauthKey']
  42. qrimg_url  = qrurl_json['data']['url']
  43. # 扫码登陆
  44. qrcode.make(qrimg_url).show()
  45. # 将form表单的元素进行编码,Post的提前准备操作
  46. oauthKey_coded = urllib.parse.urlencode({'oauthKey':qroauthKey}).encode('utf-8')   #url编码
  47. startCheckTime = time.time()
  48. LastStatusData = None
  49. while(True):
  50.     endCheckTime = time.time()
  51.     if(endCheckTime - startCheckTime) < 180.0: #如果超过180秒 停止检测
  52.         loginInfoPostRes = urllib.request.urlopen(checkurl,data=oauthKey_coded)
  53.         loginStatus_json = json.loads(loginInfoPostRes.read())
  54.         if not loginStatus_json['status']: #如果未登录,则显示当前状态(已经扫码/未扫码)
  55.             if LastStatusData == loginStatus_json['data']:
  56.                 # 显示正在查询
  57.                 print('.',end='')
  58.             else:
  59.                 if loginStatus_json['data'] == -5:
  60.                     print('\n已扫码,等待登录中',end='')
  61.                 if loginStatus_json['data'] == -4:
  62.                     print('\n未扫码,等待扫码中',end='')
  63.             # 延迟3秒 避免过度频繁查询
  64.             LastStatusData = loginStatus_json['data']
  65.             time.sleep(3)
  66.         else: #登录成功,获取
  67.             loginSESSDATA_raw = loginStatus_json['data']['url']
  68.             break
  69.     else:
  70.         print('验证码失效超时,请重新登录')
  71.         break
  72. my_html      = urllib.request.urlopen(mydataurl)
  73. my_html_json = json.loads(my_html.read())
  74. if my_html_json['data']['isLogin']:
  75.     if my_html_json['data']['vipStatus']:
  76.         print('尊敬的大会员你好!')
  77.     else:
  78.         print('尊敬的会员你好!')
  79. # SESSDATA_Clue = re.compile(r'SESSDATA=(.*?)&bili_jct')
  80. # SESSDATA_Res  = re.findall(SESSDATA_Clue,loginSESSDATA_raw)[0]
  81. # print('\n登录成功,SESSDATA =',SESSDATA_Res)

  82. # 显示当前cookie内容(内部已经包含SESSDATA,这就是python爬虫的优越性,简单一步)
  83. print('Cookies:')
  84. for item in cookiejar:
  85.     print(item.name,'=',item.value)
  86.    

  87. video_html      = urllib.request.urlopen(video_url)
  88. video_html_read = video_html.read()
  89. # 读取内容需要gizp解码
  90. buff = BytesIO(video_html_read)
  91. f = gzip.GzipFile(fileobj=buff)
  92. video_html_read_extracted = f.read()
  93. video_html_res = video_html_read_extracted.decode('utf-8')
  94. downloadInfo_Clue = re.compile(r'__playinfo__=(.*?)</script><script>window')
  95. downloadInfo_Res  = re.findall(downloadInfo_Clue,video_html_res)
  96. downloadInfo_json = json.loads(downloadInfo_Res[0])
  97. videoInfo_Clue    = re.compile(r'<script>window.__INITIAL_STATE__=(.*?);\(function\(\)')
  98. videoInfo_Res     = re.findall(videoInfo_Clue,video_html_res)
  99. videoInfo_json    = json.loads(videoInfo_Res[0])
  100. # 获取视频基本信息
  101. video_bvid     = videoInfo_json['bvid']                 # BV号
  102. video_title    = videoInfo_json['videoData']['title']   # 标题
  103. video_pubdate  = videoInfo_json['videoData']['pubdate'] # 发布日期(Unix时间戳)
  104. video_cover    = videoInfo_json['videoData']['pic']     # 封面(URL)
  105. video_pages    = videoInfo_json['videoData']['pages']   # 分P数信息(列表字典)
  106. # video_quality  = downloadInfo_json['data']['accept_quality']    # 清晰度范围(数字列表)
  107. # video_describe = downloadInfo_json['data']['accept_description']# 清晰度对应中文解释
  108. video_formats  = downloadInfo_json['data']['support_formats']     # 支持视频格式
  109. videp_code     = downloadInfo_json['code']
  110. # video_code
  111. #    0:成功
  112. # -400:请求错误
  113. # -403:权限不足
  114. # -404:无视频
  115. # 62002:稿件不可见

  116. # 发布者信息
  117. video_up       = videoInfo_json['videoData']['owner']['name']      # UP主名字
  118. video_up_uid   = videoInfo_json['videoData']['owner']['mid']       # UP主UID
  119. video_up_face  = videoInfo_json['videoData']['owner']['face']      # UP主头像
  120. # 视频质量衡量信息
  121. video_view     = videoInfo_json['videoData']['stat']['view']       # 视频播放量
  122. video_like     = videoInfo_json['videoData']['stat']['like']       # 视频点赞数
  123. video_coin     = videoInfo_json['videoData']['stat']['coin']       # 视频硬币数
  124. video_favorite = videoInfo_json['videoData']['stat']['favorite']   # 视频收藏数
  125. print('标题        : %s'%video_title)
  126. print('视频封面地址 : %s'%video_cover)
  127. print('BV号        : %s'%video_bvid)
  128. print('发布时间    :',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(video_pubdate)))
  129. print('支持视频格式 : ',end='')
  130. for i in video_formats:
  131.     print(i['new_description'],end=' ')
  132. print('\n共有%d个分P视频'%len(video_pages))
  133. print('UP主     :%s 【UID:%d】'%(video_up,video_up_uid))
  134. print('播放:%d,点赞:%d,硬币:%d,收藏:%d'%(video_view,video_like,video_coin,video_favorite))


  135. """
  136. 重要参考内容,致以无比感谢
  137. 【Github】
  138. SocialSisterYi/bilibili-API-collect
  139. blogwy / BilibiliVideoDownload
  140. """
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 20:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表