当前位置: 首页 > news >正文

爬虫项目实战——爬取B站视频

目标:对B站视频详情页url进行视频的爬取。
注:由于B站的音频和视频的链接是分开的,所以在提取是需要分别提取,然后进行合成。
这里只管提取,合成的工作以后再说。

具体步骤

  1. 发送请求 对于视频详情页url地址发送请求 https://www.bilibili.com/video/BV11b4y1S7Jg
  2. 获取数据 获取响应体的文本数据 response.text 网页源代码
  3. 解析数据 提取我们想要的 视频标题/音频url/视频画面url,
  4. 保存数据, 对于音频url 视频url发送请求 获取响应体二进制数据 response.content
  5. 合成数据,把音频内容以及视频画面内容合成为一个完整的mp4文件

1. 发送请求

说明:
Referer:是防盗链。表示当前这个链接,我是从哪个链接跳转过来的。
Cookie:由于B站不登陆只能下载

url = 'https://www.bilibili.com/video/BV1Bo4y1v7Yq/'
response = requests.get(url)
cookie = "buvid3=5C5D0069-031F-2213-8E11-3B17C971719F69389infoc; b_nut=1688698369; _uuid=7F76CBFD-ADE2-44103-424C-D73D5E9ACC2869255infoc; header_theme_version=CLOSE; CURRENT_FNVAL=4048; buvid4=780B8373-C6A6-6800-F372-7CF18F799AE570981-023070710-7YWVed7pFp%2FuoShCfdfYnQ%3D%3D; DedeUserID=175444232; DedeUserID__ckMd5=b4a676bf5d8afe1c; rpdid=|(k|)mum~~uJ0J'uY))~|uklm; LIVE_BUVID=AUTO5916888971292528; SESSDATA=6b25c9b2%2C1705192174%2Cba23f%2A71bQR5hFBMOt8AXYHjziKE4HOwWw6Ei8wrCIByshPnLAkTd2jwLJy4WYgVkViOyIUPNssSUQAAIAA; bili_jct=e29211bb7e88730fc2bc6691218d247e; sid=858nix09; FEED_LIVE_VERSION=V8; buvid_fp_plain=undefined; hit-new-style-dyn=1; hit-dyn-v2=1; i-wanna-go-back=-1; b_ut=5; fingerprint=b2371c9349b15d5ad60e75cd01f7dc55; buvid_fp=5b9a1047d9ef9ba48290adcd4ba39e58; share_source_origin=copy_web; bsource=share_source_copylink_web; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTY0NzMzNjcsImlhdCI6MTY5NjIxNDEwNywicGx0IjotMX0.D2ixQib5vaXOyxTBLWhIR8KzpbGQloGjxzXDgnOum3E; bili_ticket_expires=1696473307; CURRENT_QUALITY=80; b_lsid=4F245FCD_18AFACA514A; home_feed_column=5; browser_resolution=1552-827; bp_video_offset_175444232=848638555060174904; PVID=1"head = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",# Referer: 防盗链。用于告诉服务器我是从哪个链接跳转来的。'Referer': 'https://www.bilibili.com/','Cookie': cookie
}
sleep(2)
page_text = response.text

2. 获取数据

# 获取标题和播放信息
tree = etree.HTML(page_text)
title = tree.xpath('//*[@id="viewbox_report"]/h1/text()')[0]
play_info = tree.xpath('/html/head/script[4]')[0].text      # 通过tree.xpath得到script对象,然后通过text属性得到其内容
play_info = play_info[20:]      # 去掉前面的window.__playinfo__=这几个字符
print(play_info)

3. 解析数据

# 将数据转为json格式,方便获取其中的部分数据
play_info_json = json.loads(play_info)
# print(play_info_json)
pprint.pprint(play_info_json)   # 格式化输出# 获取音频、视频url
# B站的音频和视频链接是分开的,所以要分别获取,然后通过一定的方法进行合并。
video_url = play_info_json['data']['dash']['video'][0]['baseUrl']   # 得到视频链接
audio_url = play_info_json['data']['dash']['audio'][0]['baseUrl']   # 得到音频链接

4. 保存数据

