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在多玩图片上下载妹子图的实现代码
Aug 13 Python
python装饰器与递归算法详解
Feb 18 Python
Python提取网页中超链接的方法
Sep 18 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
Python引用传值概念与用法实例小结
Oct 07 Python
python实现浪漫的烟花秀
Jan 30 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
Python中第三方库Faker的使用详解
Apr 02 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
关于尾递归的使用详解
2013/05/02 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
美国电视购物:QVC
2017/02/06 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
银行柜员应聘推荐信范文
2013/11/24 职场文书
英语自荐信常用语句
2013/12/13 职场文书
一年级班主任寄语
2014/01/19 职场文书
草船借箭教学反思
2014/02/03 职场文书
公司授权委托书样本
2014/09/15 职场文书
博士生专家推荐信
2014/09/26 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
行政主管岗位职责
2015/02/03 职场文书