目录

  • 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站视频。超详细。相关推荐

  1. Python 仅下载B站视频的音频

    Python 仅下载B站视频的音频 因为各音源网站都要会员而且资源都不全,但是B站上所有的歌或者郭德纲的相声是都可以分享的,所以想在B站上下载想要的歌或者其他的音频. 首先打开一个连接https:// ...

  2. python爬虫之bs4模块(超详细)

    python爬虫之bs4模块(超详细) 一.bs4简介 二.使用方法 三.BeautifulSoup四大对象种类 (1)tag (2)NavigableString (3)BeautifulSoup ...

  3. python爬虫之b站视频下载(python学习笔记)

    b站视频爬取(python学习笔记) 亲爱的b站自从在2020年3月23日将av号改为BV号后,之前的很多爬虫已经不能用了,暂时没看懂这操作的意义何在,反而一大串大小写英文字母加数字的BV号让人很难记 ...

  4. python下载b站视频_爬虫可以当是一个批量下载工具!用Python批量下载B站视频

    说起B站,肯定人人都知道吧,B站的反扒机制并不是太严格,所以今天我准备给大家说说我能想到的几种方式,目前大概想到了三种方式: 1.模拟手机端请求,视频链接就添加在源码中.(最简单.但清晰度不好) 2. ...

  5. 宝藏下载神器,python一键下载B站视频

    B站无疑是一个宝藏地带,作为一个宝藏(老)男孩,请自行忽略(老)字,B站,一个学习的天堂,请一定珍惜,好好使用!作为吃灰党资深成员,一些的好的视频无疑需要进收藏夹吃灰,相信各位好机油肯定收藏了不少小姐 ...

  6. 【python 爬虫图】两个超详细的python爬虫技能树

  7. python爬虫 下载视频网站视频

    python爬虫 下载视频网站视频 xpath解析页面源码 requests.Session() 解决 status_code 302 网页重定向 selenium 获取网页遇到 iframe 标签解 ...

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

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

  9. python批量下载b站_PYTHON批量下载B站视频小脚本

    无聊废话 最近在学习HCIE的视频,收藏了几个相关的视频,结果前几天...视频被下架了了...呃...(⊙o⊙)- 视频被下架 视频被下架了...我学了一半呀...哭... 在网上一顿找,依旧找不到. ...

  10. python下载B站视频(简单)

    python下载B站视频资料 众所周知,网页版的B站无法下载视频,然本人喜欢经常在B站学习,奈何没有网时,无法观看视频资源,手机下载后屏幕太小又不想看,遂写此程序以解决此问题 话不多说,进入正题 1. ...

最新文章

  1. 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
  2. Sublime Text3配置Lua运行环境
  3. html5怎么实现自动缩放图片,如图,html5开发的手机端web在线客服聊天,如何实现图片点击放大,捏合缩放功能?...
  4. MySQL快速查询的12条建议,让你不止会用select *
  5. Java集合篇:集合细节:为集合指定初始容量、asList的缺陷、subList的缺陷
  6. 转字符串_【转】什么是字符串?字符串是用来做什么的?
  7. LESS+to+MCSS
  8. js判断ie 火狐 还是chrome浏览器
  9. 未受信任的企业级开发者怎么设置
  10. andriod自带模拟器使用代理
  11. 矩阵可逆与行列式关系的一个直观推导
  12. QQ群关键字提醒设置
  13. PyTorch 在 Windows 10 系统下的环境配置及安装
  14. HTML中如何将字体加粗-前端入门
  15. python 网络字节序转换_python网络编程:ntohl、htonl、ntohs、htons
  16. ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
  17. 从在浏览器地址栏中输入www.baidu.com到看到百度首页,这个过程中间经历了什么?都涉及到哪些网络协议?
  18. 《通信原理》多径衰落信道仿真2
  19. 交互设计师可以做的更多
  20. 网上招标系统(威客网)毕业设计

热门文章

  1. unity3d发布webgl手机测试流程
  2. 如何批量将多个 PPT 文档快速合并成一个文档
  3. 哈尔滨车牌摇号系统遭遇黑客攻击瘫痪
  4. 关于SQL Server numeric数据类型介绍
  5. FastCGI与spawn-fcg简介
  6. 阿里云云服务器ECS选购指南及省钱法宝
  7. linux如何打印脚本运行进度,linux-如何在使用systemd引导期间最后运行并打印我的脚本输出?...
  8. 经典不等式链的一些拓展理解
  9. 产品经理入职新公司要做什么?
  10. 能耗指标与数据中心规模-孙长青