b站视频爬取(python学习笔记)

亲爱的b站自从在2020年3月23日将av号改为BV号后,之前的很多爬虫已经不能用了,暂时没看懂这操作的意义何在,反而一大串大小写英文字母加数字的BV号让人很难记,反爬嘛?(滑稽),那就爬一下玩一玩。

在网上简单搜一下资料就可以了解到b站视频下载需要两个参数aid和cid
这里参考了这个案例
以这个视频为例:https://www.bilibili.com/video/BV1J7411R7nV?p=1&share_medium=iphone&share_plat=ios&share_source=QQ&share_tag=s_i&timestamp=1597063419&unique_k=NRuL4t
开始爬取操作
首先可以看到视频的BV号为BV1J7411R7nV,要将其转化为av号,有以下两种方法:
方法1
(1)来到播放页面,按下F12打开浏览器控制台,一般控制台的名字为"控制台"或者"Console"
(2)在控制台输入aid,下面出现的数字就是av号(纯数字),如果没有出现的话可能需要按下回车.

方法2
借用知乎某位大佬的回答https://www.zhihu.com/question/381784377/answer/1099438784?utm_source=qq&utm_medium=social&utm_oi=916644358151897088&utm_content=sec

table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608def dec(x):r=0for i in range(6):r+=tr[x[s[i]]]*58**ireturn (r-add)^xordef enc(x):x=(x^xor)+addr=list('BV1  4 1 7  ')for i in range(6):r[s[i]]=table[x//58**i%58]return ''.join(r)作者:mcfx
链接:https://www.zhihu.com/question/381784377/answer/1099438784
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

av号和BV号的相互转化规则(牛牛牛),也可得出av号,这时候我们将BV号替换为av号:https://www.bilibili.com/video/av97325890
发现所打开的地址是一致的

接下来我们去找该视频对应的cid
F12打开开发者工具,点击network,刷新界面,耐心点找,得到以下数据,最后找到对应cid

得到aid和cid后我们要去寻找视频真正所在的url,B站的视频格式一般为flv
这时访问: https://api.bilibili.com/x/player/playurl?avid=97325890&cid=166148070&qn=32&type=&otype=json
继续F12打开可以看到


此时发现找到了视频真正的url
这里quality是视频质量
80: 高清 1080P
64: 高清 720P
32: 清晰 480P
16: 流畅 360P

下面只需要写代码将视频爬取下来即可
用到以下3个库

import requests
from lxml import html
import re

得到cid,可以从这个接口获得:https://api.bilibili.com/x/player/pagelist?aid=97325890&jsonp=jsonp

def get_cid(aid):"""得到cid"""header = {'host': 'api.bilibili.com','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}url = "https://api.bilibili.com/x/player/pagelist?aid={aid}&jsonp=jsonp".format(aid=aid)response = requests.get(url,headers=header).json()return response["data"][0]["cid"] ,response["data"][0]["part"]

接着获取视频的flv文件

def get_flvurl(url):"""获得视频真实flv地址"""header = {'host': 'api.bilibili.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}response = requests.get(url,headers=header).json()return response["data"]["durl"][0]["url"],response["data"]["durl"][0]["size"]

视频的存储

def save_movie(res,name):"""保存视频"""chunk_size = 1024with open("{name}.flv".format(name = name),"wb") as f:for data in res.iter_content(1024):f.write(data)

结合python的tkinter库写了一个Gui界面,运行时发现按钮所绑定的方法处理起来需要点时间,然后导致界面会卡死,最后发现是单线程的原因,尝试引入多线程来解决问题,最后问题成功解决。

首先封装线程函数

def thread_it(func,*args):"""将函数打包进线程内执行"""# 创建t = threading.Thread(target=func, args=args) # 守护 !!!t.setDaemon(True) # 启动t.start()

按钮绑定函数的写法

button1=Button(init_window,text="开始下载", bg="Cornsilk", width=8,height=1,command=lambda :thread_it(star))

完整代码如下(结合BV号转av号的规则)

from tkinter import *
from tkinter import messagebox
import tkinter.font as tkFont
import requests
from lxml import html
import re
import threadingtable='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608def dec(x):"""将BV号转化为av号"""r=0for i in range(6):r+=tr[x[s[i]]]*58**ireturn (r-add)^xordef star():url=text1.get(1.0,END)url2 = "https://api.bilibili.com/x/player/playurl?avid={avid}&cid={cid}&qn=64&type=&otype=json"headers2 = {"host": "","Referer": "https://www.bilibili.com","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"}BVid=re.findall("video/(.+)\?",url)avid=dec(BVid[0])text2.insert(1.0,'av号:'+str(avid)+'\n')cid ,name = get_cid(avid)text2.insert(3.0,'视频名称:'+name+'\n')flv_url , size = get_flvurl(url2.format(avid=avid,cid=cid))bulk = size / 1024 / 1024text2.insert(5.0,"本视频大小为:%.2fM" % bulk+'\n')h = re.findall("http://(.+)com",flv_url)host = h[0]+"com"headers2["host"] = hostres = requests.get(flv_url,headers=headers2,stream=True, verify=False)if res.status_code==200:text2.insert(7.0,'下载成功')save_movie(res,name)def get_cid(aid):"""得到cid"""header = {'host': 'api.bilibili.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}url = "https://api.bilibili.com/x/player/pagelist?aid={aid}&jsonp=jsonp".format(aid=aid)response = requests.get(url,headers=header).json()return response["data"][0]["cid"] ,response["data"][0]["part"]def get_flvurl(url):"""获得视频真实flv地址"""header = {'host': 'api.bilibili.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}response = requests.get(url,headers=header).json()return response["data"]["durl"][0]["url"],response["data"]["durl"][0]["size"]def save_movie(res,name):"""保存视频"""chunk_size = 1024with open("{name}.flv".format(name = name),"wb") as f:for data in res.iter_content(1024):f.write(data)def thread_it(func,*args):"""将函数打包进线程内执行"""# 创建t = threading.Thread(target=func, args=args) # 守护 !!!t.setDaemon(True) # 启动t.start()#实例化一个父界面
init_window = Tk()
#界面参数
init_window.title('B站视频下载器')          #窗口名称
init_window.geometry('600x500+400+150')    #窗口大小
init_window["bg"] = "mistyrose"            #窗口颜色
init_window.attributes("-alpha",0.9)       #窗口透明度
init_window.iconbitmap("billbill.ico")     #窗口图标
#标签
label1=Label(init_window,text="请输入视频链接",bg='mistyrose',font=('隶书',13))
label1.place(relx=0.38,rely=0.05)
label2=Label(init_window,text="消息",bg='mistyrose',font=('隶书',13))
label2.place(relx=0.46,rely=0.37)
#文本框
text1=Text(init_window,width=60, height=4)
text1.place(relx=0.15,rely=0.12)
text2=Text(init_window,width=60, height=15)
text2.place(relx=0.15,rely=0.42)
#按钮
button1=Button(init_window,text="开始下载", bg="Cornsilk", width=8,height=1,command=lambda :thread_it(star))
button1.place(relx=0.44,rely=0.25)
#窗口进入循环
init_window.mainloop()

运行结果

然后打开程序所在的目录下

B站的视频格式都是flv格式,可以用格式工厂(实测有用)转化为MP4文件
其实tkinter库写一写这些功能较为简单的小程序还是挺方便的。

python爬虫之b站视频下载(python学习笔记)相关推荐

  1. python爬取b站视频封面_学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面...

    学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面 import os import requests import re import json from bs4 import B ...

  2. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  3. Python爬虫-爬取爆米花视频下载至本地

    打开爆米花的网站,然后打开其中一个视频: 打开F12,然后刷新,可以看到: 这个URL为视频的真实地址: http://59.56.28.122/vm48002.baomihua.com/d1b3a2 ...

  4. python零基础入门教程视频下载-Python零基础入门学习视频教程全42集,资源教程下载...

    课程名称 Python零基础入门学习视频教程全42集,资源教程下载 课程目录 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小 ...

  5. python爬虫urllib2模块的基本使用(学习笔记一)

    urllib2库的介绍 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 Pyt ...

  6. python爬虫实战-爬取视频网站下载视频至本地(selenium)

    #python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...

  7. 曝肝三天,两千行Python代码,制作B站视频下载工具(附源码)

    曝肝三天,两千行Python代码,制作B站视频下载工具(附源码) 文章目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_vide ...

  8. python爬取bilibili弹幕_用Python爬取B站视频弹幕

    原标题:用Python爬取B站视频弹幕 via:菜J学Python 众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一 ...

  9. Python爬虫:AGE动漫下载之 requests 版

    日常跳转: 导入: 分析与代码解释: 打印搜索到的信息 BeautifelSoup4 库使用提醒 小优化 链接解析: 获取视频链接 小优化: 提示: 视频下载: 求大佬赐教 实例源码及结果 结果及下载 ...

最新文章

  1. php ob flush 不管用,php ob_flush 不能每隔一秒输出
  2. Python程序设计题解【蓝桥杯官网题库】 DAY6-基础练习
  3. 关于 Java 对象序列化您不知道的 5 件事
  4. python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始
  5. Arrays.asList()使用时的注意事项,这个结论同可适用于Stream.of()___Arrays.stream和Stream.of
  6. java-pdf转word,java开发面试笔试题
  7. 漫谈云计算与OpenStack的前世今生
  8. IaaS、PaaS、SaaS、BaaS、FaaS、APaaS、IPaaS、IDaaS、DaaS
  9. poj 1696 Space Ant
  10. 11个程序员最常犯的MySQL错误(PHP开发)
  11. 12满秩分解与奇异值分解(2)
  12. MITRE Implementation of ISO 12233 Spatial Frequency Response (SFR)
  13. 远景论坛黑苹果专区_黑苹果扯犊子篇
  14. 如何用两个晚上教女生学会Python
  15. 毫米和像素怎么换算_C#中毫米与像素的换算方法
  16. mysql 3日内_一门三父子
  17. 【Java泛型】泛型方法
  18. Android之——常用手机号码功能
  19. 技术支持和测试的区别_同步带线性模组 丝杆线性模组和直线电机模组的区别及应用...
  20. nodejs+vue健身俱乐部网站

热门文章

  1. 80GB医学影像数据集发布!OCTA-500公开下载
  2. 《鲲鹏》MV,160万开发者的集结号
  3. 用c语言编写研究生录取程序,C语言_课程设计---研究生初试录取管理系统.doc
  4. xilinx 官网vivado和petalinux下载速度慢的解决办法
  5. 华数机器人旋转编程_用户手册-华数机器人.PDF
  6. JDBC--预编译的statement对数据库进行添加数据的操作
  7. 苹果手机拦截所有陌生号码,如何解除--请关闭勿扰模式
  8. [转]前端开发者不得不知道的41个常用的网站,因为这41个网站我成了别人眼中的巨佬(转载请删除括号里的内容)
  9. Android View Binding使用介绍
  10. 手机回收网迅速兴起,闲置手机快速变现有看点