python 爬取某站视频

文章讲述了作者如何利用Python爬虫技术从B站获取视频的音频和视频流,然后进行下载并合并成完整的MP4文件,作为大学期末作业的一部分。代码中包含了获取响应、解析JSON、保存文件以及合并音视频的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

也是感觉好久都没有写博客了,主要是因为学业繁忙(其实是想多摆烂一会儿。。。)

在这里插入图片描述
距离暑假还有一个月,各科老师也开始布置相关的期末考试内容了。。。。。。

最近英语老师给我们留了一个期末作业(大学牲又要忙起来了),内容是拍摄一个短视频,既然是视频那素材是少不了的(我还是负责剪辑),于是我们组员开始在某站上寻找素材,找到视频发现下载不了视频,本来是想着既然下载不了,那就直接录屏吧。But,我又觉得既然学了爬虫那就要把它利用起来,顺便就当复习一下相关知识(也是好久没有写爬虫了)。

接下来让我们可以如何爬取某站上的视频吧,
话不多说直接上代码:

import requests,json,pprint,re
import os
from moviepy.editor import *

""" 获取url响应体 """
def getResponse(url):
    # 设置请求头
    # referer:必须要设置,否则会返回403没有权限访问,加上这段就代表我们是从哪个网页请求过来的
    # User-Agent:设置浏览器标识
    headers = {
        'referer':'https://www.bilibili.com/',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
    }
    """发起get请求"""
    response = requests.get(url=url,headers=headers)
    return response

""" 解析响应体 """
def parseResponse(url):
    # 获取url响应体
    response = getResponse(url)
    # 用正则表达式取出返回的视频数据
    html_data = re.findall('<script>window.__playinfo__=(.*?)</script>',response.text)[0]
    # 解析成json数据
    JsonData = json.loads(html_data)
    # 获取视频标题
    videoTitle= re.findall('<title data-vue-meta="true">(.*?)</title>',response.text)[0]
    # 获取音频
    audioUrl = JsonData['data']['dash']['audio'][0]['baseUrl']
    # 获取视频
    videoUrl = JsonData['data']['dash']['video'][0]['baseUrl']
    # 封装视频信息
    videoInfo = {
        'videoTitle':videoTitle,
        'audioUrl':audioUrl,
        'videoUrl':videoUrl,
    }
    print("获取Response信息成功!")
    return videoInfo

""" 保存视频 """
def videoSave(fileName,audioUrl,videoUrl):
    # 获取音频和视频的二进制内容
    audioResponse = getResponse(audioUrl).content
    videoResponse = getResponse(videoUrl).content
    # 写入文件
    with open('./video/'+fileName+'.mp3',mode='wb') as f:
        f.write(audioResponse)
        f.close()
    with open('./video/'+fileName+'.mp4',mode='wb') as f:
        f.write(videoResponse)
        f.close()
    print("保存视频成功!")

""" 合并音频和视频 """
def AvMerge(Mp3Name,Mp4Name,savePath):
    print("开始合并音频和视频.........")
    video = VideoFileClip(Mp4Name)
    audio = AudioFileClip(Mp3Name)
    video_merge = video.set_audio(audio)
    video_merge.write_videofile(savePath)
    os.remove(Mp3Name)
    os.remove(Mp4Name)
    print("合并成功!")
def main():
    url = input("请输入B站视频url地址:")
    videoBaseUrl = 'D:\\desktop\\Code\\pythonCode\\B站视频爬取\\'
    videoInfo = parseResponse(url)
    videoSave(videoInfo['videoTitle'],videoInfo['audioUrl'],videoInfo['videoUrl'])
    fileName = videoInfo['videoTitle']
    AvMerge(videoBaseUrl+'video\\'+fileName+'.mp3',videoBaseUrl+'video\\'+fileName+'.mp4',videoBaseUrl+'\\video\\'+'merge'+fileName+'.mp4')
if __name__ == '__main__':
    main()

以上就是爬取视频的代码,基本上每个地方都有注释,相信有爬虫基础的小伙伴都能看懂,一个视频会爬了,那批量爬取就不是什么难事了,我这里的是单视频爬取,有兴趣的小伙伴也可以自己实现一个批量视频爬取。

在这里插入图片描述

### 使用 Python 爬虫抓取 B 用户全部上传的视频列表及内容 为了实现这一目标,可以采用 Selenium 库配合 ChromeDriver 来模拟真实浏览器的行为,从而绕过一些反爬机制。具体来说: 通过 `selenium` 调用 `webdriver.Chrome()` 创建 WebDriver 对象,并设置相应的选项以隐藏自动化痕迹[^3]。 ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 设置无头模式(不打开浏览器窗口) chrome_options.add_argument('--headless') driver = webdriver.Chrome(options=chrome_options) ``` 接着向指定用户的个人空间页面发起请求,这里假设已知某位 UP 主的空间 ID 或者用户名作为 URL 参数的一部分。 ```python url = "https://space.bilibili.com/{uid}/video".format(uid="UP主ID") driver.get(url) ``` 由于动态加载的原因,初次加载可能无法一次性获取到所有的视频条目,因此需要滚动到底部触发更多内容加载直至不再有新项目出现为止。 ```python last_height = driver.execute_script("return document.body.scrollHeight") while True: # 向下滚动 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待一段时间让页面完成渲染 time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height ``` 当所有可见区域内的视频都已经加载完毕之后,就可以解析 HTML 文档提取所需的信息了。通常情况下,每个视频的相关属性会被封装在一个个 div 容器内,可以通过 XPath 或 CSS Selector 的方式定位这些节点并读取出其内部的文字、链接等内容。 ```python videos = [] elements = driver.find_elements_by_css_selector('.video-item.matrix') for element in elements: title = element.find_element_by_class_name('title').text link = element.find_element_by_tag_name('a').get_attribute('href') videos.append({ 'title': title, 'link': link }) ``` 最后关闭驱动程序释放资源。 ```python driver.quit() ``` 上述方法能够有效地收集特定用户发布的大部分公开视频资料,不过需要注意的是,在实际操作过程中应当遵循各平台的服务条款以及法律法规的要求,合理合法地利用网络信息。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值