python爬虫--小白篇【爬取B站视频】

目录

一、任务分析 

二、网页分析

三、任务实现


一、任务分析 

        将B站视频爬取并保存到本地,经过分析可知可以分为四个步骤,分别是:

  1. 爬取视频页的网页源代码;
  2. 提取视频和音频的播放地址;
  3. 下载并保存视频和音频;
  4. 合并视频和音频,使用ffmpeg模块;

二、网页分析

        在分析网页前,需要明白爬取的数据是什么,由于b站的视频跟音频是分开存放的,所以我们需要分别找到视频和音频的url,然后在对其发起请求将视频和音频保存至本地;最后将两者合并在一起,才能形成完整的视频文件。

1、先登录B站,选择想要下载的视频,打开浏览器开发者模式,刷新网页,寻找数据接口;

2、经过分析,在文档下发现了一个文件,该文件源码中就存放了视频和音频的url地址,向该文件接口发起请求,将视频和音频的url地址解析出来;

3、得到该数据接口的请求url和请求参数

4、找到所需的数据接口后,先分析一下网页源码,我们发现视频url存放在一个 <script>标签下的 video下,发现音频url在 audio 下的 baseUrl中;

三、任务实现

        前期准备:编写代码前,需要大家安装一个第三方工具ffmpeg,用于合并视频和音频。

        代码实现:

"""
@Author :江上挽风&sty
@Blog(个人博客地址):https://blog.youkuaiyun.com/weixin_56097064
@File :B站视频爬取
@Time :2024/12/11 9:28
@Motto:一直努力,一直奋进,保持平常心

"""
import os
import pprint
import re

# 1、爬取视频页的网页源代码
import requests
import json
from lxml import etree
header = {
    "referer": "https://www.bilibili.com",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}

# 2、提取视频和音频的播放地址
def get_play_url(url):
    r = requests.get(url, headers=header)
    # print(r.text)
    info = re.findall('window.__playinfo__=(.*?)</script>', r.text)[0]
    video_url = json.loads(info)["data"]["dash"]["video"][0]["baseUrl"]
    audio_url = json.loads(info)["data"]["dash"]["audio"][0]["baseUrl"]
    # print(video_url)
    # print(audio_url)
    html = etree.HTML(r.text)
    filename = html.xpath('//h1/text()')[0]
    # print(filename)
    return video_url, audio_url, filename

# 3、下载并保存视频和音频
def download_files(video_url, audio_url, filename, video_path,audio_path):
    print("开始下载视频和音频")
    video_content = requests.get(video_url, headers=header).content
    audio_content = requests.get(audio_url, headers=header).content

    with open(f'{video_path}/{filename}.mp4', 'wb') as f:
        f.write(video_content)
        print("视频部分下载完毕")
    with open(f'{audio_path}/{filename}.mp3', 'wb') as f:
        f.write(audio_content)
        print("音频部分下载完毕")


# 4、合并视频和音频,使用ffmpeg模块
def combin_video_audio(filename, video_path, audio_path):
    # cmd = fr"ffmpeg -i {video_path}{filename}.mp4 -i {audio_path}{filename}.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a {video_path}\output-{filename}.mp4 -loglevel quiet"  # -loglevel quiet 表示隐藏日志,不加问题不大
    cmd = fr"D:\ApplicationsSoftware\FFmpeg\ffmpeg-7.1-full_build\ffmpeg-7.1-full_build\bin\ffmpeg -i {video_path}/{filename}.mp4 -i {audio_path}/{filename}.mp3 -c:v copy -c:a aac -strict experimental -map 0:v -map 1:a {video_path}/output-{filename}.mp4 -loglevel quiet"  # -loglevel quiet 表示隐藏日志,不加问题不大
    os.system(cmd)
    print("音频视频合并完毕")
    print("--"*10)
    os.remove(f'{video_path}/{filename}.mp4')
    os.remove(f'{audio_path}/{filename}.mp3')
    print('已删除多余的文件')


if __name__ == '__main__':
    # url = 'https://www.bilibili.com/video/BV1AA4y1D7h2/?spm_id_from=333.337.search-card.all.click&vd_source=d9407807cd22419d13fabdc976906958'
    url = 'https://www.bilibili.com/video/BV1F6qnYoEz1/?t=6&spm_id_from=333.1007.tianma.3-3-9.click'
    video_path = r'D:\ProjectCode\Spider\StudySpider07\videos'
    audio_path = r'D:\ProjectCode\Spider\StudySpider07\audio'
    video_url, audio_url, filename = get_play_url(url)
    download_files(video_url, audio_url, filename, video_path, audio_path)
    combin_video_audio(filename, video_path, audio_path)

Python 爬虫爬取 B 视频通常涉及到网页数据抓取、解析以及处理等步骤。下面简要介绍如何使用 Python 和相应的库完成这一任务: ### 选择合适的工具 对于网页爬取Python 提供了多种强大的库,如 `requests` 用于发起 HTTP 请求,`BeautifulSoup` 或 `lxml` 用于解析 HTML 页面内容。 ### 获取视频链接 首先,你需要确定你要爬取视频链接。B 视频链接一般由几个部分组成: 1. **频道ID**(Channel ID) 2. **视频ID**(Video ID) 例如,链接可能是 `/video/avxxxxxx` 的形式,其中 `'xxxxxx'` 即为视频 ID。 ### 使用 Python 进行请求和解析 #### 发起 GET 请求 使用 `requests.get()` 函数获取页面的内容。这一步主要是为了获取到包含视频信息的相关 HTML 内容。 ```python import requests from bs4 import BeautifulSoup def get_video_html(video_id): url = f'https://www.bilibili.com/video/{video_id}' response = requests.get(url) if response.status_code == 200: return response.text else: print('Failed to fetch the video page') return None ``` #### 解析页面内容 使用 `BeautifulSoup` 对获取的HTML文本进行解析,查找包含视频播放地址的标签或属性。 ```python def parse_video_url(html_text): soup = BeautifulSoup(html_text, 'html.parser') # 假设视频链接在script标签内隐藏,需要找到并提取出来 script_tag = soup.find('script', id='_playInfoScript') if script_tag is not None: play_info = eval(script_tag.string) # 将字符串转换为字典 video_url = play_info['data']['dash']['video']['baseUrl'] return video_url else: print('Video URL not found') return None ``` ### 下载视频 有了视频的实际链接,就可以下载视频内容了。这里可以使用 `requests` 的 `stream=True` 参数进行大文件下载,并通过迭代逐块读取和保存。 ```python import os def download_video(video_url, output_file): response = requests.get(video_url, stream=True) total_size_in_bytes = int(response.headers.get('content-length', 0)) progress_bar_length = 50 with open(output_file, "wb") as file: for data in response.iter_content(chunk_size=8192): file.write(data) done = int(50 * len(file.read()) / total_size_in_bytes) percent_done = (len(file.read()) / total_size_in_bytes) * 100 print(f'\rDownloading... [{("█" * done).ljust(progress_bar_length)}] {percent_done:.2f}%', end='') print() if __name__ == "__main__": video_id = 'xxxxxx' html_text = get_video_html(video_id) if html_text: video_url = parse_video_url(html_text) if video_url: filename = f'av{video_id}.mp4' download_video(video_url, filename) print(f'Successfully downloaded {filename}') else: print('Could not find a valid video URL.') else: print('Failed to fetch video content.') ``` ### 法律及伦理考虑 请注意,在进行网络爬虫活动时,务必遵守网的使用条款和法律法规。特别是从网上抓取数据前,应检查其robots.txt 文件,并确认是否允许爬虫访问相关数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值