Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python requests 라이브러리로 웹에서 파일 다운로드하는 방법 완벽 가이드

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)

실행 결과

Python requests 라이브러리로 웹에서 파일 다운로드하는 방법 완벽 가이드

현재 작업 디렉터리에 파일(아이콘)이 성공적으로 다운로드된 것을 확인할 수 있습니다.

다양한 파일 형식 처리하기

실제 개발에서는 이미지, 텍스트, 동영상 등 다양한 종류의 파일을 웹에서 다운로드해야 하는 경우가 많습니다. 먼저 해당 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 헤더에서 파일명을 성공적으로 추출할 수 있습니다.