快速编程之HTTP多线程下载器 您所在的位置:网站首页 python多线程下载文件 快速编程之HTTP多线程下载器

快速编程之HTTP多线程下载器

#快速编程之HTTP多线程下载器| 来源: 网络整理| 查看: 265

栏目编辑

。ket@h。

_

盖-_巨曼

_匠翟

__

_lllI

上网冲浪免不了下载各种各样的软件,

因此几

乎每台电脑都安装

了专业的下载工具。

从最早流行

国内的网络蚂蚁到网际快车,

再到现在的影音传送

带和

迅雷,以及各种点对点下载工具B

T、E

等,真是五花八门:Lin

ux/Uni

x下也有一些强大的

命令行下载工具,比如wget等。但工具虽多.

了都是多线程断点续传的下载器而已,

今天我们就

用最简单的方式自己编写一款较为

完善的多线程下

载工具。

首先我们需要了解用Python代码编写一个下载

代码是

多么的容易!

以下几行简单代码就可以实现

最基本的下载功能。

其中u

rIIib为

一个专门处理HTTP事务的类库

URL为要下载的文件路径SaveFile为文件

的本地保

存地址urIIib.

urlopen

(URL)

用于打开一个URL对象,

通过返回对象response来控

{ ̄IJHTTP数据之后open

函数创建本地文

件.通过response的read()方法来获

取要下载的数据.最后写入文件并关

闭文件句柄.

即下载文件完毕!

够简单的吧?Python给我们提供了许多功能强

大方便的类库,

使我们达到自己目的的方式非常简

单明了!

但这作为一个功能完善的下

载器是远远不够

的,

比如没有多线程支持,

读取下载数据的时候

全部都放在内存,

以及

没有任何错误的处理等。

针对第2个不足.

我们稍加改进.

可以得到下面的

这样做的好

处是每次读取1

00.

024个字节后

就写入文件.

不必将整个文件都放在内存中.

到下载大文件时,

好处会很明显!

当无法再读取

数据的时候就跳出whiI

e循环.

然后关闭文件,

下载成功!

下面我们正式进入多线程下载器编写的阶段!

为了更好

地理解下载的流程和原理,

我们有必要先

了解HTTP的相关协议。

事实上,

难道你对迅

雷是如

何将

灰鸽子

下载下来的没有一点兴趣吗7

访问Web ̄E务器上面的资源一

般使用三个HTTP

命令Post、Get和Head

Post用于提交数据.比如

你要注册黑防论坛会员,那么浏览器发送的就是

Post命令Head命令平时用得最

少.先不管它Get

命令很重要,浏览网页、下载文件都要用它.因此

我们这里只关注

Get命令。

HTTP的版本也很重要。现在用得最多的HTTP

协议是1.1版.

有不少网站还在用1.0或0.9版

的.千万不要以为所有人都用1.1版了,新浪用的

是1.oK.不信用WSE抓包试试.嘿嘿!之所以要判

断HTTP协议版本,是因

为只有11.

1版才支持多线程

和断点续传,

因此在进行下载的时候必须进行版本

的判

断。

一个合法的单线程HTTP下载请求如下。

ke.r.c

om.n

维普资讯

http://www.cqvip.com

-)栏目编辑)

。k。t)

。ket@h。

。ke『。

。m。

对应的回复应答如

下。

HTTP/1.1

20o

OK

Date:TL

D.13

Mar

2087

12:33:41

GMT

Server:Apache/1.3.27

Cache

Control:

max

age=315360O0O

Expires:

Fri.

10

Mar

2O17

12:33:41

GMT

Last

Modified:Sat,

17

Jun

2006

10:

23:

54

GMT

ETag:

7a89a8

62

4493d83a

Accept-Ranges:bytes

Content

Length:

576

Content

Type:

image/gif

仔细看看,

可以发现发送请求时,

对我们编写

下载器重要的信息只有几个GET、

img/Iogo

gif和

HTTP/1.

1,

分别对应发送请求的方式、

要下载的文

件名和HTTP协

议版本。

Host头部信息是必须的,

其他的头部信息只是服务器用来分析客户请求的。

在回复应答里,

重要的是HTTP状态码和Content

Length字段。

这里的

状态码为200表示请求成功,

Content

Length表示实际数据的大小。

那么我们如何进行多线程下载呢?很简单,

要在请求中加入一个Range头部的字段



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有