吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1317|回复: 21
上一主题 下一主题
收起左侧

[Python 原创] 【爬虫】爬取b站目标视频

  [复制链接]
跳转到指定楼层
楼主
Derik 发表于 2024-9-19 19:05 回帖奖励
内附接口,修改目标url即可下载目标视频
使用者需自行下载ffmpeg并修改代码中的路径
(仅做学习,如有侵权,请私信)
[Python] 纯文本查看 复制代码
import os
import re
import json
import subprocess
import requests
import fake_useragent
from lxml import etree
 
ua = fake_useragent.UserAgent().random
headers = {
    'referer': 'https://www.bilibili.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
 
 
def get_url(url):
    # 爬取视频页网页源代码
    r = requests.get(url, headers=headers)
 
    # 提取视频和音频的播放地址
    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']
    html = etree.HTML(r.text)
    filename = html.xpath('//h1/text()')[0]
    return filename, video_url, audio_url
 
 
# 下载并保存音频和视频
def download(name, video_url, audio_url):
    video_content = requests.get(video_url, headers=headers).content
    audio_content = requests.get(audio_url, headers=headers).content
    path = os.getcwd()
    with open(f'{path}/{name}.mp4', 'wb') as f:
        f.write(video_content)
        print("已下载视频部分")
    with open(f'{path}/{name}.mp3', 'wb') as f:
        f.write(audio_content)
        print("已下载音频部分")
 
 
# 合并音频和视频
def combine(name):
    path = os.getcwd()
    cmd = [
        r"C:\download_solftware\ffmpeg-7.0.2-full_build\bin\ffmpeg",   //自行下载,并修改此处路径
        "-i", f"{path}\\{name}.mp4",
        "-i", f"{path}\\{name}.mp3",
        "-c:v", "copy",
        "-c:a", "aac",
        "-strict", "experimental",
        f"{path}\\output-{name}.mp4"
    ]
    subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    print("已完成合并")
    # 删除源文件
    os.remove(f"{path}\\{name}.mp4")
    os.remove(f"{path}\\{name}.mp3")
 
 
if __name__ == '__main__':
    url = 'https://www.bilibili.com/video/BV1Tf421i7fV/?spm_id_from=333.1007.tianma.4-2-12.click'
    name, video_url, audio_url = get_url(url)
    download(name, video_url, audio_url)
    combine(name)

免费评分

参与人数 5吾爱币 +5 热心值 +5 收起 理由
HyOct + 1 + 1 我很赞同!
Aerolith + 1 + 1 谢谢@Thanks!
xxxcool + 1 + 1 谢谢@Thanks!
woshimengxin123 + 1 + 1 热心回复!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
hui2002 发表于 2024-9-21 17:02
我尝试了优化了下代码,楼主请指教!!

import os
import re
import json
import requests
from lxml import etree

# 使用fake_useragent库生成随机的User-Agent
from fake_useragent import UserAgent

# 初始化User-Agent
ua = UserAgent().random

# 设置请求头
headers = {
    'User-Agent': ua
}

def get_url(url):
    # 爬取视频页网页源代码
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 确保请求成功

    # 提取视频和音频的播放地址
    info = re.search(r'window.__playinfo__=(.*?)</script>', response.text)
    if not info:
        raise ValueError("无法找到播放信息")

    video_url = json.loads(info.group(1))['data']['dash']['video'][0]['baseUrl']
    audio_url = json.loads(info.group(1))['data']['dash']['audio'][0]['baseUrl']
    html = etree.HTML(response.text)
    filename = html.xpath('//h1/text()')[0].strip()  # 使用strip()去除可能的空白字符

    return filename, video_url, audio_url

def download(name, video_url, audio_url):
    # 下载并保存音频和视频
    for url, file_type in [(video_url, 'mp4'), (audio_url, 'mp3')]:
        content = requests.get(url, headers=headers).content
        with open(f'{os.getcwd()}/{name}.{file_type}', 'wb') as f:
            f.write(content)
            print(f"已下载{name}的{file_type}部分")

def combine(name):
    # 合并音频和视频
    cmd = [
        r"C:\download_solftware\ffmpeg-7.0.2-full_build\bin\ffmpeg",  # 确保路径正确
        "-i", f"{os.getcwd()}/{name}.mp4",
        "-i", f"{os.getcwd()}/{name}.mp3",
        "-c:v", "copy",
        "-c:a", "aac",
        "-strict", "experimental",
        f"{os.getcwd()}\\output-{name}.mp4"
    ]
    try:
        subprocess.run(cmd, check=True)
        print("已完成合并")
    except subprocess.CalledProcessError as e:
        print(f"合并失败: {e}")
    finally:
        # 删除源文件
        os.remove(f"{os.getcwd()}\\{name}.mp4")
        os.remove(f"{os.getcwd()}\\{name}.mp3")

if __name__ == '__main__':
    url = 'https://www.bilibili.com/video/your_video_id'  # 替换为实际的视频ID
    name, video_url, audio_url = get_url(url)
    download(name, video_url, audio_url)
    combine(name)
沙发
89684828 发表于 2024-9-19 21:44
3#
jinwenqing 发表于 2024-9-21 12:18
4#
gxchyf1168 发表于 2024-9-21 16:04
url是怎么找的呀
6#
三滑稽甲苯 发表于 2024-9-22 11:36
哔哩哔哩下载器有很多现成的,但是研究一下原理也是很不错的
7#
GGxiaoyuboy 发表于 2024-9-22 12:34
牛啤,大佬!
8#
darkf 发表于 2024-9-23 07:16
太实用了
9#
 楼主| Derik 发表于 2024-9-23 10:42 |楼主

你在网页打开b站具体视频的时候链接就是
10#
cyzhaojia 发表于 2024-9-23 11:10
跟着学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 09:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表