python 다운로드 파일의 몇 가지 방식 공유

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이 파일을 다운로드하는 것에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기