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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
使用Python中的cookielib模拟登录网站
Apr 09 Python
Python使用PDFMiner解析PDF代码实例
Mar 27 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
python3使用SMTP发送简单文本邮件
Jun 19 Python
python flask实现分页的示例代码
Aug 02 Python
用Python shell简化开发
Aug 08 Python
Python3 翻转二叉树的实现
Sep 30 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
Python使用openpyxl批量处理数据
Jun 23 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日历制作代码分享
2014/01/20 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
php实现上传图片文件代码
2015/07/19 PHP
简单的php购物车代码
2020/06/05 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
js实现右键菜单功能
2016/11/28 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
python中的json总结
2018/10/11 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
中专生职业生涯规划书范文
2013/12/29 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
教师教学评估方案
2014/05/09 职场文书
应届毕业生自荐书
2014/06/18 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书