从0到1手把手教你实现一个 Python 多线程下载器(一)

前言

下载文件是我们生活中的一个常见的需求,因此衍生的下载工具也非常多,各有各的优势以及不足之处。作为一个编程爱好者,我喜欢去研究它们是怎么实现文件下载功能的。

我的主要使用的编程语言是 Python ,所以今天我将以 Python 为切入点带你一步步实现一个简易的文件下载器。 这个下载器将会分为几个版本

单线程不带进度条的下载器 单线程带进度条的下载器 多线程带进度条的下载器

如果你感兴趣,我们可以开始了!

懒得看过程的可以直接到文末取有详细注释的代码(开始之前这部分要看)。


开始之前


  1. Python版本要求

Python 3.7

如果没有安装 Python,可以参考我写的这篇安装教程

WIn 10 下搭建 Python 环境,点击原文链接看

  1. 需要安装的库

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


上一篇:从0到1手把手教你实现一个 Python 多线程下载器(一)


下一篇:分享3个提升效率的方法