Python爬虫--爬取哔哩哔哩(B站)短视频平台视频

这篇具有很好参考价值的文章主要介绍了Python爬虫--爬取哔哩哔哩(B站)短视频平台视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、开发工具

2、第三方库

3、实现思路

4.单个爬取B站视频

5.批量爬取B站视频

6.查找所需数据

结尾    


1、开发工具

Python3.9

pycharm

requests

和其他python内置库

2、第三方库

安装第三方库

pip install requests

3、实现思路

1.用requests发送get请求,获得下载链接

2.将下载到B站视频和音频保存到本地

3.使用ffmpeg来合并视频和音频。

4.并保存到本地。

4.单个爬取B站视频
import os
import requests
import json
import re
from bs4 import BeautifulSoup
import subprocess
from detail_video import video_bvid

# video_bvid 是一个从外部得到的单个视频ID
video_bvid = 'your-single-bvid'


class BilibiliVideoAudio:
    def __init__(self, bvid):
        self.bvid = bvid
        self.headers = {
            "referer": "https://search.bilibili.com/all?keyword=%E4%B8%BB%E6%92%AD%E8%AF%B4%E8%81%94%E6%92%AD&from_source=webtop_search&spm_id_from=333.1007&search_source=5&page=4&o=90",
            "origin": "https://search.bilibili.com",
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
            'Accept-Encoding': 'gzip, deflate, br'
        }

    def get_video_audio(self):
        # 构造视频链接并发送请求获取页面内容
        url = f'https://www.bilibili.com/video/{self.bvid}/?spm_id_from=333.337.search-card.all.click&vd_source=14378ecd144bed421affe1fe0ddd8981'
        content = requests.get(url, headers=self.headers).content.decode('utf-8')
        soup = BeautifulSoup(content, 'html.parser')

        # 获取视频标题
        meta_tag = soup.head.find('meta', attrs={'name': 'title'})
        title = meta_tag['content']

        # 获取视频和音频链接
        pattern = r'window\.__playinfo__=({.*?})\s*</script>'
        json_data = re.findall(pattern, content)[0]
        data = json.loads(json_data)

        video_url = data['data']['dash']['video'][0]['base_url']
        audio_url = data['data']['dash']['audio'][0]['base_url']

        return {
            'title': title,
            'video_url': video_url,
            'audio_url': audio_url
        }

    def download_video_audio(self, url, filename):
        # 对文件名进行清理,去除不合规字符
        filename = self.sanitize_filename(filename)
        try:
            # 发送请求下载视频或音频文件
            resp = requests.get(url, headers=self.headers).content
            download_path = os.path.join('D:\\video', filename)  # 构造下载路径
            with open(download_path, mode='wb') as file:
                file.write(resp)
            print("{:*^30}".format(f"下载完成:{filename}"))
        except Exception as e:
            print(e)

    def sanitize_filename(self, filename):
        # 定义不合规字符的正则表达式
        invalid_chars_regex = r'[\"*<>?\\|/:,]'

        # 替换不合规字符为空格
        sanitized_filename = re.sub(invalid_chars_regex, ' ', filename)

        return sanitized_filename

    def merge_video_audio(self, video_path, audio_path, output_path):
        """
        使用ffmpeg来合并视频和音频。
        """
        try:
            command = [
                'ffmpeg',
                '-y',  # 覆盖输出文件如果它已经存在
                '-i', video_path,  # 输入视频路径
                '-i', audio_path,  # 输入音频路径
                '-c', 'copy',  # 复制原始数据,不进行转码
                output_path  # 输出视频路径
            ]
            subprocess.run(command, check=True)
            print(f"视频和音频合并完成:{output_path}")
        except subprocess.CalledProcessError as e:
            print(f"合并失败: {e}")


