python 下载文件的几种方式分享


Posted in Python onApril 07, 2021

1 、一般同步下载

示例代码:

import requests
import os

def downlaod(url, file_path):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  r = requests.get(url=url, headers=headers)
  with open(file_path, "wb") as f:
    f.write(r.content)
    f.flush()

2、 使用流式请求,requests.get方法的stream

默认情况下是stream的值为false,它会立即开始下载文件并存放到内存当中,倘若文件过大就会导致内存不足的情况,程序就会报错。
当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载,需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容

使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

示例代码:

3 、异步下载文件

由于request的请求是阻塞式的,所以要用aiohttp模块来发起请求。

示例代码:

import aiohttp
import asyncio
import os


async def handler(url, file_path):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  async with aiohttp.ClientSession() as session:
    r = await session.get(url=url, headers=headers)
    with open(file_path, "wb") as f:
      f.write(await r.read())
      f.flush()
      os.fsync(f.fileno())


loop = asyncio.get_event_loop()
loop.run_until_complete(handler(url, file_path))

4、 异步拆分下载文件

上面用的是一个协程下载一个文件,下面的方法是将文件分成几部分,每个部分用一个协程下载,最后再写入文件。

下面这个例子用的是流式写入,即把内容写入到磁盘里面。

import aiohttp
import asyncio
import time
import os


async def consumer(queue):
  option = await queue.get()
  start = option["start"]
  end = option["end"]
  url = option["url"]
  filename = option["filename"]
  i = option["i"]

  print(f"第{i}个任务开始运行")
  async with aiohttp.ClientSession() as session:
    headers = {"Range": f"bytes={start}-{end}"}
    r = await session.get(url=url, headers=headers)
    with open(filename, "rb+") as f:
      f.seek(start)
      while True:
        chunk = await r.content.read(end - start)
        if not chunk:
          break
        f.write(chunk)
        f.flush()
        os.fsync(f.fileno())
        print(f"第{i}个任务正在写入中ing")
    queue.task_done()
    print(f"第{i}个任务写入成功")


async def producer(url, headers, filename, queue, coro_num):
  async with aiohttp.ClientSession() as session:
    resp = await session.head(url=url, headers=headers)
    file_size = int(resp.headers["content-length"])
    # 创建一个文件
    with open(filename, "wb") as f:
      pass
    part = file_size // coro_num
    for i in range(coro_num):
      start = part * i
      if i == coro_num - 1:
        end = file_size
      else:
        end = start + part
      info = {
        "start": start,
        "end": end,
        "url": url,
        "filename": filename,
        "i": i,
      }
      queue.put_nowait(info)


async def main():
  # 需要填的有url,filename,coro_num
  url = ""
  filename = ""
  coro_num = 0
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"
  }
  queue = asyncio.Queue(coro_num)
  await producer(url, headers, filename, queue, coro_num)
  task_list = []
  for i in range(coro_num):
    task = asyncio.create_task(consumer(queue))
    task_list.append(task)
  await queue.join()
  for i in task_list:
    i.cancel()
  await asyncio.gather(*task_list)


startt = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
end = time.time() - startt
print(f"用了{end}秒")

5、注意

以上的示例都是介绍思路,程序并不健壮,健壮的程序需要加入错误捕获和错误处理。

以上就是python 下载文件的几种方式分享的详细内容,更多关于python 下载文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python的id()函数解密过程
Dec 25 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 Python
python实现简单购物商城
May 21 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
Python 项目转化为so文件实例
Dec 23 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
完美处理python与anaconda环境变量的冲突问题
python 如何用map()函数创建多线程任务
python requests模块的使用示例
Apr 07 #Python
Python 使用dict实现switch的操作
Apr 07 #Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 #Python
Python获取百度热搜的完整代码
详解Python小数据池和代码块缓存机制
Apr 07 #Python
You might like
php数组一对一替换实现代码
2012/08/31 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
jQuery操作css样式
2017/05/15 jQuery
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
JS实现简易计算器
2020/02/14 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
python访问sqlserver示例
2014/02/10 Python
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
Python文件及目录操作实例详解
2015/06/04 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python之语音识别speech模块
2020/09/09 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
财务会计人员岗位职责
2013/11/30 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
大学生求职信例文
2014/06/29 职场文书
工程技术员岗位职责
2015/04/11 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL