首页 > 编程语言 >python+requests爬取B站视频保存到本地

python+requests爬取B站视频保存到本地

时间:2024-04-30 17:35:36浏览次数:24  
标签:视频 title python 爬取 video file print path requests

import os
import datetime

from django.test import TestCase

# Create your tests here.

import requests
import re
import json
import subprocess
from concurrent.futures import ThreadPoolExecutor


def download_video(url):
    # file_path = 'django3+drf+Vue3前后端分离/'
    headers = {
        "Cookie": "buvid3=C6ED37CC-DC0F-D1B0-BA82-231C0731E3C971724infoc; b_nut=1698137871; _uuid=xxxx-9398-E7CA-10B95-xxxx; buvid_fp=xxxx; buvid4=xxxx-93C3-xxxx-xxxx-0F1D34771D4274275-023102416-aL0NYo%xxxx%3D%3D; header_theme_version=CLOSE; DedeUserID=345707270; DedeUserID__ckMd5=7506c67cb7588c20; enable_web_push=ENABLE; iflogin_when_web_push=1; CURRENT_FNVAL=4048; rpdid=|(kYRk|Ruuk)0J'uYm)~JRmml; home_feed_column=5; PVID=1; FEED_LIVE_VERSION=V8; browser_resolution=1920-908; SESSDATA=0aff21e1%2C1729848907%2Ca2f88%2A42CjDHEfsdfE5mZ9GMKVTmTqG3aIO7dew8YUpjK9-z7OXOdBOYjXPi4FVQgJEVacJ0UQkSVk4xTGRnLTEzOHF3TDktYlhEa2JDS3ZFV0FfYjlHZ3ctdzhlWlVDZmhpUFZsMEJCSTZtQkxUU1FiRC1IV1pMenVFV1JxcVhCc2sxNEtCemgyY1dtQVZBIIEC; bili_jct=768662980741f061aedc30f722129d8b; sid=7tqiav60; bp_t_offset_345707270=925256601212813351; b_lsid=DBC104B55_18F27B3DA65; share_source_origin=COPY; bsource=share_source_copy_link; hit-dyn-v2=1; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTQ2MTczMzMsImlhdCI6MTcxNDM1ODA3MywicGx0IjotMX0.qfWz2oLOuJvDWHCM6Cgwl0SEVjpN6LkOreX8ApoYD4k; bili_ticket_expires=1714617273",
        "Origin": "https://www.bilibili.com",
        "Referer": "https://www.bilibili.com/video/BV1ZR4y1U7Qz?p=2",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
    }

    response = requests.get(url, headers=headers)
    html = response.text
    # print(response.text)
  # 获取视频集的名称作为存放视频的目录 file_path = re.findall(r'data-title="(.*?)" title', html)[0].replace(' ', '') print(file_path) # 检查目录是否存在 if not os.path.exists(file_path): # 如果目录不存在,创建目录 os.makedirs(file_path) print(f"Directory '{file_path}' created successfully.") else: print(f"Directory '{file_path}' already exists.") file_path = file_path + '/'
  # 获取每集视频的名称作为文件名 title = re.findall(r'<title data-vue-meta="true">(.*?)_哔哩哔哩_bilibili</title>', html)[0].replace(' ', '') print(title)
  # 获取视频信息部分 video_info = re.findall(r'<script>window.__playinfo__=(.*?)</script>', html)[0] print(video_info) json_data = json.loads(video_info)
  # 从视频信息部分提取出视频和音频的地址(B站的视频和音频是分开的) video_url = json_data['data']['dash']['video'][0]['baseUrl'] audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] print(video_url) print(audio_url)
  # 获取视频和音频的内容并保存成avi和mp3文件 video_content = requests.get(video_url, headers=headers).content audio_content = requests.get(audio_url, headers=headers).content with open(file_path + title + '.avi', 'wb') as video: video.write(video_content) with open(file_path + title + '.mp3', 'wb') as audio: audio.write(audio_content)   # 使用ffmpeg工具将视频和音频文件合并成一个文件 cmd = f"ffmpeg -i {file_path}{title}.avi -i {file_path}{title}.mp3 -c:v copy -c:a aac -strict experimental {file_path}{title}.mp4" subprocess.run(cmd, shell=True) os.remove(f'{file_path}{title}.avi') os.remove(f'{file_path}{title}.mp3')
# 多线程的方式爬取(速度要快很多) def main(bvid, start, end): urls = [f'https://www.bilibili.com/video/{bvid}/?p={i}' for i in range(start, end + 1)] print(urls) with ThreadPoolExecutor(max_workers=10) as executor: executor.map(download_video, urls) if __name__ == '__main__':
# 爬取不同的视频合集时,只需要修改bvid的值即可, bvid的值在视频地址中可以获取https://www.bilibili.com/video/BV1Rs4y127j8/?spm_id_from=333.999.0.0&vd_source=6cdcd08f45ddc987f3f46f8ee8f80b9e bvid = 'BV1Sz4y1o7E8' starttime = datetime.datetime.now() print(starttime)
  # start和end是开始和结束爬取的集数,如视频集有20集,start为1,end为20 start = 1 end = 56 main(bvid, start, end) endtime = datetime.datetime.now() print(endtime) result_time = endtime - starttime print(result_time)

 

标签:视频,title,python,爬取,video,file,print,path,requests
From: https://www.cnblogs.com/sprouts/p/18168445

相关文章

  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-42-强大的可视化追踪利器Trace
    1.简介在我们日常执行自动化测试工作的过程中,经常会遇到一些偶发性的bug,但是因为bug是偶发性的,我们不一定每次执行都能复现,所以我们在测试执行的时候,追踪用例执行就变得非常重要了。playwright提供了一个PlaywrightTraceViewer工具来追踪测试执行,这是一个GUI工具,我们可以通过它......
  • python airllm调用本地大模型
    官方demohttps://github.com/lyogavin/Anima/blob/main/air_llm/examples/run_all_types_of_models.ipynb这里使用百川本地fromairllmimportAirLLMLlama2,AutoModelMAX_LENGTH=128#默认会去抱脸网下载,很慢,而且需要xx上网#model=AutoModel.from_pretrained("baichua......
  • python匿名函数、内置函数以及各类高阶函数等
    【一】匿名函数【1】函数的分类#【1】正规函数deflogin():...login()#【2】匿名函数(无名函数)#语法:lambda参数:表达式#lambda:匿名函数的关键字#参数可以放位置参数以及关键字参数...#表达式:其实本质上是返回值【2】定义匿名函数Python使用lamb......
  • C/C++、Java 与 Python 中未初始化变量的处理比较
    在C/C++中,未初始化的变量的值是不确定的,可能是随机的。 在Python中,如果直接使用未初始化的变量,会引发NameError异常。Python要求变量在使用前必须进行赋值或初始化。 而在Java中,直接使用未初始化的局部变量会导致编译错误,必须先对变量进行初始化。 C++和Java在字......
  • Python调用Graylog APi 分析401错误登录日志
    ret_lst处理完成后是一个list,内容如下:[{'c_ip':'10.10.202.139','uname':'ee'},{'c_ip':'10.10.202.139','uname':'tt'},{'c_ip':'192.168.195.131','uname......
  • Python: unZip
     importosimportsocketimportstructfromunidecodeimportunidecodeimportreimportjsonimportrequestsfrombs4importBeautifulSoupimportgzipimportzipfilefrompathlibimportPathfromzipfileimportZipFileclassCzip:"""......
  • python
                                搜索复制......
  • pip debug —— 查看当前版本的python解释器支持的wheel包类型
    在pip安装依赖时,我们可能会遇到依赖包无法下载成功的情况解决办法:去寻找对应版本的wheel包下载到本地搜寻wheel包网址:以python-ladp为例格式示例:python_ldap-2.5.1-cp27-cp27m-win32.whl2.5.1代表版本号cp27代表支持python27版本win32代表支持系统位数可以通过pipdeb......
  • 关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序
    背景:哈希码参数校验防参数篡改。前端下发接口时对参数按约定秘钥和逻辑进行加密,后端在获取到请求后对请求参数以同样的秘钥和逻辑加密计算得出哈希值,再与请求的哈希值对比,如果不一致则证明参数被篡改。前端代码:对json对象进行了按key排序1letdataTmp=this.de......
  • Python-与-TensorFlow2-生成式-AI(五)
    Python与TensorFlow2生成式AI(五)原文:zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76译者:飞龙协议:CCBY-NC-SA4.0第十二章:用生成式人工智能玩视频游戏:GAIL在之前的章节中,我们已经看到如何使用生成式人工智能来生成简单的(受限玻尔兹曼机器)和复杂的(变分自动......