python 下载文件的多种方法汇总


Posted in Python onNovember 17, 2020

本文档介绍了 Python 下载文件的各种方式,从下载简单的小文件到用断点续传的方式下载大文件。

Requests

使用 Requests 模块的 get 方法从一个 url 上下载文件,在 python 爬虫中经常使用它下载简单的网页内容

import requests

# 图片来自bing.com
url = 'https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg'

def requests_download():

  content = requests.get(url).content

  with open('pic_requests.jpg', 'wb') as file:
    file.write(content)

urllib

使用 python 内置的 urllib 模块的 urlretrieve 方法直接将 url 请求保存成文件

from urllib import request

# 图片来自bing.com
url = 'https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg'

def urllib_download():
  request.urlretrieve(url, 'pic_urllib.jpg')

urllib3

urllib3 是一个用于 Http 客户端的 Python 模块,它使用连接池对网络进行请求访问

def urllib3_download():
  # 创建一个连接池
  poolManager = urllib3.PoolManager()

  resp = poolManager.request('GET', url)

  with open("pic_urllib3.jpg", "wb") as file:
    file.write(resp.data)

  resp.release_conn()

wget

在 Linux 系统中有 wget 命令,可以方便的下载网上的资源,Python 中也有相应的 wget 模块。使用 pip install 命令安装

import wget

# 图片来自bing.com
url = 'https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg'

def wget_download():
  wget.download(url, out='pic_wget.jpg')

也可以直接在命令行中使用 wget 命令

python -m wget https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg

分块下载大文件

在需要下载的文件非常大,电脑的内存空间完全不够用的情况下,可以使用 requests 模块的流模式,默认情况下 stream 参数为 False, 文件过大会导致内存不足。stream 参数为 True 的时候 requests 并不会立刻开始下载,只有在调用 iter_content 或者 iter_lines 遍历内容时下载

iter_content:一块一块的遍历要下载的内容 iter_lines:一行一行的遍历要下载的内容

import requests

def steam_download():
  # vscode 客户端
  url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'

  with requests.get(url, stream=True) as r:
    with open('vscode.exe', 'wb') as flie:
      # chunk_size 指定写入大小每次写入 1024 * 1024 bytes
      for chunk in r.iter_content(chunk_size=1024*1024):
        if chunk:
          flie.write(chunk)

进度条

在下载大文件的时候加上进度条美化下载界面,可以实时知道下载的网络速度和已经下载的文件大小,这里使用 tqdm 模块作为进度条显示,可以使用 pip install tqdm 安装

from tqdm import tqdm

def tqdm_download():

  url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'

  resp = requests.get(url, stream=True)

  # 获取文件大小
  file_size = int(resp.headers['content-length'])
  
  with tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024, ascii=True, desc='vscode.exe') as bar:
    with requests.get(url, stream=True) as r:
      with open('vscode.exe', 'wb') as fp:
        for chunk in r.iter_content(chunk_size=512):
          if chunk:
            fp.write(chunk)
            bar.update(len(chunk))

tqdm 参数说明:

  1. total:bytes,整个文件的大小
  2. unit='B': 按 bytes 为单位计算
  3. unit_scale=True:以 M 为单位显示速度
  4. unit_divisor=1024:文件大小和速度按 1024 除以,默认时按 1000 来除
  5. ascii=True:进度条的显示符号,用于兼容 windows 系统
  6. desc='vscode.exe' 进度条前面的文件名

示例结果

python 下载文件的多种方法汇总

断点续传

HTTP/1.1 在协议的请求头中增加了一个名为 Range的字段域, Range 字段域让文件从已经下载的内容开始继续下载

如果网站支持 Range 字段域请求响应的状态码为 206(Partial Content),否则为 416(Requested Range not satisfiable)

Range 的格式

Range:[unit=first byte pos] - [last byte pos],即 Range = 开始字节位置-结束字节位置,单位:bytes

将 Range 加入到 headers 中

from tqdm import tqdm

def duan_download():
  url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'

  r = requests.get(url, stream=True)

  # 获取文件大小
  file_size = int(r.headers['content-length'])

  file_name = 'vscode.exe'
  # 如果文件存在获取文件大小,否在从 0 开始下载,
  first_byte = 0
  if os.path.exists(file_name):
    first_byte = os.path.getsize(file_name)
    
  # 判断是否已经下载完成
  if first_byte >= file_size:
    return

  # Range 加入请求头
  header = {"Range": f"bytes={first_byte}-{file_size}"}

  # 加了一个 initial 参数
  with tqdm(total=file_size, unit='B', initial=first_byte, unit_scale=True, unit_divisor=1024, ascii=True, desc=file_name) as bar:
    # 加 headers 参数
    with requests.get(url, headers = header, stream=True) as r:
      with open(file_name, 'ab') as fp:
        for chunk in r.iter_content(chunk_size=512):
          if chunk:
            fp.write(chunk)
            bar.update(len(chunk))

示例结果

启动下载一段时间后,关闭脚本重新运行,文件在断开的内容后继续下载

python 下载文件的多种方法汇总

总结

本文介绍了常用的 7 中文件下载方式,其他的下载方式大家可以在留言区交流交流共同进步

示例代码:Python 下载文件的多种方法

以上就是python 下载文件的多种方法汇总的详细内容,更多关于python 下载文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
深入解析Python中的__builtins__内建对象
Jun 21 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
Flask数据库迁移简单介绍
Oct 24 Python
python3 判断列表是一个空列表的方法
May 04 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
python跨文件使用全局变量的实现
Nov 17 #Python
Python中logging日志的四个等级和使用
Nov 17 #Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 #Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 #Python
python调用百度API实现人脸识别
Nov 17 #Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
Nov 17 #Python
详解Pytorch显存动态分配规律探索
Nov 17 #Python
You might like
PHP+javascript液晶时钟
2006/10/09 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
在Python中关于中文编码问题的处理建议
2015/04/08 Python
使用Python的内建模块collections的教程
2015/04/28 Python
我就是这样学习Python中的列表
2019/06/02 Python
Python的几种主动结束程序方式
2019/11/22 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Pytorch的mean和std调查实例
2020/01/02 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
售房协议书范本2014
2014/10/23 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL