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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
Python多线程学习资料
Dec 19 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
使用python实现BLAST
Feb 12 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
logging level级别介绍
Feb 21 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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/09/05 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
关于Function中的bind()示例详解
2016/12/02 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
layui多图上传实现删除功能的例子
2019/09/23 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Django的session中对于用户验证的支持
2015/07/23 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
毕业生就业意向书
2014/04/01 职场文书
复活读书笔记
2015/06/29 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL