python urllib2 下载大小

Posted

技术标签:

【中文标题】python urllib2 下载大小【英文标题】:python urllib2 download size 【发布时间】:2012-08-06 14:45:38 【问题描述】:

我想用 urllib2 下载一个文件,同时我想显示一个进度条.. 但是我怎样才能获得实际下载的文件大小?

我当前的代码是

ul = urllib2.urlopen('www.file.com/blafoo.iso')
data = ul.get_data()

open('file.iso', 'w').write(ul.read())

如果从网站接收到整个下载,则首先将数据写入文件。 如何访问下载的数据大小?

感谢您的帮助

【问题讨论】:

你试过urllib.urlretrieve吗? 【参考方案1】:

这是一个使用了不起的 requests 库和 progressbar 库的文本进度条示例:

import requests
import progressbar

ISO = "http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts"
CHUNK_SIZE = 1024 * 1024 # 1MB

r = requests.get(ISO)
total_size = int(r.headers['content-length'])
pbar = progressbar.ProgressBar(maxval=total_size).start()

file_contents = ""
for chunk in r.iter_content(chunk_size=CHUNK_SIZE):
    file_contents += chunk
    pbar.update(len(file_contents))

这是我在运行时在控制台中看到的:

$ python requests_progress.py
 90% |############################   |

编辑:一些注释:

并非所有服务器都提供内容长度标头,因此在这种情况下,您无法提供百分比 如果文件很大,您可能不想读取内存中的整个文件。您可以将块写入文件或其他位置。

【讨论】:

我喜欢进度条库!不过,将整个 ISO 映像读入内存并不是一个好主意。当缺少 Content-length 标头(不需要服务器发送)时,还需要一些额外的处理。 添加了关于内存中内容长度和文件的注释 让它与进度条一起工作。内容长度区分大小写:) 现在它非常棒!再次感谢【参考方案2】:

您可以使用 urllib2 的info 函数返回the meta-information of the page,然后您可以使用getheaders 访问Content-Length

比如我们来计算Ubuntu 12.04 ISO的下载大小

>>> info = urllib2.urlopen('http://mirror01.th.ifl.net/releases//precise/ubuntu-12.04-desktop-i386.iso')
>>> size = int(info.info().getheaders("Content-Length")[0])
>>> size/1024/1024
701
>>>

【讨论】:

【参考方案3】:
import urllib2
with open('file.iso', 'wb') as output: # Note binary mode otherwise you'll corrupt the file
    with urllib2.urlopen('www.file.com/blafoo.iso') as ul:
        CHUNK_SIZE = 8192
        bytes_read = 0
        while True:
            data = ul.read(CHUNK_SIZE)
            bytes_read += len(data) # Update progress bar with this value
            output.write(data)
            if len(data) < CHUNK_SIZE: #EOF
                break

【讨论】:

以上是关于python urllib2 下载大小的主要内容,如果未能解决你的问题,请参考以下文章

Python3.X如何下载安装urllib2包 ?

Python3.X如何下载安装urllib2包 ?

如何使用 Python urllib2 下载分块数据

第5章 网页下载器和urllib2模块

python3.4没有 urllib2

Python爬虫_urllib2的使用