video_content = requests.get(url=video_url, headers=head).content   # content表示二进制数据
audio_content = requests.get(url=audio_url, headers=head).content		#  # content表示二进制数据if not os.path.exists('./B站视频'):os.mkdir('./B站视频')with open('./B站视频/'+title+'.mp4', 'wb') as fp:fp.write(video_content)with open('./B站视频/'+title+'.mp3', 'wb') as fp:fp.write(audio_content)

完整代码

import json
import os.pathimport requests
from time import sleep
from lxml import etree
import pprint# 已成功"""
1.发送请求 对于视频详情页url地址发送请求 https://www.bilibili.com/video/BV11b4y1S7Jg
2.获取数据 获取响应体的文本数据 response.text 网页源代码
3.解析数据 提取我们想要的 视频标题/音频url/视频画面url,
4保存数据, 对于音频url 视频url发送请求 获取响应体二进制数据 response.content
5.合成数据,把音频内容以及视频画面内容合成为一个完整的mp4文件
"""
url = 'https://www.bilibili.com/video/BV1Bo4y1v7Yq/'
response = requests.get(url)
cookie = "buvid3=5C5D0069-031F-2213-8E11-3B17C971719F69389infoc; b_nut=1688698369; _uuid=7F76CBFD-ADE2-44103-424C-D73D5E9ACC2869255infoc; header_theme_version=CLOSE; CURRENT_FNVAL=4048; buvid4=780B8373-C6A6-6800-F372-7CF18F799AE570981-023070710-7YWVed7pFp%2FuoShCfdfYnQ%3D%3D; DedeUserID=175444232; DedeUserID__ckMd5=b4a676bf5d8afe1c; rpdid=|(k|)mum~~uJ0J'uY))~|uklm; LIVE_BUVID=AUTO5916888971292528; SESSDATA=6b25c9b2%2C1705192174%2Cba23f%2A71bQR5hFBMOt8AXYHjziKE4HOwWw6Ei8wrCIByshPnLAkTd2jwLJy4WYgVkViOyIUPNssSUQAAIAA; bili_jct=e29211bb7e88730fc2bc6691218d247e; sid=858nix09; FEED_LIVE_VERSION=V8; buvid_fp_plain=undefined; hit-new-style-dyn=1; hit-dyn-v2=1; i-wanna-go-back=-1; b_ut=5; fingerprint=b2371c9349b15d5ad60e75cd01f7dc55; buvid_fp=5b9a1047d9ef9ba48290adcd4ba39e58; share_source_origin=copy_web; bsource=share_source_copylink_web; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTY0NzMzNjcsImlhdCI6MTY5NjIxNDEwNywicGx0IjotMX0.D2ixQib5vaXOyxTBLWhIR8KzpbGQloGjxzXDgnOum3E; bili_ticket_expires=1696473307; CURRENT_QUALITY=80; b_lsid=4F245FCD_18AFACA514A; home_feed_column=5; browser_resolution=1552-827; bp_video_offset_175444232=848638555060174904; PVID=1"head = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",# Referer: 防盗链。用于告诉服务器我是从哪个链接跳转来的。'Referer': 'https://www.bilibili.com/','Cookie': cookie
}
sleep(2)
page_text = response.textwith open('./bilibili.html', 'w', encoding='utf-8') as fp:fp.write(page_text)# print(page_text)
# 获取标题和播放信息
tree = etree.HTML(page_text)
title = tree.xpath('//*[@id="viewbox_report"]/h1/text()')[0]
play_info = tree.xpath('/html/head/script[4]')[0].text      # 通过tree.xpath得到script对象,然后通过text属性得到其内容
play_info = play_info[20:]      # 去掉前面的window.__playinfo__=这几个字符
print(play_info)# 将数据转为json格式,方便获取其中的部分数据
play_info_json = json.loads(play_info)
# print(play_info_json)
pprint.pprint(play_info_json)   # 格式化输出# 获取音频、视频url
# B站的音频和视频链接是分开的,所以要分别获取,然后通过一定的方法进行合并。
video_url = play_info_json['data']['dash']['video'][0]['baseUrl']   # 得到视频链接
audio_url = play_info_json['data']['dash']['audio'][0]['baseUrl']   # 得到音频链接# 获取音频、视频数据
video_content = requests.get(url=video_url, headers=head).content   # content表示二进制数据
audio_content = requests.get(url=audio_url, headers=head).contentif not os.path.exists('./B站视频'):os.mkdir('./B站视频')with open('./B站视频/'+title+'.mp4', 'wb') as fp:fp.write(video_content)with open('./B站视频/'+title+'.mp3', 'wb') as fp:fp.write(audio_content)print("提取到的title", title)

相关文章:

爬虫项目实战——爬取B站视频

目标:对B站视频详情页url进行视频的爬取。 注:由于B站的音频和视频的链接是分开的,所以在提取是需要分别提取,然后进行合成。 这里只管提取,合成的工作以后再说。 具体步骤 发送请求 对于视频详情页url地址发送请求 …...

关掉在vscode使用copilot时的提示音

1. 按照图示的操作File --> Preferences --> Settings 2. 搜索框输入关键字Sound,因为是要关掉声音,所以找有关声音的设置 3. 找到如下图所示的选项 Audio Cues:Line Has Inline Suggetion,将其设置为Off 这样,就可以关掉suggest code时…...

【有限域除法】二元多项式除法电路原理及C语言实现

二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1...

RabbitMQ核心总结

AMQP协议核心概念 RabbitMQ是基于AMQP协议的,通过使用通用协议就可以做到在不同语言之间传递。 server:又称broker,接受客户端连接,实现AMQP实体服务。 connection:连接和具体broker网络连接。 channel&#xff1a…...

Unicode与UTF-8

软件开发中乱码问题经常遇到,Unicode,UTF-8, ASCII等都是高频词语,不过具体是啥意思其实都不清楚。这个周末研究了一下,略有了解,记录一下。 Unicode Unicode本身是纯理论的东西,和具体计算机实现无关。它…...

A : DS单链表--类实现

Description 用C语言和类实现单链表&#xff0c;含头结点 属性包括&#xff1a;data数据域、next指针域 操作包括&#xff1a;插入、删除、查找 注意&#xff1a;单链表不是数组&#xff0c;所以位置从1开始对应首结点&#xff0c;头结点不放数据 类定义参考 #include<…...

React Hooks —— ref hooks

什么是Hooks Hooks从语法上来说是一些函数。这些函数可以用于在函数组件中引入状态管理和生命周期方法。 React Hooks的优点 简洁 从语法上来说&#xff0c;写的代码少了上手非常简单 基于函数式编程理念&#xff0c;只需要掌握一些JavaScript基础知识与生命周期相关的知识不…...

泛型与Gson解析

/*** 回调接口的一种实现* 用于把网络返回的json字符串转换成参数化类型* 泛型 T 就是用户输入的javaBean的类型*/ public abstract class HttpCallback<T> implements ICallback {Overridepublic void onSuccess (String result) {// result就是网络回来的数据// 把这个…...

c++使用ifstream和ofstream报错:不允许使用不完整的类型

学习《C Primer》关于IO库的部分&#xff0c;输入284页的的代码&#xff0c;出现了报错&#xff1a; 不允许使用不完整的类型 原来的代码&#xff1a; #include <iostream> #include <vector> using namespace std;int main(int argc, char **argv) {ifstream in…...

调试器通用波形显示工具

前言&#xff1a;事情起因是我们实验室买了个无线调试器是CMSIS-DAP的&#xff0c;无法使用J-SCOPE显示波形来方便调PID&#xff0c;所以我就在网上找到了个开源工具链接&#xff1a;http://t.csdnimg.cn/ZqZPY使用方法&#xff1a;工具是好工具&#xff0c;就是没有使用手册&a…...

Linux中getopt函数、optind等变量使用详解

getopt函数、optind等变量使用详解 最近在学习《Unix网络编程》vol2时&#xff0c;发现书中例子经常使用一个命令行解析getopt函数&#xff0c;因为函数声明比较特别&#xff0c;根据自己摸索&#xff0c;遂总结出使用方法。 1. getopt函数的声明 该函数是由Unix标准库提供的…...

RDP协议流程详解(二)Basic Settings Exchange 阶段

RDP连接建立过程&#xff0c;在Connection Initiation后&#xff0c;RDP客户端和服务端将进行双方基础配置信息交换&#xff0c;也就是basic settings exchange阶段。在此阶段&#xff0c;将包含两条消息Client MCS Connect Initial PDU和Server MCS Connect Response PDU&…...

实时人脸五观检测:基于libfacedetection(CNN模型)

一、前言 随着人工智能技术的不断发展,人脸检测已成为计算机视觉领域的重要应用之一。人脸检测是一种将输入图像中的人脸位置和轮廓提取出来的技术,广泛应用于人脸识别、智能监控、人机交互等领域。利用libfacedetection开源的人脸检测库,实现人脸检测。 libfacedetection…...

图像和视频上传平台Share Me

本文完成于 6 月&#xff0c;所以反代中&#xff0c;域名演示还是使用的 laosu.ml&#xff0c;不过版本并没有什么变化&#xff1b; 什么是 Share Me &#xff1f; Share Me 是使用 Next.js 和 PocketBase 的自托管图像和视频上传平台&#xff0c;具有丰富的嵌入支持和 API&…...

JavaScript 在前端开发中有什么应用?

JavaScript&#xff08;简称JS&#xff09;是一种脚本语言&#xff0c;广泛应用于前端开发中。作为Web前端三大基石之一&#xff08;HTML、CSS、JS&#xff09;&#xff0c;它可以使网页具备交互性、动态性和实时性&#xff0c;提高用户体验。在本文中&#xff0c;我将详细论述…...

【沐风老师】推荐2023年3DMAX的10个最佳插件!

推荐2023年3DMAX的10个最佳插件 3dMax是一款专业的三维建模、动画和渲染软件&#xff0c;供建筑师、工程师、游戏开发商和视觉效果艺术家使用。它提供了一系列用于建模、纹理、装配、动画和渲染3D对象和场景的工具。3ds Max包括粒子和流体模拟的高级功能&#xff0c;以及对各种…...

【visual studio 小技巧】项目属性->生成->事件

需求 我们有时会用到一些dll&#xff0c;需要把这些dll和我们生成的exe放到一起&#xff0c;一般我们是手动自己copy&#xff0c; 这样发布的时候&#xff0c;有时会忘记拷贝这个dll&#xff0c;导致程序运行出错。学会这个小技巧&#xff0c;就能实现自动copy&#xff0c;非…...

每日一题 279完全平方数(完全背包)

题目 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而…...

创意中秋与国庆贺卡 - 用代码为节日增添喜悦

目录 ​编辑 引言 贺卡的初始主题 - 中秋节 点击头像&#xff0c;切换至国庆主题 文本动画 用代码制作这个贺卡 获取完整代码&#xff08;简单免费&#xff09; 总结 引言 中秋佳节和国庆日是中国两个重要的传统节日&#xff0c;一个寓意团圆与祝福&#xff0c;另一个…...

专业综合课程设计 - 优阅书城项目(第一版)

此项目是《专业综合课程设计》带练项目 实现的功能有&#xff1a; 登录、注销、添加图书、删除图书、编辑图书 包含资源&#xff1a; 优阅书城&#xff08;bookstore&#xff09;源码 数据库数据 课程笔记 下载链接&#xff1a;https://wwpv.lanzoue.com/i79nx1av4doj 登录功…...

【剑指Offer】13.机器人的运动范围

题目 地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格&#xff0c;但是不能进入行坐标和列坐标的数位之和大于 thresh…...

【Qt基础篇】信号和槽

文章目录 一些常见的bug&#xff1a;字符集不对产生的错误VS平台中文乱码 QT的优点关于.pro文件QtCreator快捷键最简单的qt程序按钮的创建对象模型**Qt窗口坐标**体系信号和槽机制connect函数系统自带的信号和槽案例&#xff1a;实现点击按钮-关闭窗口的案例 自定义信号和槽案例…...

.netCore用DispatchProxy实现动态代理

在 .NET Core 中&#xff0c;你可以使用 DispatchProxy 类来实现动态代理。DispatchProxy 允许你在运行时创建一个代理对象&#xff0c;该代理对象可以拦截对其所代理的对象的方法调用&#xff0c;并在方法调用前后执行自定义的逻辑。这在 AOP&#xff08;面向切面编程&#xf…...

好奇喵 | Tor浏览器——访问.onion网址,揭开Dark Web的神秘面纱

前言 在之前的博客中&#xff1a; 1.Surface Web —&#xff1e; Deep Web —&#xff1e; Dark Web&#xff0c;我们解释了表层网络、深层网络等的相关概念&#xff1b; 2.Tor浏览器——层层剥开洋葱&#xff0c;我们阐述了Tor的历史和基本工作原理&#xff1b; 3.Tor浏览器…...

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类&#xff0c;但是发现怎么也引入不进来 A项目打包之后&#xff0c;想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF&#xff0c; 然后去A项目中查找&#xff…...

PHP框架面试题

目录 1、什么是PHP框架&#xff1f; 2、常见的PHP框架有哪些&#xff1f; 3、为什么要使用PHP框架&#xff1f; 4、什么是路由&#xff1f;PHP框架中的路由是如何实现的&#xff1f; 5.TP的特性有哪些? 6.laravel有那些特点? 7.TP框架和Laravel框架的区别 8.tp5和tp6区…...

如何清理C盘

当前最棘手的问题是C盘满了&#xff0c;如何清理成了一个大问题&#xff0c;在本篇文章中我将记录我在清理c盘空间过程中的探索。 2023-10-06探索无果&#xff0c;记录于此。...

计算机网络基础知识

1 计算机网络是指将多台计算机连接在一起&#xff0c;以便它们可以相互通信和共享资源的系统。在本文中&#xff0c;我们将详细介绍计算机网络的基础知识&#xff0c;包括网络的分类、网络协议、网络拓扑、网络设备和网络安全等方面的内容。 网络分类 计算机网络可以根据其范…...

Go语言面经进阶10问

1.Golang可变参数 函数方法的参数&#xff0c;可以是任意多个&#xff0c;这种我们称之为可以变参数&#xff0c;比如我们常用的fmt.Println()这类函数&#xff0c;可以接收一个可变的参数。可以变参数&#xff0c;可以是任意多个。我们自己也可以定义可以变参数&#xff0c;可…...

大厂真题:【DP】米哈游2023秋招-米小游与魔法少女-奇运

题目描述与示例 题目描述 米小游都快保底了还没抽到希儿&#xff0c;好生气哦&#xff01;只能打会活动再拿点水晶。 米小游和世界第一可爱的魔法少女 TeRiRi 正在打 BOSS&#xff0c;BOSS 的血量为h&#xff0c;当 BOSS 血量小于等于0时&#xff0c;BOSS 死亡。TeRiRi 有一…...

怎么做免费推广网站/北京seo推广

6.2至6.5升级之参数相关由于FineReport6.5对参数界面设置进行了较大的改动&#xff0c;因此FineReport6.2升级至FineReport6.5时参数界面设置可能会有如下问题。在浏览器中访问模板时&#xff0c;对于6.2版本来说&#xff0c;若发现url中已经有参数值传入时&#xff0c;将不会再…...

完善电子商务网站建设/高级seo课程

我们都知道比较两个对象是否相等&#xff0c; 对于基础类型是比较值&#xff0c;对于封装类是比较对象的引用---即地址。Object 中equals()是比较对象的地址&#xff0c;String 中重写了equals()、hashcode(),equals比较的是String类的值&#xff0c;同理Integer、Double也都重…...

做网站环境配置遇到的问题/中国女排联赛排名

1 什么是推荐引擎 推荐引擎是机器学习服务的一种&#xff0c;将复杂推荐系统所需的机器学习功能以SaaS的方式提供&#xff0c;让用户可以通过提供活动流&#xff08;页面浏览、注册、购买等等&#xff09;&#xff0c;以及要推荐的项目&#xff08;如文件、产品、视频或…...

自适应网站建设价格/大兴今日头条新闻

原标题&#xff1a;2021年高考进行中&#xff0c;多地教育厅公布查分时间&#xff0c;考生别入“三大坑”文/茉莉妈咪教育分享(原创&#xff0c;欢迎转载分享)现在正是一年一度的“高考季”&#xff0c;今年全国共有1078万考生奔赴考场&#xff0c;又创历史新高。数千万莘莘学子…...

公司网站页面设计思路/百度热搜关键词

文章目录1、基本介绍2、选择排序的思想3、选择排序思路分析图4、代码实现1、基本介绍 选择排序属于内部排序算法&#xff0c;是从预排序的数据中&#xff0c;按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的 2、选择排序的思想 选择排序(select sorti…...

九 网站建设日程表/seo推广怎么收费

在CSS3中not()选择器怎么用发布时间&#xff1a;2020-12-07 14:40:14来源&#xff1a;亿速云阅读&#xff1a;115作者&#xff1a;小新小编给大家分享一下在CSS3中not()选择器怎么用&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一下&#xf…...