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标准库与第三方库详解
Jul 22 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
python3实现随机数
Jun 25 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
python超时重新请求解决方案
Oct 21 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
Python读取表格类型文件代码实例
Feb 17 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
python超详细实现完整学生成绩管理系统
Mar 17 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
JavaScript修改css样式style
2008/04/15 Javascript
js 操作符实例代码
2009/10/24 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
详解python中的Turtle函数库
2018/11/19 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
韩语专业本科生求职信
2013/10/01 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
导游词之介休绵山
2019/12/31 职场文书