用python爬取B站视频

用python爬取B站视频

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

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

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

下面是完整的代码

import requestsfrom lxml import htmlimport reimport jsonimport osdef 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_urldef 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不是系统内部或外部的命令”,重启一下电脑即可。我在这里困了四五个小时,原来重启一下就好了,哎。。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部