def main():
   try:
        # 只处理一个 bvid
        bilibili = BilibiliVideoAudio(video_bvid)
        video_audio_info = bilibili.get_video_audio()
        
        title = video_audio_info['title']
        video_url = video_audio_info['video_url']
        audio_url = video_audio_info['audio_url']
        
        processed_videos_path = 'D:\\processed_videos'
        if not os.path.exists(processed_videos_path):
            os.makedirs(processed_videos_path)
        
        video_filename = f"{title}.mp4"
        audio_filename = f"{title}.mp3"
        output_filename = f"{title} - combined.mp4"
        
        video_file_path = os.path.join('D:\\video', video_filename)
        audio_file_path = os.path.join('D:\\video', audio_filename)
        output_file_path = os.path.join(processed_videos_path, output_filename)
        
        bilibili.download_video_audio(video_url, video_filename)  # 下载视频
        bilibili.download_video_audio(audio_url, audio_filename)  # 下载音频
        bilibili.merge_video_audio(video_file_path, audio_file_path, output_file_path)  # 合并视频和音频
        
        # Optional: Delete the separate files after merge
        # os.remove(video_file_path)
        # os.remove(audio_file_path)
        
    except Exception as ex:
        print(f"Failed to process video/audio for {video_bvid}: {ex}")

main()
    

5.批量爬取B站视频
# 批量爬取b站上的视频
import os
import requests
import json
import re
from bs4 import BeautifulSoup
import subprocess
from detail_video import video_bvid


class BilibiliVideoAudio:
    def __init__(self, bvid):
        self.bvid = bvid
        self.headers = {
            "referer": "https://search.bilibili.com/all?keyword=%E4%B8%BB%E6%92%AD%E8%AF%B4%E8%81%94%E6%92%AD&from_source=webtop_search&spm_id_from=333.1007&search_source=5&page=4&o=90",
            "origin": "https://search.bilibili.com",
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
            'Accept-Encoding': 'gzip, deflate, br'
        }

    def get_video_audio(self):
        # 构造视频链接并发送请求获取页面内容
        url = f'https://www.bilibili.com/video/{self.bvid}/?spm_id_from=333.337.search-card.all.click&vd_source=14378ecd144bed421affe1fe0ddd8981'
        content = requests.get(url, headers=self.headers).content.decode('utf-8')
        soup = BeautifulSoup(content, 'html.parser')

        # 获取视频标题
        meta_tag = soup.head.find('meta', attrs={'name': 'title'})
        title = meta_tag['content']

        # 获取视频和音频链接
        pattern = r'window\.__playinfo__=({.*?})\s*</script>'
        json_data = re.findall(pattern, content)[0]
        data = json.loads(json_data)

        video_url = data['data']['dash']['video'][0]['base_url']
        audio_url = data['data']['dash']['audio'][0]['base_url']

        return {
            'title': title,
            'video_url': video_url,
            'audio_url': audio_url
        }

    def download_video_audio(self, url, filename):
        # 对文件名进行清理,去除不合规字符
        filename = self.sanitize_filename(filename)
        try:
            # 发送请求下载视频或音频文件
            resp = requests.get(url, headers=self.headers).content
            download_path = os.path.join('D:\\video', filename)  # 构造下载路径
            with open(download_path, mode='wb') as file:
                file.write(resp)
            print("{:*^30}".format(f"下载完成:{filename}"))
        except Exception as e:
            print(e)

    def sanitize_filename(self, filename):
        # 定义不合规字符的正则表达式
        invalid_chars_regex = r'[\"*<>?\\|/:,]'

        # 替换不合规字符为空格
        sanitized_filename = re.sub(invalid_chars_regex, ' ', filename)

        return sanitized_filename

    def merge_video_audio(self, video_path, audio_path, output_path):
        """
        使用ffmpeg来合并视频和音频。
        """
        try:
            command = [
                'ffmpeg',
                '-y',  # 覆盖输出文件如果它已经存在
                '-i', video_path,  # 输入视频路径
                '-i', audio_path,  # 输入音频路径
                '-c', 'copy',  # 复制原始数据,不进行转码
                output_path  # 输出视频路径
            ]
            subprocess.run(command, check=True)
            print(f"视频和音频合并完成:{output_path}")
        except subprocess.CalledProcessError as e:
            print(f"合并失败: {e}")


