美文网首页
真·从零开始写个下载器(一)-最简单的下载功能

真·从零开始写个下载器(一)-最简单的下载功能

作者: TK丰 | 来源:发表于2020-11-03 21:51 被阅读0次

利用requests先写个最简单的下载器

什么是下载器我就不多说了,直接上代码,我以下载示意图为例

如果不懂requests是什么或者怎么使用,可参考真·从零开始使用Requests制作简单爬虫

# 加载requests库
import requests
# 示例图URL,是我公众号图片的地址
url = 'https://mmbiz.qpic.cn/mmbiz_jpg/KrUbaYdkiaBSKIhqlfLOia8deLy59zCg9CBv7hjIDt69nVbeypEhUYLPknziaicCFYlaWMm5S5eC4aOyx70wWRyrcQ/0?wx_fmt=jpeg'
# 使用get模式就可以了
r = requests.get(url)
# 将图片保存为picture.png。
# 由于r.content是byte类型,所以要用wb的模式进行写入
with open('picture.png', 'wb') as f:
  f.write(r.content)

是不是很简单,下载一张图片就这么简单,但是我们要做的是做一个下载器,而不是一个简单的图片下载(很多教程也只是下载一个图片就结束了)

进一步思考

下载一张图片简单,是因为图片本身的大小比较小,所以可以用这种方式很快把一张图片下载完。让我们想一下,如果我们下载的东西是很大(假设为100M)或者下载的东西很多(下载100张图片)。我们来看一下,用这种方式的效果

# 加载requests库
import requests
# 示例图URL,是我公众号图片的地址
url = 'https://mmbiz.qpic.cn/mmbiz_jpg/KrUbaYdkiaBSKIhqlfLOia8deLy59zCg9CBv7hjIDt69nVbeypEhUYLPknziaicCFYlaWMm5S5eC4aOyx70wWRyrcQ/0?wx_fmt=jpeg'
# 创建一个有100个链接的列表,模拟要下载100张图片
urlList = [url]*100
n = 0
for i in urlList:
    # 使用get模式就可以了
    r = requests.get(i)
    # 用str(n)+'picture.png'来创造出100张不同命名的图片
    with open(str(n)+'picture.png', 'wb') as f:
        f.write(r.content)
    n += 1

通过模拟我们要下载100张图片,借此会发现,requests按顺序下载这样的会速度会很慢,我们是不是可以在同一时间下载多个图片呢?

接下来下载大文件百度网盘安装包

# 加载requests库
import requests
# 就试试下载百度网盘吧
url = 'http://wppkg.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_3.4.1.dmg'
# stream代表使用字节流方式下载
r = requests.get(url, stream = True)
# 因为使用的是字节流下载,所以可以每接收到1k的时候,就写入到文件中,这样就可以避免把整个文件都写入到内存后再写入文件。
with open('BaiduNetdisk_mac_3.4.1.dmg', 'wb') as f:
    for chunk in r.iter_content(chunk_size = 1024):
                f.write(chunk)

这次下载没有加入进度条,但是你也可以体会到下载速度很慢(没有到达网速上限),有没有什么方法可以加速?如果把下载文件拆成N份,同时下载的话,会不会更容易达到网速上限?

TO DO

为了让整个下载器更好用点,我们需要了解一下多进程、多线程以及协程的概念

Thank you for attention

To Be Continued

喜欢的点个在看呗

相关文章

  • 真·从零开始写个下载器(一)-最简单的下载功能

    利用requests先写个最简单的下载器 什么是下载器我就不多说了,直接上代码,我以下载示意图[%5Bhttps:...

  • 真·从零开始写个下载器(三)-填坑

    前言 由于事前太多,本来想一点点填坑的,现在只能直接把坑填了。P.S.其实还剩余了部分想做的内容没有做完,但基础的...

  • python 导入导出文件

    1、最简单的文件下载功能 2、更合理的文件下载功能 3、文件下载功能再次优化 4、直接导出Excel表格 5、导出...

  • 真·从零开始写个下载器(二)-加入多线程

    前言 上次写了一个很简单的下载器,这次就引入一下多线程,直接上代码 对线程不了解的可看看我之前写的简单讲讲进程、线...

  • kotlin-PRDownloader下载器开源库

    因为项目需要做一个下载的功能,虽然目前有众多的下载器,但是简单好用,而且支持断点的下载器,先推荐下这个吧,PRDo...

  • 简易下载器-Downloader

    功能简介 使用RxJava和Okhttp实现的简单下载器,支持: 1.普通下载 2.断点续传 3.下载进度回调 以...

  • linux中wget命令的使用方法

    wget工具体积小,功能完善,支持断点下载,支持FTP和HTTP下载方式,支持代理服务器,设置方便简单。 下载单个...

  • iOS 中的下载实现

    下载功能是ios 开发中必须掌握的一个功能,今天简单的介绍一下下载功能的实现; 下载功能的实现 每次下载的字节数是...

  • 基于Docker实现迅雷远程下载

    迅雷远程下载是指可以远程控制下载器创建下载任务,下载器可以是家里的NAS、PC、HPC,也可以是支持该功能的路由器...

  • ASDownload下载器实现下载功能

    ASDownload是一个提供下载功能的库,返回信息全面,使用简单,提供的功能满足绝大数应用的需求。github下...

网友评论

      本文标题:真·从零开始写个下载器(一)-最简单的下载功能

      本文链接:https://www.haomeiwen.com/subject/lhapmktx.html