Python은 urllib, requests 등 웹에서 파일을 다운로드할 수 있는 다양한 모듈을 제공합니다. 이 글에서는 Python의 requests 라이브러리를 활용하여 URL로부터 효율적으로 파일을 다운로드하는 방법을 알아보겠습니다.
requests 라이브러리로 파일 다운로드하기: 단계별 절차
1단계: 모듈 임포트
import requests
2단계: 링크 또는 URL 지정
url = 'https://www.facebook.com/favicon.ico' r = requests.get(url, allow_redirects=True)
3단계: 콘텐츠를 원하는 이름으로 저장
open('facebook.ico', 'wb').write(r.content)
위 코드는 파일을 facebook.ico라는 이름으로 저장합니다.
전체 예제 코드
import requests
url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
open('facebook.ico', 'wb').write(r.content)
실행 결과

현재 작업 디렉터리에 파일(아이콘)이 성공적으로 다운로드된 것을 확인할 수 있습니다.
다양한 파일 형식 처리하기
실제 개발에서는 이미지, 텍스트, 동영상 등 다양한 종류의 파일을 웹에서 다운로드해야 하는 경우가 많습니다. 먼저 해당 URL이 어떤 유형의 데이터와 연결되어 있는지 확인해 보겠습니다.
>>> r = requests.get(url, allow_redirects=True)
>>> print(r.headers.get('content-type'))
image/png
다운로드 가능 여부 미리 확인하기
하지만 더 스마트한 방법이 있습니다. 바로 실제 다운로드를 진행하기 전에 URL의 헤더만 먼저 가져오는 것입니다. 이렇게 하면 다운로드가 의도되지 않은 파일은 건너뛰고 필요한 리소스만 효율적으로 처리할 수 있습니다.
>>> print(is_downloadable('https://www.youtube.com/watch?v=xCglV_dqFGI'))
False
>>> print(is_downloadable('https://www.facebook.com/favicon.ico'))
True
파일 크기로 다운로드 제한하기
파일 크기를 기준으로 다운로드를 제한하고 싶다면 content-length 헤더에서 파일 크기를 확인한 후, 요구 사항에 맞게 처리하면 됩니다.
contentLength = header.get('content-length', None)
if contentLength and contentLength > 2e8: # 약 200MB
return False
URL에서 파일명 추출하기
파일명을 얻으려면 URL을 파싱하면 됩니다. 아래는 슬래시(/) 뒤의 마지막 문자열을 가져오는 간단한 예제 코드입니다.
url = "https://www.computersolution.tech/wp-content/uploads/2016/05/tutorialspoint-logo.png"
if url.find('/'):
print(url.rsplit('/', 1)[1])
위 코드는 URL의 파일명을 반환합니다. 하지만 https://url.com/download처럼 URL 자체에 파일명 정보가 포함되어 있지 않은 경우도 많습니다. 이런 경우에는 파일명 정보를 담고 있는 Content-Disposition 헤더를 확인해야 합니다.
import requests
import re
def getFilename_fromCd(cd):
"""
Content-Disposition 헤더에서 파일명 추출
"""
if not cd:
return None
fname = re.findall('filename=(.+)', cd)
if len(fname) == 0:
return None
return fname[0]
url = 'https://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
filename = getFilename_fromCd(r.headers.get('content-disposition'))
open(filename, 'wb').write(r.content)
위의 URL 파싱 코드와 이 프로그램을 함께 사용하면 대부분의 경우 Content-Disposition 헤더에서 파일명을 성공적으로 추출할 수 있습니다.