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

Python 爬虫实战:爬取 B 站视频的完整教程

一、爬虫基础概述

Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用信息。因其简洁的语法和丰富的库支持(如 requests、BeautifulSoup、Scrapy 等),Python 成为实现爬虫的首选语言之一。

Python 爬虫获取浏览器信息的本质是模仿浏览器上网行为,核心步骤包括:

  • 指定 url
  • 发送请求
  • 获取目标数据
  • 数据解析

本文将以 B 站视频为例,详细介绍爬取视频的实现过程。

二、爬取 B 站视频实战

2.1 确定目标视频

本次爬取的目标视频为 B 站链接:
https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d

该视频为《尘白禁区》里芙花嫁 cosplay 内容,截至数据统计时,播放量达 265 万 +,点赞数 24 万 +,是一款热门视频。

2.2 具体实现步骤

步骤 1:指定 URL

首先确定需要爬取的视频页面 URL:

url = "https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d"
UA伪装

同时,对于视频的爬取,网站都是有很强的反爬取能力,所以我们除此以外还需要在申请访问页面时,输入Referer防盗链以及Cookie身份信息(记得登录网站哦!),

和找寻url时一样,在同一个页面往下滑就能找到页面给的Cookie身份信息。

接着往下滑:

同样的,找到Referer防盗链和页面给的UA。

步骤 2:设置请求头(反爬处理)

B 站有较强的反爬机制,需进行 UA 伪装、添加防盗链和 Cookie 信息:

head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0","Referer": "https://www.bilibili.com/",  # 防盗链,表明请求来源"Cookie": "buvid3=C05B40CB-6A34-98BA-39D6-53A15FB1331D09014infoc; ..."  # 需替换为自己的Cookie
}

提示:Cookie 可通过登录 B 站后,在浏览器开发者工具中获取

步骤 3:发送请求

使用 requests 库发送 GET 请求:

response = requests.get(url, headers=head)

获取想要的数据

我们在爬取图片时,我们在寻找图片的地址,那我们视频的位置在哪里?怎么获取呐?

第一步点击Element,第二部找到html标签,在该标签下,找到第四个script标签。如下:这里面就是我们要获取的视频信息啦,前20个字符不需要。

步骤 4:解析视频信息
  1. 使用 lxml 库解析页面结构,定位视频信息所在的 script 标签:
from lxml import etree
tree = etree.HTML(res_text)
# 提取第4个script标签的内容,去除前20个无关字符
base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]

2.将获取的字符串转换为字典格式:

import json
info_dict = json.loads(base_info)  # 转换为字典便于取值

因为b站的视频,视频和音频时分开的,所以我们得从信息中分别定位到视频和音频位置。但是这个信息密密麻麻的看起来很不方便,我们去响应Response中寻找它:

打开响应Response,然后找到第四个script标签,我们能看到有个video标签,获取音频url,同样的在第四个script标签下面还有audio视频url。

步骤 5:定位音视频地址

B 站视频的音频和视频是分开存储的,需分别获取:

# 提取视频和音频的URL
video_url = info_dict["data"]["dash"]['video'][0]["baseUrl"]
audio_url = info_dict["data"]["dash"]['audio'][0]["baseUrl"]
步骤 6:下载并保存音视频
# 下载视频内容
video_content = requests.get(video_url, headers=head).content
audio_content = requests.get(audio_url, headers=head).content# 保存到本地
with open("video.wmv", "wb") as f:f.write(video_content)
with open("audio.mp4", "wb") as fp:fp.write(audio_content)

完整代码实现

