메뉴 닫기

파이썬 Selenium 파일 다운로드 폴더 지정과 완료 대기 방법

파이썬 Selenium 파일 다운로드 폴더 지정과 완료 대기 방법

📌 자동화된 다운로드 환경에서 꼭 필요한 설정과 예제 코드 공개

웹 자동화 작업을 하다 보면 단순히 데이터를 수집하는 것에서 끝나지 않고, 실제 파일을 내려받아야 하는 경우가 자주 생깁니다.
특히 엑셀, CSV, PDF와 같은 결과물이 자동 다운로드되는 상황에서는 다운로드 폴더를 지정하거나, 다운로드가 끝날 때까지 기다리는 기능이 없다면 코드가 꼬이거나 오류가 발생하기 쉽습니다.
그래서 많은 개발자들이 Selenium의 다운로드 폴더 설정과 완료 대기 기능을 어떻게 구현할 수 있는지 궁금해하곤 합니다.

이번 글에서는 파이썬 Selenium을 활용해 원하는 경로로 파일을 다운로드 받도록 폴더를 지정하는 방법과, 다운로드 중 생성되는 임시 확장자 파일(.crdownload 등)을 감지해 다운로드 완료 시점까지 안전하게 기다리는 방법을 정리했습니다.
실제 예제 코드도 함께 제공하니, Selenium을 활용한 자동화 작업을 안정적으로 구축하려는 분들에게 실질적인 도움이 될 것입니다.



⚙️ Selenium에서 다운로드 폴더 지정하기

Selenium을 사용해 자동화된 다운로드 작업을 수행할 때 가장 먼저 해야 할 일은 다운로드 경로를 미리 지정하는 것입니다.
기본 설정 그대로라면 다운로드되는 파일이 운영체제의 기본 다운로드 폴더에 저장되기 때문에, 프로젝트 단위로 파일을 관리하기 어렵고 자동화된 후처리 과정에도 혼란이 생깁니다.

예를 들어 크롬 드라이버를 사용하는 경우에는 ChromeOptions를 통해 prefs 속성을 지정하여 다운로드 위치와 동작을 제어할 수 있습니다.
‘download.default_directory’를 원하는 경로로 설정하면, 다운로드된 파일이 항상 해당 위치로 저장됩니다.
또한 ‘download.prompt_for_download’를 False로 지정하면 다운로드 시 확인창이 뜨지 않아 완전히 무인화된 자동화를 구현할 수 있습니다.

CODE BLOCK
from selenium import webdriver

options = webdriver.ChromeOptions()
prefs = {
    "download.default_directory": r"C:\\my_downloads",
    "download.prompt_for_download": False,
    "directory_upgrade": True
}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=options)

위와 같은 방식으로 설정을 적용하면, 파일이 항상 C:\my_downloads 경로로 다운로드됩니다.
이 설정은 크롬뿐 아니라 파이어폭스에서도 프로필 옵션을 활용해 비슷하게 지정할 수 있으며, 브라우저마다 약간의 설정 차이만 있을 뿐 기본적인 원리는 동일합니다.

💡 TIP: 다운로드 경로는 절대 경로로 지정하는 것이 안전하며, 프로젝트 내 별도의 downloads 폴더를 만들어 관리하면 후속 작업과 정리에 유리합니다.

📂 임시 확장자 파일로 다운로드 완료 확인하기

폴더 경로를 지정했다면 이제 남은 문제는 다운로드가 끝났는지 확인하는 것입니다.
대부분의 브라우저는 다운로드 중인 파일에 임시 확장자를 붙입니다.
예를 들어 크롬은 .crdownload, 파이어폭스는 .part 확장자를 사용합니다.
이러한 임시 파일이 사라져야 다운로드가 완료된 것으로 간주할 수 있습니다.

