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:解析视频信息
- 使用 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 爬取注意事项
- 网站有反爬机制,避免频繁请求,否则可能被封禁 IP
- Cookie 信息具有时效性,过期后需重新获取
- 爬取行为需遵守网站 robots 协议,尊重版权和知识产权
- 本教程仅用于学习交流,请勿用于商业用途或非法爬取
四、总结
本次实战通过 Python 爬虫成功获取了 B 站视频,核心步骤与爬取图片、文本类似,关键在于:
- 正确设置请求头信息以绕过反爬机制
- 准确定位音视频资源的 URL 地址
- 分别处理音频和视频的下载与保存
通过本案例可以发现,掌握爬虫技术能够帮助我们更高效地获取网络信息,但同时也需遵守网络规则和法律法规,做到合理合法使用。