前言
下载文件是我们生活中的一个常见的需求,因此衍生的下载工具也非常多,各有各的优势以及不足之处。作为一个编程爱好者,我喜欢去研究它们是怎么实现文件下载功能的。
我的主要使用的编程语言是 Python ,所以今天我将以 Python 为切入点带你一步步实现一个简易的文件下载器。 这个下载器将会分为几个版本
单线程不带进度条的下载器
单线程带进度条的下载器
多线程带进度条的下载器
如果你感兴趣,我们可以开始了!
懒得看过程的可以直接到文末取有详细注释的代码(开始之前这部分要看)。
开始之前
- Python版本要求
Python 3.7 及以上
2. 需要安装的库
tqdm
requests
retry
multitasking
库的安装方法是:打开 cmd(命令提示符或者其他终端工具),输入以下代码
pip install tqdm requests multitasking retry
输入完毕,按 Enter 键执行代码,等待 successfully 出现即可
正文
简易版文件下载器
基础知识
使用 requests 库发起请求
# 导入requests 库
import requests
# 请求链接
url = 'https://www.baidu.com/'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
# 发起请求
response = requests.get(url, headers=headers)
# 响应状态码
response.status_code
# 200
# 响应的文本内容
response.text
'''
<!DOCTYPE html><!--STATUS OK-->\n\n\n
...
'''
# 响应内容
response.content
'''
b'<!DOCTYPE html><!--STATUS OK-->\n\n\n
...
'''
# 响应头
response.headers
'''
{'Bdpagetype': '1', 'Bdqid': '0xa4413421000728b1'
...
'''
向文件中写入网络响应内容
# 导入requests 库
import requests
# 请求链接
url = 'https://www.baidu.com/'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
# 发起请求
response = requests.get(url, headers=headers)
content = response.content
file_name = 'hello.html'
# 以 wb 的模式打开文件
with open(file_name, mode='wb') as f:
# 写入响应内容
f.write(content)
print(f'写入文件成功!文件名 {file_name}')
实例操作
通过这学习上面的基础,我们实现了一个简易的文件下载器,下面继续来测试一个下载一个文件,文件直链如下
https://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.2.8.9.exe
实例代码
# 导入requests 库
import requests
# 文件下载直链
url = 'https://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.2.8.9.exe'
# 文件名
file_name = 'BaiduNetdisk_7.2.8.9.exe'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
print('正在下载文件......')
# 发起请求
response = requests.get(url, headers=headers)
content = response.content
# 以 wb 的模式打开文件
with open(file_name, mode='wb') as f:
# 写入响应内容
f.write(content)
print(f'文件下载成功!文件名 {file_name}')
运行输出
正在下载文件......
文件下载成功!文件名 BaiduNetdisk_7.2.8.9.exe
打开代码运行目录即可看到文件:BaiduNetdisk_7.2.8.9.exe
带进度条的文件下载器
基础知识
获取文件大小 不难知道,要做一个进度条展示下载进度,我们得事先知道文件的大小以及每次写入文件的大小。还是以这个文件链接为例,展示如何获取待下载的文件大小
# 导入requests 库
import requests
# 文件下载直链
url = 'https://is