编程语言
首页 > 编程语言> > 用python爬取B站视频

用python爬取B站视频

作者:互联网

最近刚学了爬虫,拿B站练了下手。

学习了@鑫xing这篇,他已经讲的很详细了,感谢作者。

我只是对其中一些地方做了简化,还有一些失效的部分做了修改,欢迎探讨。

下面是完整的代码

import requests
from lxml import html
import re
import json
import os


def get_title_json(url):
    head = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67'
    }
    r = requests.get(url, headers=head)

    #通过xpath获取视频的标题
    tree = html.fromstring(r.text)
    title = str(tree.xpath('//*[@id="viewbox_report"]/h1/@title')[0])
    #除去标题中的奇怪字符,这些字符会影响文件名的保存,产生未知错误
    s = ['\n', ',', '。', ' ', '—', '”', '?', '“', '(', ')', '、','|']
    for i in s:
        title = title.replace(i, '') 
    print(f'视频标题:"{title}"')
    
    #通过re获取包含视频和音频地址的json字段
    json_data = re.findall('<script>window.__playinfo__=(.*?)</script>', r.text)[0]
    json_data = json.loads(json_data)

    audio_url = json_data['data']['dash']['audio'][0]['backupUrl'][0]
    print('已提取到音频地址')
    video_url = json_data['data']['dash']['video'][0]['backupUrl'][0]
    print('已提取到视频地址')
    return title,audio_url,video_url


def download(title,audio_url,video_url):
    #这里的head加上Referer,避免让网站发现自己是爬虫
    head = {
                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67',
                  'Referer':url
    }
    print('开始下载音频')
    r_audio = requests.get(url=audio_url, headers=head)
    audio_data = r_audio.content
    with open(title+'.mp3', mode='wb') as f:
        f.write(audio_data)
    print('音频下载完成')

    print('开始下载视频')
    print('下载中,请稍等...')
    r_video = requests.get(url=video_url, headers=head)
    video_data = r_video.content
    with open(title+'.mp4', mode='wb') as f:
        f.write(video_data)
    print('视频下载完成')

def audio_video_add(title):
    print('开始合成')
    cmd=f' ffmpeg  -i {title}.mp4 -i {title}.mp3 -acodec copy -vcodec copy bili_{title}.mp4'
    #调用cmd执行ffmpeg程序来合并音频和视频
    os.system(cmd) 
    #删除原来的音频和视频
    os.remove(title+'.mp4')
    os.remove(title+'.mp3')
    print('合成结束')
    
if __name__ == "__main__":
    while True:
        value=input('输入该视频的有效链接地址:(输入quit退出)')
        if value=='quit':
            break
        else:
            url=value
            title,audio_url,video_url=get_title_json(url)   
            download(title,audio_url,video_url) 
            audio_video_add(title)

 


这里借助了一个视频处理工具ffmpeg,需要先下载安装,这里是ffmpeg的安装教程,然后记得加入环境变量。如果运行时提示“ffmpeg不是系统内部或外部的命令”,重启一下电脑即可。我在这里困了四五个小时,原来重启一下就好了,哎。。

标签:视频,title,python,爬取,url,video,print,audio,data
来源: https://www.cnblogs.com/luodu/p/16289539.html