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

发布于:2025-09-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、爬虫基础概述

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 etree

if __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、url
    url = "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).content
    audio_content = requests.get(audio_url, head).content


    with 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 地址
  • 分别处理音频和视频的下载与保存

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