Python编程|用Python编写一个支持断点续传、显示实时网速的通用下载器。
【摘要】
关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求
通过上篇文章 JS逆向|获取某电影解析网站的真实视频地址,获取到了视频的真实播放地址:
https://v3.douyinv...
关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求
通过上篇文章 JS逆向|获取某电影解析网站的真实视频地址,获取到了视频的真实播放地址:
https://v3.douyinvod.com/6bb5df6aa38a2bc8fc696a19e39caacf/63215cb6/video/tos/cn/tos-cn-ve-0030/cd3ee0c450e64851bb871ad245f6a83c/?filename=1.mp4
现在使用Python写一个脚本,将其下载下来。
2. 分析
一般来说,一个文件下载的网址是静态的,不存在反爬(需要鉴权的除外),因此不需要去格外研究反爬。
思路:
-
使用requests库来进行下载
-
通过设置headers['range'] 字段来告诉程序从哪里开始下载,即断点续传
-
下载块 除以 文件总大小 即为 下载百分百
-
下载块 除以 时间差值 即为 当前网速
3. 源代码
通过一番摸索和调试,写出了下面的代码:
# coding: utf-8
import re
import requests
from pathlib import Path
from time import time, perf_counter
from fake_useragent import UserAgent
def download_file_from_url(dl_url, file_name, headers):
file_path = Path(__file__).parent.joinpath(file_name)
if file_path.exists():
dl_size = file_path.stat().st_size
else:
dl_size = 0
headers['range'] = f'bytes={dl_size}-'
response = requests.get(dl_url, stream=True, headers=headers)
print('\n\n' + '*' * 30 + '下载信息' + '*' * 30)
total_size = int(response.headers['content-length'])
print(
f'\n\n文件名称:{file_name}\t\t已下载文件大小:{dl_size / 1024 / 1024:.2f}M\t\t文件总大小:{total_size/1024/1024:.2f}M\n\n')
start = perf_counter()
data_count = 0
count_tmp = 0
start_time = time()
with open(file_path, 'ab') as fp:
for chunk in response.iter_content(chunk_size=512):
data_count += len(chunk)
now_pross = (data_count / total_size) * 100
mid_time = time()
if mid_time - start_time > 0.1:
speed = (data_count - count_tmp) / 1024 / (mid_time - start_time)
start_time = mid_time
count_tmp = data_count
print(
f"\rDownloading.........{now_pross:.2f}%\t{data_count//1024}Kb/{total_size//1024}Kb\t当前下载速度:{speed:.2f}Kb/s", end='')
fp.write(chunk)
end = perf_counter()
diff = end - start
speed = total_size/1024/diff
print(
f'\n\n下载完成!耗时:{diff:.2f}秒, 平均下载速度:{speed:.2f}Kb/s!\n文件路径:{file_path}\n')
if __name__ == '__main__':
url = 'https://v3.douyinvod.com/6bb5df6aa38a2bc8fc696a19e39caacf/63215cb6/video/tos/cn/tos-cn-ve-0030/cd3ee0c450e64851bb871ad245f6a83c/?filename=1.mp4'
#filename = url.rpartition('/')[-1]
filename = "复仇者联盟4.mp4"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', }
download_file_from_url(url, filename, headers)
初始下载:
暂停后再下载:
这里有个小问题,下载进度没有将已经下载好的没有计算在内。后面再研究了。
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/126863457
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)