快速编程之HTTP多线程下载器 | 您所在的位置:网站首页 › python多线程下载文件 › 快速编程之HTTP多线程下载器 |
\ 栏目编辑 。 。 。 。 。 。 。ket@h。 。 。 。 。 ● _ 盖-_巨曼 — _匠翟 __ _lllI L 上网冲浪免不了下载各种各样的软件, 因此几 乎每台电脑都安装 了专业的下载工具。 从最早流行 国内的网络蚂蚁到网际快车, 再到现在的影音传送 带和 迅雷,以及各种点对点下载工具B T、E M u l 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. 1 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 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 8 — 4493d83a ” Accept-Ranges:bytes Content — Length: 1 576 Content — Type: image/gif 仔细看看, 可以发现发送请求时, 对我们编写 下载器重要的信息只有几个GET、 img/Iogo gif和 HTTP/1. 1, 分别对应发送请求的方式、 要下载的文 件名和HTTP协 议版本。 Host头部信息是必须的, 而 其他的头部信息只是服务器用来分析客户请求的。 在回复应答里, 重要的是HTTP状态码和Content — Length字段。 这里的 状态码为200表示请求成功, Content — Length表示实际数据的大小。 那么我们如何进行多线程下载呢?很简单, 只 要在请求中加入一个Range头部的字段 |
CopyRight 2018-2019 实验室设备网 版权所有 |