`
stone2oo6
  • 浏览: 26101 次
社区版块
存档分类
最新评论

Python札记1-HTTP Download

阅读更多
# -*- coding: utf-8 -*-
__author__ = 'gull'

import os, urllib2, log_factory
from urlparse import urlsplit

def get(url, filePath, fileName = None, buffer = 16 * 1024):
    log = log_factory.getLogger()
    log.info("send http request to %s", url)

    def writefile(fsrc, fdst, totalLength):
        """copy data from file-like object fsrc to file-like object fdst"""
        if not totalLength:
            totalLength = "?"
        else:
            totalLength = float(totalLength)
        bytesRead = 0.0
        while 1:
            buf = fsrc.read(buffer)
            if not buf:
                break
            fdst.write(buf)

            bytesRead += len(buf)
            if totalLength != "?":
                log.info("%s: %.02f/%.02f kb (%d%%)" % (
                    fileName,
                    bytesRead / 1024.0,
                    totalLength / 1024.0,
                    100 * bytesRead / totalLength
                    ))
            else:
                log.info("%s: %.02f/? kb (?%%)" % (
                    fileName,
                    bytesRead / 1024.0
                    ))

    def getFileName(openUrl):
        if 'Content-Disposition' in openUrl.info():
            # If the response has Content-Disposition, try to get filename from it
            cd = dict(map(
                lambda x: x.strip().split('=') if '=' in x else (x.strip(), ''),
                openUrl.info().split(';')))
            if 'filename' in cd:
                filename = cd['filename'].strip("\"'")
                if filename: return filename
            # if no filename was found above, parse it out of the final URL.
        return os.path.basename(urlsplit(openUrl.url)[2])

    def getFileLength(openUrl):
        return openUrl.info().getheader("Content-Length")

    r = urllib2.urlopen(urllib2.Request(url), timeout = 120) #timeout is 120s
    try:
        fileName = fileName or getFileName(r)
        fullfileName = "%s%s%s" % (filePath, os.path.sep, fileName)
        totalLength = getFileLength(r)
        log.info("write response date to %s", fullfileName)
        with open(fullfileName, 'wb') as f:
            writefile(r, f, totalLength)

        return fileName, totalLength, fullfileName
    finally:
        r.close()

    log.info("http request finished.")

 

参数说明:

  • url:即下载路径,如http://apache.etoak.com/tomcat/tomcat-7/v7.0.20/bin/apache-tomcat-7.0.20.tar.gz
  • filePath:下载文件保存的文件夹
  • fileName:下载后保存的文件名,可选参数。若为空,则会却reponse header中的filename信息(如下图)继续判空,则取url后缀名(如:apache-tomcat-7.0.20.tar.gz)

  • buffer:下载缓冲区大小,默认16k

 

可继续加入以下特性:

  • 支持代理
  • 文件分块,多线程下载
  • 异步下载,回调机制
  • ...
  • 大小: 19.6 KB
0
1
分享到:
评论

相关推荐

    python-devel-2.7.5-68.el7.x86_64.rpm python-2.7.5-68.el7.x86_64.rpm

    标题中的"python-devel-2.7.5-68.el7.x86_64.rpm"和"python-2.7.5-68.el7.x86_64.rpm"是两个重要的软件包,它们与Python编程语言在Linux环境中的开发和运行紧密相关。这些文件是针对Red Hat Enterprise Linux 7 ...

    python-2.7.5 CentOS、redhat可安装

    python-2.7.5-89.el7.x86_64.rpm python-devel-2.7.5-89.el7.x86_64.rpm python-iniparse-0.4-9.el7.noarch.rpm python-libs-2.7.5-89.el7.x86_64.rpm python-pycurl-7.19.0-19.el7.x86_64.rpm python-urlgrabber-...

    python-devel-2.7.5-34.el7.x86_64.zip

    1. **编写Python C扩展**:如果你需要编写使用C或C++实现性能关键部分的Python模块,`python-devel` 提供了必要的头文件和库,使得你可以调用Python的API来创建这样的扩展。 2. **编译Python第三方库**:很多Python...

    python-3.12.1-amd64安装包

    1. **启动安装程序**:运行"python-3.12.1-amd64.exe",用户会被引导到安装向导界面。 2. **选择安装类型**:用户可以选择自定义安装或典型安装。典型安装会自动安装Python及其默认组件,而自定义安装允许用户选择要...

    python-ldap windows 预编译包

    在调试工程的时候发现需要django-auth-ldap,但还依赖python_ldap包,在windows上装这些包费老鼻子劲,csdn上找呢又不全,收分还多贵的,因此找到了之后将python3.7-11的包都给大家提供,不好意思挣点分,因为有些...

    ms-python.python-2024.2.1.vsix

    ms-python.python-2024.2.1.vsix

    Python安装包下载python-3.8.2-amd64.exe.zip

    文件名为"python-3.8.2-amd64.exe"的可执行程序是Python的安装程序,双击即可启动安装过程。 在安装Python时,有几点需要注意: 1. **选择安装路径**:你可以自定义Python的安装位置,但通常推荐保持默认设置,...

    python-3.11.2-amd64安装包

    python-3.11.2-amd64安装包

    python-3.13.0-amd64.exe

    python-3.13.0-amd64.exe

    python_docx-0.8.10-py2.py3-none-any.whl

    原来是通过命令行下载的docx安装包还没有完全兼容python3,估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包...

    python-3.12.0-embed-amd64.zip

    Python 3.12.0-embed-amd64.zip 是一个针对64位Windows系统的Python轻量级打包文件,它包含了一些基本的Python运行时组件,使得开发者可以在不安装完整Python环境的情况下运行Python程序。这个压缩包尤其适用于那些...

    python-3.8.0-embed-amd64.zip

    4. `libcrypto-1_1.dll` 和 `libssl-1_1.dll`:这些是OpenSSL库的动态链接文件,用于加密和安全套接层(SSL)通信。它们对于Python进行HTTPS请求和其他加密操作至关重要。 5. `sqlite3.dll`:这是SQLite数据库引擎...

    python-3.10.0-amd64.exe

    python-3.10.0-amd64.exe

    解决ubuntu14.04 python-catkin-pkg无法安装的问题

    最近ubuntu14.04出了问题,pkg-catkin-pkg无法下载,我7月底重装了一次Ubuntu14.04,安装ros lidigo时报错,依赖python-catkin-pkg,但它不会被安装,我刚开始发现这个问题时试过换源,重装系统均不成功,后面去官方...

    python安装包python-3.7.7-amd64.exe.zip

    Python是非常流行的程序脚本语言,广泛用于互联网应用,科学计算,人工智能等领域。本下载包为本人从官网下载的,主要供国内网速慢的用户下载,版本为Python-3.7.7-amd64.exe Windows 64位安装包

    python-3.8.8-amd64.exe

    python-3.8.8-amd64.exe

    python-3.9.2-amd64.exe

    python-3.9.2-amd64官方安装包

    python_pcl-0.3.1-cp36-cp36m-win_amd64.whl

    python_pcl-0.3.1-cp36-cp36m-win_amd64.whl

    rh-python36-python-libs-3.6.2-3.el7.x86_64.rpm

    python3: error while loading shared libraries: libpython3.6m.so.rh-python36-1.0 rh-python36-python-libs-3.6.2-3.el7.x86_64.rpm

    python-3.10.8-amd64 python3.10 64位windows安装包

    在安装过程中,`python-3.10.8-amd64.exe`是一个自解压可执行文件,双击后会启动安装向导。用户可以选择自定义安装路径,决定是否将Python添加到系统PATH环境变量中,以及是否为所有用户安装。将Python添加到PATH...

Global site tag (gtag.js) - Google Analytics