import json
import fake_useragent
import requests
from lxml import etreeif __name__ == '__main__':head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"# 防盗链, "Referer": "https://www.bilibili.com/" # 网页自带的防盗链,我们告诉它从哪里向网页发送的请求,"Cookie": "buvid3=C05B40CB-6A34-98BA-39D6-53A15FB1331D09014infoc; b_nut=1721443209; b_lsid=7E252C23_190CE02D1EA; bsource=search_bing; _uuid=2A4DF7DB-1415-18110-810D10-61B6E716441309713infoc; enable_web_push=DISABLE; header_theme_version=undefined; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; buvid_fp=4737552723e0dc057e8798fde01861bc; buvid4=8B3D0C60-C137-8D41-1DA5-4FB60839F89009729-024072002-402qiK5%2F0O1ew%2BiXfV11Kg%3D%3D; home_feed_column=5; browser_resolution=1872-966; CURRENT_FNVAL=4048; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE3MDI0MjksImlhdCI6MTcyMTQ0MzE2OSwicGx0IjotMX0.rVZ9CiFYg3l5zrKtSm5jk880b2vYdADHdnTpO64kMog; bili_ticket_expires=1721702369; rpdid=|(J|)|~~|YYl0J'u~kuRRJkRu; SESSDATA=fd47394e%2C1736996380%2C3b724%2A71CjCpXPh-TmqNj96oUDW0altJZ6Iw84xOinBCAAhuZ1G-wxw0FFQR-j2_HvZPJtNgLl0SVmRDc2R6RWg3azBMUzVnVklNRGxBSGVXbWZiT2FydVNZVjM2MU1sQzkzQ3ZYMlNwLTdteUFQby0tWjlSaS1oWkVnbXVfRE8zOEd4VEFQbkNFNktMMVNRIIEC; bili_jct=643bc60a12be959fcaf2a7435e37b218; DedeUserID=152019087; DedeUserID__ckMd5=abf7b9e65385947c; sid=5voxt773"} #自己的网页登录信息# 1、urlurl = "https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d"#2、发送请求response = requests.get(url, headers=head)# 3、获取想要的数据res_text = response.text# 4、数据解析tree = etree.HTML(res_text)with open("b.html", "w", encoding="utf8") as f:f.write(res_text)base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]    #前20个字符我们不要# print(base_info)info_dict = json.loads(base_info)  #将获取到的数据变成字典形式#定位音视频位置video_url = info_dict["data"]["dash"]['video'][0]["baseUrl"]audio_url = info_dict["data"]["dash"]['audio'][0]["baseUrl"]video_content = requests.get(video_url, head).contentaudio_content = requests.get(audio_url, head).contentwith open("video.wmv", "wb") as f:f.write(video_content)with open("audio.mp4", "wb") as fp:fp.write(audio_content)

爬取成功显示:

                        

查看视频去文件夹中打开查看,由于音视频是分开的,可以通过剪映等视频剪辑软件将他们拼接在一起。

三、后续处理与注意事项

3.1 音视频合并

由于下载的音频和视频是分离的,可使用剪映、格式工厂等工具将二者合并为完整视频。

3.2 爬取注意事项

  1. 网站有反爬机制,避免频繁请求,否则可能被封禁 IP
  2. Cookie 信息具有时效性,过期后需重新获取
  3. 爬取行为需遵守网站 robots 协议,尊重版权和知识产权
  4. 本教程仅用于学习交流,请勿用于商业用途或非法爬取

四、总结

本次实战通过 Python 爬虫成功获取了 B 站视频,核心步骤与爬取图片、文本类似,关键在于:

  • 正确设置请求头信息以绕过反爬机制
  • 准确定位音视频资源的 URL 地址
  • 分别处理音频和视频的下载与保存

通过本案例可以发现,掌握爬虫技术能够帮助我们更高效地获取网络信息,但同时也需遵守网络规则和法律法规,做到合理合法使用。

http://www.dtcms.com/a/361557.html

相关文章:

  • 【RK3576】【Android14】PMIC电源管理
  • 【学Python自动化】 6.1 Python 模块系统学习笔记 (与 Rust 对照)
  • 数据结构:单链表的应用(力扣算法题)第三章
  • Windows 电脑安装dify
  • Go初级之六:接口(Interface)
  • VBA开发者的福音:让代码效率暴涨300%的终极数据结构选择指南
  • git使用详解和实战示例
  • 【学习笔记】从“两个细则”到“四遥”
  • docker安装redis,进入命令窗口基操练习命令
  • KubeBlocks for Milvus 揭秘
  • 学习 Android (十八) 学习 OpenCV (三)
  • 向量数据库概述:Faiss、Milvus、Qdrant、Chroma、Weaviate
  • AI 时代的用户体验设计:设计师会被替代,还是更值钱?
  • TCP连接状态详解/同时打开Simultaneous Open
  • 动态滑动窗口还搞不清?一文搞定动态滑动窗口 | 基础算法
  • 如何将多个Excel报表合并为一个汇总文件?
  • C++ multiset数据结构的使用情况说明
  • [界面通过zmq请求调用指定动态库函数(二)]不同动态库接口不同
  • Unity游戏打包——打包流程
  • 【开题答辩全过程】以 中华美食宝典食谱分享系统的设计与实现为例,包含答辩的问题和答案
  • HTML应用指南:利用GET请求获取MSN财经股价数据并可视化
  • 电脑没加域却能获取到IP地址
  • 力扣hot100 | 堆 | 215. 数组中的第K个最大元素、347. 前 K 个高频元素、128. 最长连续序列
  • 鞍点(Saddle Point)一文通透从曲面直觉到博弈与优化
  • 手写MyBatis第46弹:多插件责任链模式的实现原理与执行顺序奥秘--MyBatis插件架构深度解析
  • 【机器学习学习笔记】numpy基础2
  • 基于站点、模式、遥感多源降水数据融合技术应用
  • 基于单片机自行车码表/骑行运动监测
  • CVE Push Service | 高危漏洞实时情报自动化推送工具
  • Python备份实战专栏第4/6篇:Vue.js + Flask 打造企业级备份监控面板