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이 파일을 다운로드하는 것에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.