def main():
    # 批量获取多个视频的bid
    bvids = [
        #      0             1              2               3
        "BV187411i7zw","BV1wi4y1E7E6","BV1Gz4y1X7vh","BV1Lh411d7Lw",    # 1
        #      4             5              6               7
        "BV1mJ411D7QB","BV1Z5411w7Xb","BV1op4y167kS","BV1Mp4y1p7Ck",    # 2
        #      8             9              10              11
        "BV1nJ41187Zy","BV1qb4y1Z7JK","BV1f5411379u","BV1kt4y1Q792",    # 3
        #      12             13             14             15
        "BV1Qy4y1e7kk","BV1T7411T7q6","BV1k64y1k7QL","BV1J5411c7Rw",    # 4
        #      16             17              18            19
        "BV1Db4y1y7yL","BV1cC4y1878T","BV11y4y1z7bY","BV1LJ411S7ML",    # 5
        #      20             21              22            23
        "BV1X54y1L7mt","BV1S64y1D7HM","BV1rK4y1d7mZ","BV1b64y1y7AE",    # 6
        #      24             25              26            27
        "BV1TK411F7MU","BV1HN411f7Em","BV1QA411x7KB","BV1pM4y1K7Ao",    # 7
        #      28             29             30             31
        "BV1os4y1s7Aw","BV1sv411e71L","BV1xZ4y1A7gn","BV1E3411B7Q3",    # 8
        #      32             33              34            35
        "BV1664y1d78D","BV1xv41177MR","BV13q4y1S7y1","BV1kJ411H7y8",    # 9
        #      36             37              38            39
        "BV1Cq4y1Z7pM","BV1Jf4y147U7","BV1az4y117h4","BV1gy4y1h7wS",    # 10
        ]


    for bvid in bvids:
        try:
            bilibili = BilibiliVideoAudio(bvid)
            video_audio_info = bilibili.get_video_audio()

            title = video_audio_info['title']
            video_url = video_audio_info['video_url']
            audio_url = video_audio_info['audio_url']

            bilibili.download_video_audio(video_url, f"{title}.mp4")  # 下载视频
            bilibili.download_video_audio(audio_url, f"{title}.mp3")  # 下载音频
        except Exception as ex:
            print(f"Failed to download video/audio for {bvid}: {ex}")

    processed_videos_path = 'D:\\processed_videos'
    if not os.path.exists(processed_videos_path):
        os.makedirs(processed_videos_path)
    
    # 注意:B站和其他短视频平台的视频不同,需要分别下载视频和音频,最后将视频和音频拼接到一块
    for bvid in bvids:
        try:
            bilibili = BilibiliVideoAudio(bvid)
            video_audio_info = bilibili.get_video_audio()

            title = video_audio_info['title']
            video_url = video_audio_info['video_url']
            audio_url = video_audio_info['audio_url']

            video_filename = f"{title}.mp4"
            audio_filename = f"{title}.mp3"
            output_filename = f"{title} - combined.mp4"

            video_file_path = os.path.join('D:\\video', video_filename)
            audio_file_path = os.path.join('D:\\video', audio_filename)
            output_file_path = os.path.join(processed_videos_path, output_filename)

            bilibili.download_video_audio(video_url, video_filename)  # 下载视频
            bilibili.download_video_audio(audio_url, audio_filename)  # 下载音频
            bilibili.merge_video_audio(video_file_path, audio_file_path, output_file_path)  # 合并视频和音频

            # Optional: Delete the separate files after merge
            # os.remove(video_file_path)
            # os.remove(audio_file_path)

        except Exception as ex:
            print(f"Failed to process video/audio for {bvid}: {ex}")


main()
6.查找所需数据

   1)bvid    b站视频爬取,python爬虫,python,爬虫,开发语言

   2)referer / origin / User-Agent / Accept-Encoding

   b站视频爬取,python爬虫,python,爬虫,开发语言

结尾    

希望大家喜欢我的分享!!!

b站视频爬取,python爬虫,python,爬虫,开发语言文章来源地址https://www.toymoban.com/news/detail-836530.html

