使用python下载视频

 python下载视频!👍

46151fd7ded3440eb4871112c9c0c69d.png

  运行代码输入连接爬取视频 直接上代码


# encoding: utf-8
 
'''
爬取b站视频
'''
 
import requests
import json
import re
import os
 
 
class BilibiliVideoSpider(object):
    def __init__(self, url, output_root=''):
        self.url = url
        if not os.path.isdir(output_root):
            output_root =  os.path.abspath(os.path.dirname(__file__))
        self.output_root = output_root
        self.headers = {
            'Accept': '*/*',
            'Accept-Language': 'en-US,en;q=0.5',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
        }   # 定义请求头
 
    def _match(self, text, pattern):
        match = re.search(pattern, text)
        if match is None:
            print('this pattern was not matched !')
        return json.loads(match.group(1))
 
    def getHtml(self):
        try:
            response = requests.get(url=self.url, headers=self.headers)  # 发请求,拿数据 (获取响应对象)
            print(f'status_code: {response.status_code}')
            if response.status_code == 200:
                return response
        except RequestException:
            print('html reques error !')
 
    def parseHtml(self, response):
        playinfo = self._match(response.text, '__playinfo__=(.*?)</script><script>')          # 视频详情json
        initial_state = self._match(response.text, r'__INITIAL_STATE__=(.*?);\(function\(\)') # 视频内容json
 
        video_url = playinfo['data']['dash']['video'][0]['baseUrl']                        # 视频分多种格式,直接取分辨率最高的视频 1080p
        audio_url = playinfo['data']['dash']['audio'][0]['baseUrl']                        # 取音频地址
        video_name = initial_state['videoData']['title']                                   # 取视频名字
        return video_url, audio_url, video_name
 
    def video_audio_merge(self, video_src, audio_src, video_dst):
        '''使用ffmpeg单个视频音频合并'''
        import subprocess
        command = 'ffmpeg -i %s_video.mp4 -i %s_audio.mp4 -c copy %s.mp4 -y -loglevel quiet' % (
            video_src, audio_src, video_dst)
        subprocess.Popen(command, shell=True)
 
    def downloadVideo(self, video_url, audio_url, video_name):
        self.headers.update({"Referer": self.url})
        print('开始下载视频: ')
        video_content = requests.get(video_url, headers=self.headers)
        audio_content = requests.get(audio_url, headers=self.headers)
        print('%s视频大小:' % video_name, video_content.headers['content-length'])
        print('%s音频大小:' % video_name, audio_content.headers['content-length'])
 
        # 下载视频
        received_video = 0
        video = f'{self.output_root}/video.mp4'
        with open(video, 'ab') as output:
            while int(video_content.headers['content-length']) > received_video:
                self.headers['Range'] = 'bytes=' + str(received_video) + '-'
                response = requests.get(video_url, headers=self.headers)
                output.write(response.content)
                received_video += len(response.content)
 
        # 下载音频开始
        audio_content = requests.get(audio_url, headers=self.headers)
        received_audio = 0
        audio = f'{self.output_root}/audio.mp4'
        with open(audio, 'ab') as output:
            while int(audio_content.headers['content-length']) > received_audio:
                self.headers['Range'] = 'bytes=' + str(received_audio) + '-'
                response = requests.get(audio_url, headers=self.headers)
                output.write(response.content)
                received_audio += len(response.content)
        print('视频下载完成')
 
        video_dst =  f'{self.output_root}/download.mp4'
        self.video_audio_merge(video, audio, video_dst)
        print(f'下载的视频: {video_dst}')
        os.remove(video)
        os.remove(audio)
 
 
    def video_audio_merge(self, video_src, audio_src, video_dst):
        '''使用ffmpeg单个视频音频合并'''
        cmd = f'ffmpeg -y -i {audio_src} -i {video_src} -vcodec copy -acodec aac -strict -2 -q:v 1 {video_dst}'
        print('execute cmd:', cmd)
        os.system(cmd)
        # subprocess.Popen(command, shell=True)
 
    def run(self):
        response = self.getHtml()
        video_url, audio_url, video_name = self.parseHtml(response)
        self.downloadVideo(video_url, audio_url, video_name)
 
def demo():
    # url = 'https://www.bilibili.com/video/BV1Q5411p7bz?from=search&seid=14643382716113842219'
    url=input('请输入视频地址:')
    b = BilibiliVideoSpider(url)
    b.run()
 
if __name__ == '__main__':
    demo()

然后就保存到当前路径下的文件里了 👍

2d71c321ad8a4b378692b0b66ac3e1fc.png

 

 

eb7ff59eb1934daaa2966f1aba2c605d.jpg

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z_Xshan

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值