Python urllib으로 프록시 다운로드를 파일로 스트리밍하기
프록시 다운로드를 임시 파일로 스트리밍하고 복사가 완료된 뒤에만 최종 파일 이름을 공개합니다.
import os
import shutil
from urllib.request import ProxyHandler, build_opener
proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
temporary = 'archive.zip.part'
destination = 'archive.zip'
with opener.open('https://downloads.example.net/archive.zip',
timeout=20) as response:
with open(temporary, 'wb') as output:
shutil.copyfileobj(response, output)
os.replace(temporary, destination)애플리케이션에 맞게 URL과 파일 이름을 바꾸세요. 프록시 인증 없이 허용된 공개 파일 다운로드의 경우 HTTP 프록시 목록에서 프록시 URL의 후보 엔드포인트를 제공할 수 있습니다. 이 전용 urllib 오프너는 일반적인 인증서 검증과 함께 HTTPS 대상에 HTTP 프록시를 사용합니다. 전역 오프너를 설치하지 않습니다. 인증이 필요하면 지원되는 설정이 필요합니다.
copyfileobj은(는) 청크 단위로 복사합니다. 파일 컨텍스트를 벗어나면 파일이 닫히고 버퍼링된 쓰기가 플러시된 후 os.replace이(가) 최종 이름을 설정합니다.
요청이나 복사가 예외를 발생시키면 이름 변경은 건너뜁니다. 정리 정책에 따라 부분 파일이 남을 수 있으며, 이 흐름은 해당 실패 시 기존 최종 파일을 그대로 둡니다. 성공하면 바꾸기가 그 최종 파일을 덮어쓸 수 있으므로 정책을 의도적으로 선택하세요.
동시 작업에는 고유한 임시 이름을 사용하세요. 별도의 오프너 객체는 같은 .part 경로를 공유하는 작업을 보호하지 않습니다.
20초 설정은 전체 다운로드 시간이 아니라 지원되는 소켓 작업을 제한합니다. 작업 전체의 기한은 애플리케이션에서 별도로 처리해야 합니다. 전송 완료도 다운로드한 파일 검증과는 별개입니다.