前言
下载文件是我们生活中的一个常见的需求,因此衍生的下载工具也非常多,各有各的优势以及不足之处。作为一个编程爱好者,我喜欢去研究它们是怎么实现文件下载功能的。
我的主要使用的编程语言是 Python ,所以今天我将以 Python 为切入点带你一步步实现一个简易的文件下载器。 这个下载器将会分为几个版本
单线程不带进度条的下载器 单线程带进度条的下载器 多线程带进度条的下载器
如果你感兴趣,我们可以开始了!
懒得看过程的可以直接到文末取有详细注释的代码(开始之前这部分要看)。
开始之前
- Python版本要求
Python 3.7
如果没有安装 Python,可以参考我写的这篇安装教程
WIn 10 下搭建 Python 环境,点击原文链接看
- 需要安装的库
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