따라서 자동화 코드에서는 특정 폴더를 주기적으로 확인(polling)하면서 임시 확장자가 사라질 때까지 기다린 뒤 후속 로직을 실행하면 안전합니다.
이는 단순히 time.sleep()을 사용하는 방식보다 훨씬 안정적이며, 네트워크 속도나 파일 크기에 따라 유동적으로 대기 시간을 조절할 수 있습니다.

CODE BLOCK
import os, time

def wait_for_downloads(download_dir, timeout=60):
    start_time = time.time()
    while True:
        files = os.listdir(download_dir)
        # 임시 확장자가 남아있다면 아직 다운로드 중
        if not any(f.endswith((".crdownload", ".part")) for f in files):
            break
        if time.time() - start_time > timeout:
            raise TimeoutError("다운로드가 시간 내에 완료되지 않았습니다.")
        time.sleep(1)

wait_for_downloads(r"C:\\my_downloads")

이 방식은 특정 파일 이름을 지정하지 않고 폴더 내 전체 상태를 체크하기 때문에, 여러 개의 파일을 동시에 다운로드할 때에도 유용합니다.
다만, 대용량 파일의 경우 다운로드 시간이 길어질 수 있으므로 timeout 값을 충분히 설정하는 것이 좋습니다.

⚠️ 주의: 다운로드 완료 확인을 단순히 파일 존재 여부로만 판단하면 불완전한 파일을 처리할 수 있으니, 반드시 임시 확장자 제거 여부까지 체크해야 합니다.



💻 파이썬 예제 코드로 구현해보기

앞에서 설명한 폴더 지정다운로드 완료 대기 방법을 실제로 하나의 코드로 합쳐보면 훨씬 이해하기 쉽습니다.
아래 예제는 크롬 브라우저를 이용해 특정 파일을 다운로드하고, 다운로드가 끝날 때까지 기다리는 과정을 모두 포함하고 있습니다.

CODE BLOCK
from selenium import webdriver
import os, time

DOWNLOAD_DIR = r"C:\\my_downloads"

def wait_for_downloads(download_dir, timeout=60):
    start_time = time.time()
    while True:
        files = os.listdir(download_dir)
        if not any(f.endswith((".crdownload", ".part")) for f in files):
            break
        if time.time() - start_time > timeout:
            raise TimeoutError("다운로드가 시간 내에 완료되지 않았습니다.")
        time.sleep(1)

options = webdriver.ChromeOptions()
prefs = {
    "download.default_directory": DOWNLOAD_DIR,
    "download.prompt_for_download": False,
    "directory_upgrade": True
}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/sample.pdf")
wait_for_downloads(DOWNLOAD_DIR)
print("다운로드 완료!")
driver.quit()

위 코드를 실행하면 지정한 URL에서 PDF 파일을 다운로드한 후, 해당 파일이 완전히 내려받아질 때까지 기다렸다가 “다운로드 완료!”라는 메시지를 출력합니다.
이 방식은 확장자가 임시 상태에서 정상 파일로 바뀌는 시점을 기준으로 하기 때문에 매우 안정적입니다.

💬 실제 환경에서는 네트워크 상황, 브라우저 버전, 파일 크기에 따라 다운로드 시간이 달라질 수 있으므로 timeout 값을 상황에 맞게 조정하는 것이 좋습니다.

또한, 여러 개의 파일을 연속적으로 다운로드해야 한다면 각 다운로드마다 wait_for_downloads() 함수를 호출해 주는 것이 안전합니다.
이렇게 하면 예기치 못한 누락이나 중복 실행 문제를 줄일 수 있습니다.

🛠️ 크롬과 파이어폭스 설정 차이

Selenium에서 다운로드 폴더를 지정하는 방법은 브라우저마다 조금씩 다릅니다.
대부분은 비슷한 원리를 따르지만, 옵션 이름이나 접근 방식이 다르기 때문에 반드시 각 브라우저의 특성을 이해해야 합니다.
대표적으로 많이 사용되는 크롬(Chrome)파이어폭스(Firefox)의 설정 차이를 살펴보겠습니다.

