【Python爬虫】下载b站视频。超详细。
目录
- 1、资源获取
- **1.1 获得bvid**
- **1.2获取cid**
- **1.3获取视频url**
- **1.4下载视频**
- 2、其它函数
- main.py
- 用来创建文件夹的函数creatdir.py
- 用来保存文件的函数savefile.py
- 结语
自己练习网上抓东西。
实现功能:检索、下载b站非会员视频,会员的得要会员cookie。
核心部分:对b站公共api的使用,也让我对什么是api有了一定的了解。
程序设计思路:获得bvid→获得cid→获得视频url→下载flv
感想:不知道为什么,感觉这都是一些表面的东西,没什么实质的技术含量,也许是自己现在还比较菜,也算是基础入门吧。
难点: 正则表达式的使用,这也是我觉得比较难的地方吧。我也想过用beautifulsoup4,尝试了一下放弃了,因为bs4还是要用到正则(主要是我还没学透),
之后我会更多的投入到大学基础课程的学习。啊!俺的高数,啊!俺的English,俺来啦~
正文:写这篇文章主要是想总结一下,一些难点,心得。
感谢:Bilibili ORZ
1、资源获取
b站对视频资源设计是有了bvid(avid)视频ID和cvid视频分段ID(就是“自古2p没人看的‘p’ ”)就能从b站api获取视频url,用这个url就能从b站服务器下载视频。
1.1 获得bvid
从b站的search服务器网站’https://search.bilibili.com/all?keyword=’
'keyword='在后面加上想要搜索的名称
就能得到索引html文档。用正则表达式提取文档中bvid、视频名字和该视频的url(以后headers头中referer要用,防止反爬)
pattern = compile('<a href="//www.bilibili.com(.*)" title="(.*?)" ')# 获取Bvid、视频名字
data = re.findall(patten, html)# 正则匹配 list = []# 用来保存由 序号、名字、bvid、referer构成的字典1i = 0 for ul, name in data:dict = {'number': '', 'name': '', 'bvid': '', 'referer': ''}i += 1referer = 'http://www.bilibili.com' + ulbvid = re.findall('/([a-zA-Z0-9]*)\?', ul)[0]dict['number'] = idict['name'] = namedict['bvid'] = bviddict['referer'] = refererlist.append(dict)path = savefile.save(name=s_name, dirpath=root_dir, content=list, suffix='json')# 我为了更好的测试,将每一步的结果都保存了起来,这个savefile函数是我自己写的。
1.2获取cid
从b站的api"https://api.bilibili.com/x/player/pagelist?bvid=BV1C7411k7D3&jsonp=jsonp"获得cid
'bvid='后面加上获得的bvid就可以了。
def getcid(name, bvid, referer, dirpath):Host = 'api.bilibili.com'url = 'https://api.bilibili.com/x/player/pagelist?'+'bvid=' + bvid +'&jsonp=jsonp'path = getHTML.get(url=url, name=name, dirpath=dirpath, referer=referer, Host=Host, suffix='txt')return path
getHTML是我自己写的用于爬取的函数,因为要经过不止一次爬取
内容是:(这才是真正意义上的爬取)
from urllib import request
import savefiledef get(url, name, dirpath=None, referer=None, Host=None, suffix=None):headers = {'Accept': 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8','Accept-Language': 'zh-Hans-CN, zh-Hans; q=0.5','DNT': '1','Host': 'search.bilibili.com','Origin': 'https://www.bilibili.com','Upgrade-Insecure-Requests': '1','User-Agent': '写上自己的useragent,一个网页右键检查元素,network网络里随便点一个包request headers请求头里',}# 刚开始尝试的时候headers写的少,被b站大大封了几次ip,还好b站大大仁慈,cookie可以不加,如果是浏览器无痕模式一般是不会将cookie加入头的,加上'DNT':1if referer != None:headers['referer'] = refererif Host != None:headers['Host'] = Hostreq = request.Request(url, headers=headers)print('开始抓取')response = request.urlopen(req)print('抓取{}成功!'.format(url))html = response.read()html = html.decode('utf-8')path = savefile.save(name=name, dirpath=dirpath, content=html,suffix=suffix )return pathif __name__ == '__main__':
获取的cid数据是json格式的
用json模块读取,可以进行一系列字典、列表操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4huHqqu-1588317947898)(cid.png)]
如果直接用瞅json文本结构简单还好,结构复杂能瞅瞎眼。我用vscode里的json tool插件,安装并重启后按ctrl + alt + m即可进行结构化展示,注意格式化前不要选中(就是浏览时用光标一直按住左键选取,文字地下会出现阴影)任何文本,不然会失败。
import jsonwith open(cid_file, mode='r', encoding='utf-8') as f:f = json.load(f)
如
f['data'][0]['cid']
值就是145508985。
注意data这个键对应的值是个列表,列表里的元素又是很多个(这里只有一个)字典。
有一些视频里不止有一个p,一个p对应一个cid。
1.3获取视频url
现在已经取得了视频的bvid,cid就能利用这两个参数从b站api
'https://api.bilibili.com/x/player/playurl?' + 'bvid=' + bvid +'&cid=' + str(cid) + '&qn=64&type=&otype=json'
里获得url,qu=64是视频分辨率1080p,32是720p。
这里获取资源的时候headers里Host值换成 api.bilibili.com
referer值换成之前已经获取的referer,一般结构是:“http://www.bilibili.com/video/BV1C7411k7D3?from=search”,
爬取后的文件格式依旧是json
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXkAPk6g-1588317947901)(2.png)]
要有耐心滴一层一层剥开(我愿一层一层一层一层剥开你的心~
【Python爬虫】下载b站视频。超详细。相关推荐
- Python 仅下载B站视频的音频
Python 仅下载B站视频的音频 因为各音源网站都要会员而且资源都不全,但是B站上所有的歌或者郭德纲的相声是都可以分享的,所以想在B站上下载想要的歌或者其他的音频. 首先打开一个连接https:// ...
- python爬虫之bs4模块(超详细)
python爬虫之bs4模块(超详细) 一.bs4简介 二.使用方法 三.BeautifulSoup四大对象种类 (1)tag (2)NavigableString (3)BeautifulSoup ...
- python爬虫之b站视频下载(python学习笔记)
b站视频爬取(python学习笔记) 亲爱的b站自从在2020年3月23日将av号改为BV号后,之前的很多爬虫已经不能用了,暂时没看懂这操作的意义何在,反而一大串大小写英文字母加数字的BV号让人很难记 ...
- python下载b站视频_爬虫可以当是一个批量下载工具!用Python批量下载B站视频
说起B站,肯定人人都知道吧,B站的反扒机制并不是太严格,所以今天我准备给大家说说我能想到的几种方式,目前大概想到了三种方式: 1.模拟手机端请求,视频链接就添加在源码中.(最简单.但清晰度不好) 2. ...
- 宝藏下载神器,python一键下载B站视频
B站无疑是一个宝藏地带,作为一个宝藏(老)男孩,请自行忽略(老)字,B站,一个学习的天堂,请一定珍惜,好好使用!作为吃灰党资深成员,一些的好的视频无疑需要进收藏夹吃灰,相信各位好机油肯定收藏了不少小姐 ...
- 【python 爬虫图】两个超详细的python爬虫技能树
- python爬虫 下载视频网站视频
python爬虫 下载视频网站视频 xpath解析页面源码 requests.Session() 解决 status_code 302 网页重定向 selenium 获取网页遇到 iframe 标签解 ...
- python爬虫实战-爬取视频网站下载视频至本地(selenium)
#python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...
- python批量下载b站_PYTHON批量下载B站视频小脚本
无聊废话 最近在学习HCIE的视频,收藏了几个相关的视频,结果前几天...视频被下架了了...呃...(⊙o⊙)- 视频被下架 视频被下架了...我学了一半呀...哭... 在网上一顿找,依旧找不到. ...
- python下载B站视频(简单)
python下载B站视频资料 众所周知,网页版的B站无法下载视频,然本人喜欢经常在B站学习,奈何没有网时,无法观看视频资源,手机下载后屏幕太小又不想看,遂写此程序以解决此问题 话不多说,进入正题 1. ...
最新文章
- 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
- Sublime Text3配置Lua运行环境
- html5怎么实现自动缩放图片,如图,html5开发的手机端web在线客服聊天,如何实现图片点击放大,捏合缩放功能?...
- MySQL快速查询的12条建议,让你不止会用select *
- Java集合篇:集合细节:为集合指定初始容量、asList的缺陷、subList的缺陷
- 转字符串_【转】什么是字符串?字符串是用来做什么的?
- LESS+to+MCSS
- js判断ie 火狐 还是chrome浏览器
- 未受信任的企业级开发者怎么设置
- andriod自带模拟器使用代理
- 矩阵可逆与行列式关系的一个直观推导
- QQ群关键字提醒设置
- PyTorch 在 Windows 10 系统下的环境配置及安装
- HTML中如何将字体加粗-前端入门
- python 网络字节序转换_python网络编程:ntohl、htonl、ntohs、htons
- ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
- 从在浏览器地址栏中输入www.baidu.com到看到百度首页,这个过程中间经历了什么?都涉及到哪些网络协议?
- 《通信原理》多径衰落信道仿真2
- 交互设计师可以做的更多
- 网上招标系统(威客网)毕业设计