到了这里,关于Python爬虫--爬取哔哩哔哩(B站)短视频平台视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Python的B站(哔哩哔哩)视频评论采集,可破解反爬手段,想爬几条爬几条

    它通过输入Bilibili视频的av号、BV号或链接,然后使用指定的cookie和请求头信息发送HTTP请求来获取视频的评论数据。然后,它将评论数据解析为CSV格式,并保存到指定的文件中。 具体实现过程如下: 导入所需的库:requests用于发送HTTP请求,os用于操作文件路径,time用于处理时

    2024年01月18日
    浏览(55)
  • 微信小程序仿哔哩哔哩视频组件

    微信小程序仿照哔哩哔哩(包含源码获取) 效果如下图 项目为简单的小程序代码片段,不包含后端,只通过原生的小程序语言开发,使用官方原生的 video,没有使用任何的第三方的组件库, 需要的小伙伴可以自己获取项目的源代码,引入项目即可使用 视频组件video是在官方

    2024年02月02日
    浏览(38)
  • 哔哩哔哩视频合并 B站缓存视频合并 安卓版 音视频合并 基于ffmpeg

    此软件是为了帮助网友合并哔哩哔哩缓存视频,Android上将bilibili缓存视频合并导出为mp4,你可以将它理解为一个专用的格式工厂,并不涉及破解相关内容,仅仅用于学习技术交流,严禁用于商业用途,如有侵权请联系我删档,对你带来困惑和不便我深感抱歉。 合并(导出)B站缓

    2024年02月02日
    浏览(68)
  • 哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义

    目录 一、复制如下代码 二、在B站视频播放页面进入控制台 (一)以火狐浏览器为例          (二)以谷歌浏览器为例 三、将复制的代码粘贴到下方输入框,并 回车Enter 即可 (一)以火狐浏览器为例          (二)以谷歌浏览器为例  四、然后就可以了 (该代码用于

    2024年02月11日
    浏览(42)
  • Websocket获取B站直播间弹幕教程 — 哔哩哔哩直播开放平台

    进入 哔哩哔哩直播开放平台:https://open-live.bilibili.com/ 注册申请个人开发者认证,获得access_key_id 和 access_key_secred 进入bilibili创作者服务中心 - 创建项目 - 获得项目ID( app_id ) 官方文档:https://open-live.bilibili.com/document/eba8e2e1-847d-e908-2e5c-7a1ec7d9266f 注意:Post参数需要签名加密,

    2024年02月08日
    浏览(44)
  • 超级实用--解决大问题了--如何设置哔哩哔哩-实现3,4倍速视频播放---工作技巧001

      这个太实用了,为什么....因为我平时看教程的时候,如果速度过慢,就会影响效率,因为很多的技术点 都已经知道是怎么回事,很熟悉了,想跳过吧,又想听听熟悉一下,而如果一直用2倍速播放,又浪费时间 但是播放器上只能设置2倍速播放,那么怎么弄呢?可以这样设置...总于知道怎么

    2024年02月12日
    浏览(55)
  • 【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字

    【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字 目录 1. 打开edge浏览器或谷歌浏览器 2. 安装油猴插件 3. 安装字幕插件 4. 打开哔哩哔哩视频播放页面,点击字幕         首先在想要下载之前需要先判定视频是否有云字幕,如果有才可以下载,如果

    2024年02月12日
    浏览(37)
  • Python爬虫:爬取各种视频

    一、先看效果: 包括短视频 中视频 长视频等。 短视频(2到3分钟时间): 中视频(10分钟左右时间): 长视频(20分钟左右时间): 二、爬取规则: 2.1:短视频爬取: 爬取该网页视频: 方法一:F12键 找到 network 然后media,数据包中的url,复制粘贴看是否能打开该视频,如果能打

    2024年04月13日
    浏览(38)
  • 使用python爬虫爬取bilibili视频

    可以使用 Python 爬虫框架如 Scrapy 来爬取 Bilibili 的视频。首先需要了解 Bilibili 网站的构造,包括数据是如何呈现的,然后构建请求来获取所需的数据。同时需要考虑反爬虫措施,可能需要使用代理 IP 和 User-Agent 等方法来绕过反爬虫机制。 这里提供一个简单的爬取视频标题的

    2024年02月08日
    浏览(39)
  • 哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

    打开ffMpeg官网 选择window=Windows builds from gyan.dev 打开https://www.gyan.dev/ffmpeg/builds/ 这里是上面提取的下载链接如果过期不能用自己去官网下 上面下载的FFmpeg是绿色软件,下载解压到你的常用软件安装目录即可,然后进入bin复制全路径配置下系统环境变量即可 https://github.com/PHP-F

    2024年02月14日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包