🌐 크롬에서의 다운로드 설정

크롬은 ChromeOptionsprefs 속성을 통해 다운로드 경로를 제어합니다.
앞서 살펴본 것처럼 download.default_directory, download.prompt_for_download 등의 옵션을 사용하면 됩니다.

🦊 파이어폭스에서의 다운로드 설정

파이어폭스는 FirefoxProfile을 활용해 다운로드 동작을 제어합니다.
이때 MIME 타입을 미리 지정해야 다운로드 팝업 없이 자동 저장됩니다.
예를 들어 CSV나 PDF를 자동 다운로드하려면 browser.helperApps.neverAsk.saveToDisk 속성에 해당 MIME 타입을 나열해야 합니다.

CODE BLOCK
from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.dir", r"C:\\my_downloads")
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
                       "application/pdf,text/csv,application/octet-stream")
profile.set_preference("pdfjs.disabled", True)

driver = webdriver.Firefox(firefox_profile=profile)
driver.get("https://example.com/sample.csv")

이 설정을 적용하면 CSV, PDF 등 지정한 파일은 별도의 대화창 없이 지정된 폴더로 자동 다운로드됩니다.
특히 파이어폭스는 pdfjs.disabled 속성을 True로 설정해 PDF 뷰어를 비활성화하지 않으면 브라우저에서 열리기 때문에 주의가 필요합니다.

💎 핵심 포인트:
크롬은 prefs 기반, 파이어폭스는 profile 기반으로 다운로드 동작을 제어한다는 점을 기억하면 헷갈리지 않습니다.



🚀 자동화 프로젝트에서의 활용 팁

파일 다운로드 기능을 제대로 구현하면 단순한 웹 크롤링을 넘어서 보다 실무적인 자동화가 가능해집니다.
예를 들어 기업 내부 보고서, 오픈데이터 포털의 자료, 금융기관의 일별 시세 파일 등을 정해진 시간마다 자동으로 수집해 저장할 수 있습니다.
이때 다운로드 경로 지정과 완료 대기 기능은 프로젝트 안정성을 보장하는 핵심 요소가 됩니다.

또한, 파일 다운로드가 포함된 자동화는 후처리 작업과 연결되기 때문에, 다운로드된 파일을 자동으로 읽어 데이터 분석이나 데이터베이스 적재로 이어지는 경우가 많습니다.
따라서 다운로드 완료를 제대로 확인하지 않으면 불완전한 데이터가 저장되거나 분석이 틀어질 수 있습니다.

📌 안정성을 높이는 체크리스트

  • 📂다운로드 전용 폴더 경로를 프로젝트 안에 별도로 설정하기
  • 임시 확장자(.crdownload, .part) 감지로 다운로드 완료 여부 확인하기
  • 🛠️timeout 값은 네트워크 환경에 맞춰 충분히 길게 설정하기
  • 🔄여러 파일을 연속 다운로드할 경우 각 파일마다 대기 함수 실행하기
  • 🗑️테스트 과정에서 생성된 파일은 주기적으로 삭제해 폴더를 깔끔하게 유지하기

이러한 원칙을 지켜가며 작업을 진행하면 자동화의 완성도를 높일 수 있습니다.
특히 기업 환경에서는 다운로드된 파일을 다른 시스템으로 넘겨야 하는 경우가 많기 때문에, 파일 무결성 확보가 무엇보다 중요합니다.

💡 TIP: 주기적인 자동화를 구현할 때는 스케줄러(cron, Windows Task Scheduler 등)와 연계해 다운로드 및 후처리를 모두 자동화하면 업무 효율이 극대화됩니다.

자주 묻는 질문 (FAQ)

