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实现上传样本到virustotal并查询扫描信息的方法
Oct 05 Python
Python读大数据txt
Mar 28 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python字典及字典基本操作方法详解
Jan 30 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
python中的tcp示例详解
Dec 09 Python
PyTorch基本数据类型(一)
May 22 Python
Python学习笔记之变量、自定义函数用法示例
May 28 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
在python中使用nohup命令说明
Apr 16 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 页面执行时间计算代码
2008/12/04 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
JavaScript 指导方针
2007/04/05 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
详解python变量与数据类型
2020/08/25 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
销售代表求职自荐信
2013/10/01 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
校园广播稿精选
2014/10/01 职场文书
整脏治乱工作简报
2015/07/21 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
建房合同协议书
2016/03/21 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python