基于Python爬虫下载视频的方法

1、前言

程序使用见文章末尾。

之前修改文章后审核一直不通过,故此文章消失了一段时间。

今天使用这个工具下载视频时出现问题:文件名中包含非法字符导致无法下载。

遂再次修改代码解决了上述问题并完善了下载视频时画质不高的问题。

希望这次投稿能审核通过,感谢审核大大。

2、准备工作

首先需要获取视频的下载地址。

通过浏览器检查网页元素发现,在 head 头的第三个 script 标签内含有视频和音频的下载链接,对,音视频是分开的,所以下载后还需要合并成完整视频。

在这里插入图片描述
在json视图中很清晰地可以看到视频和音频的下载链接,由于画质不同和备份的需要,存在多个,这里选择了第一个backupUrl

在这里插入图片描述
直接访问这个下载链接是无法下载的,经过测试发现需要在请求参数中添加referer头方可下载。

而这样下载的视频的画质是480P,想下载更高画质,还需要添加cookie。这和在没登录账号的情况下看不了高画质的情况是一样的。

对于下载后音视频的合并,使用的工具是ffmpeg。

3、获取数据

通过requests库向目标站点发起请求,请求需包含header等信息,以伪装成是浏览器发出请求。如果服务器能正常响应,会得到一个Response,即含有视频下载链接的html代码。

def send_request(url):
    response = requests.get(url=url, headers=headers)
    return response

4、解析内容

对于得到的html代码,可以用正则表达式等进行解析,把视频名称,音频、视频的下载地址提取出来。

def get_data(html_data):
    title = re.findall('<title data-vue-meta="true">(.*?)</title>',
                       html_data)[0].replace("_哔哩哔哩_bilibili", "")
    rstr = r"[\/\\\:\*\?\"\<\>\|]"
    file_name = re.sub(rstr, "_", title)
    json_data = re.findall(
        r'<script>window.__playinfo__=(.*?)</script>', html_data)[0]
    json_data = json.loads(json_data)
    audio_url = json_data["data"]["dash"]["audio"][0]["backupUrl"][0]
    video_url = json_data["data"]["dash"]["video"][0]["backupUrl"][0]
    data = [file_name, audio_url, video_url]
    return data

5、保存数据

通过访问下载链接,将音视频下载到本地并保存。

def get_audio_only(file_name, audio_url):
    print('正在下载 "' + file_name + '"的音频...')
    audio_data = send_request(audio_url).content
    print('完成下载 "' + file_name + '"的音频!')
    with open(file_name + ".mp3", "wb") as f:
        f.write(audio_data)


def get_video_only(file_name, video_url):
    print('正在下载 "' + file_name + '"的视频...')
    video_data = send_request(video_url).content
    print('完成下载 "' + file_name + '"的视频!')
    with open(file_name + ".m4s", "wb") as f:
        f.write(video_data)

6、合并音视频

把分开的音频和视频进行合并。

def get_complete_video(file_name, audio_url, video_url):
    get_audio_only(file_name, audio_url)
    get_video_only(file_name, video_url)
    os.rename(file_name + ".mp3", "0.mp3")
    os.rename(file_name + ".m4s", "0.mp4")
    print('正在合并 "' + file_name + '"的音频和视频...')
    subprocess.call(
        "ffmpeg -i 0.mp4 -i 0.mp3 -c:v copy -c:a aac -strict experimental output.mp4", shell=True)
    os.rename("output.mp4", file_name + ".mp4")
    os.remove("0.mp3")
    os.remove("0.mp4")
    print('完成合并 "' + file_name + '"的音频和视频!')
    print("视频下载已完成!")

7、打包成exe

先要安装Pyinstaller,直接在cmd使用pip命令

pip install pyinstaller 

然后,把ffmpeg,python文件以及图标放置到同一文件夹下。

执行如下命令,进行打包

Pyinstaller -F -i bilibili.ico bilibili_download.py

执行完毕会发现当前目录多了几个文件夹,打开其中名为dist的文件夹,里面含有exe应用程序。这里要把exe文件移动到上一级目录,即ffmpeg的同级目录。多余的文件和文件夹可以删除,最终只需要exe文件和ffmpeg工具。

在这里插入图片描述

8、程序运行

点击exe应用程序即可运行。

① 输入网站cookie(若不需要下载高画质视频这一步可以跳过);

关于如何获取自己的cookie:

在登录的情况下,来到需要下载的那个视频的播放页面,鼠标右键点击网页,再点击选项列表的最后一项——检查,打开浏览器的审查元素工具。来到Application部分,在左侧Cookies选中b站地址的情况下,右键点击cookies列表的任意一个key,下图以SESSDATA为例,再点击“Show Requests With This Cookie”来到Network部分。

在这里插入图片描述
从Headers中就可以找到自己的Cookie,选中复制。

在这里插入图片描述
然后就可以输入cookie:

在这里插入图片描述

② 输入视频对应的播放链接;

在视频播放页面复制链接再输入即可:

在这里插入图片描述

③ 选择下载选项。

输入选项前的数字即可,支持仅下载音频(当没有vip想要下载音乐到本地时比较好用)、仅下载视频(没有声音,只要画面)和下载完整视频。

在这里插入图片描述

等待下载。下载好了可以在exe程序所在的目录下找刚下载的文件。

在这里插入图片描述


程序下载:见评论
(注意不要删除ffmpeg.exe文件)

  • 19
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值