Selenium에서 다운로드 경로를 꼭 지정해야 하나요?
지정하지 않으면 운영체제 기본 다운로드 폴더로 저장되므로, 프로젝트 단위 관리와 후처리에 어려움이 생깁니다. 안정적인 자동화를 위해 별도 경로를 설정하는 것이 좋습니다.
다운로드 완료를 time.sleep()으로 기다리면 안 되나요?
고정된 시간 대기 방식은 파일 크기와 네트워크 환경에 따라 실패할 수 있습니다. 임시 확장자(.crdownload, .part) 감지를 이용한 방식이 훨씬 안전합니다.
크롬과 파이어폭스 설정 중 어떤 것이 더 편리한가요?
크롬은 prefs로 간단하게 설정할 수 있어 직관적이고, 파이어폭스는 MIME 타입 지정이 필요하지만 다양한 확장자 제어에 강점이 있습니다. 사용 목적에 맞게 선택하면 됩니다.
대용량 파일도 같은 방식으로 기다릴 수 있나요?
가능합니다. 다만 다운로드 시간이 길어질 수 있으므로 timeout 값을 충분히 늘려주는 것이 안정적입니다.
여러 개의 파일을 동시에 다운로드해도 되나요?
가능합니다. 단, 각 파일 다운로드 후 wait_for_downloads 함수를 실행해 모든 파일이 완료될 때까지 기다려야 안전합니다.
PDF 파일이 자동으로 브라우저에서 열리는데 해결 방법이 있나요?
파이어폭스에서는 pdfjs.disabled 옵션을 True로, 크롬에서는 MIME 타입 제어 옵션을 사용하면 PDF가 바로 다운로드됩니다.
임시 확장자가 남아 있는데도 다운로드가 끝난 것처럼 보이면 어떻게 하나요?
일부 환경에서는 캐시 문제나 중단된 다운로드로 인해 임시 파일이 그대로 남을 수 있습니다. 이런 경우엔 재시도 로직을 추가하는 것이 좋습니다.
자동 다운로드 기능이 막힌 사이트도 있나요?
일부 사이트는 보안상 JavaScript 이벤트나 사용자 클릭을 강제하기 때문에 자동 다운로드가 제한됩니다. 이 경우에는 pyautogui 등과 같은 다른 도구와 조합해 해결하기도 합니다.

📌 Selenium 파일 다운로드 자동화 핵심 정리

파이썬 Selenium을 이용해 파일을 자동으로 다운로드할 때는 단순히 버튼을 클릭하는 것만으로는 부족합니다.
다운로드 폴더를 지정하지 않으면 프로젝트 관리가 어렵고, 완료 대기 기능이 없다면 불완전한 파일을 처리할 위험이 있습니다.
따라서 크롬이나 파이어폭스에 맞는 옵션을 활용해 경로를 지정하고, 임시 확장자 파일을 감지하는 로직으로 다운로드가 끝날 때까지 안전하게 기다려야 합니다.

이 글에서는 크롬의 prefs 설정, 파이어폭스의 profile 설정, 임시 확장자를 활용한 완료 대기, 그리고 실제 예제 코드까지 살펴보았습니다.
이를 통해 단순한 크롤링을 넘어 안정적인 자동화 시스템을 구축할 수 있습니다.
특히 기업 환경이나 정기적인 데이터 수집 프로젝트에서는 이러한 기능들이 필수적이며, 후속 데이터 분석 및 적재 과정까지 안정성을 보장합니다.

정리하자면, 폴더 지정, 임시 확장자 감지, timeout 설정, 브라우저별 옵션 이해가 Selenium 파일 다운로드 자동화의 핵심입니다.
이 네 가지 원칙만 지켜도 프로젝트의 안정성과 완성도가 크게 향상됩니다.


🏷️ 관련 태그 : Selenium자동화, 파이썬Selenium, 파일다운로드자동화, 크롬옵션, 파이어폭스설정, 웹크롤링, 데이터수집, 다운로드폴더지정, 임시확장자, 파이썬예제