- 分片下载原理:
如100M文件,我们每次下载1M之后持续写到文件中,直到超出限度就停止写入(具体细节已在源码中进行了说明)
def fileDownload(homeurl, url, title, typ):
"""
视频及音频分片下载
:param homeurl: B站地址
:param url: 下载链接
:param title: 视频名称
:param typ: 类型: 0(视频) 1(音频)
:return:
"""
headers = getHtmlHeaders
# 加入返回服务器地址
headers.update({'Referer': homeurl})
if typ == 0:
print("视频信息下载中····")
filename = "./" + title + ".flv"
else:
print("音频信息下载中····")
filename = "./" + title + ".mp3"
# 指定每次下载1M的数据
begin = 0
end = 1024 * 1024 - 1
flag = 0
while True:
# 添加请求头键值对,写上 range:请求字节范围
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
# 获取视频分片
res = requests.get(url=url, headers=headers, verify=False)
if res.status_code != 416:
# 响应码不为416时有数据,由于我们不是b站服务器,最终那个数据包的请求range肯定会超出限度,所以传回来的http状态码是416而不是206
begin = end + 1
end = end + 1024 * 1024
else:
headers.update({'Range': str(end + 1) + '-'})
res = requests.get(url=url, headers=headers, verify=False)
flag = 1
with open(filename, 'ab') as fp:
fp.write(res.content)
fp.flush()
if flag == 1:
fp.close()
break
- 视频合并:(下载后的文件分为:.fiv的视频文件;.mp3的音频文件)
下载格式工厂,通过视频音频混流工具进行合并