블로그로 돌아가기

셀레니움 웹드라이버에서 프록시 설정하기: 파이썬과 자바를 위한 코드 예제 포함 완벽 가이드

Selenium WebDriver에 프록시를 통합하는 방법에 대한 자세한 설명과 Chrome 및 Firefox용 Python 및 Java 코드 예제.

📅2026년 2월 13일
```html

Selenium WebDriver는 브라우저 자동화 및 데이터 파싱을 위한 가장 인기 있는 도구 중 하나입니다. 대량의 요청을 처리하거나 지리적 제한을 우회해야 할 때 프록시를 올바르게 설정하는 것이 매우 중요합니다. 이 가이드에서는 다양한 브라우저와 프로그래밍 언어에 대한 Selenium에서 프록시를 통합하는 모든 방법을 살펴보고 개발자들이 직면하는 일반적인 문제를 해결하겠습니다.

Selenium에서 프록시가 필요한 이유

Selenium을 통한 웹 스크래핑 또는 테스트 자동화 시 프록시 없이 해결할 수 없는 몇 가지 문제가 발생합니다:

  • 요청 제한 우회 — 많은 웹사이트가 하나의 IP 주소에서 요청 수를 제한합니다. 프록시 없이 스크립트는 50-100개의 요청 후에 빠르게 차단됩니다.
  • 지리적 제한 — 특정 국가에서만 접근 가능한 콘텐츠를 파싱해야 할 경우, 해당 지리적 위치의 IP를 가진 프록시가 이 문제를 해결합니다.
  • 부하 분산 — 대량의 데이터 파싱 시 프록시를 통한 IP 주소 회전은 요청을 분산시키고 봇 탐지를 피할 수 있게 해줍니다.
  • 로컬라이제이션 테스트 — 다양한 국가의 사용자에게 웹사이트가 어떻게 표시되는지 확인하려면 해당 지역의 프록시가 필요합니다.
  • 안티봇 시스템 우회 — 현대의 보안 시스템(Cloudflare, DataDome)은 IP 평판을 분석합니다. 품질 좋은 프록시는 일반 사용자처럼 보이도록 도와줍니다.

올바른 프록시 설정 없이 Selenium 스크립트는 불안정하게 작동하여 CAPTCHA를 받거나 임시 차단 또는 전체 접근 차단을 초래할 수 있습니다. 특히 전자상거래 플랫폼, 소셜 미디어 또는 공격적인 봇 방어가 있는 웹사이트를 파싱할 때 이는 매우 중요합니다.

어떤 유형의 프록시를 사용할지

프록시 유형 선택은 작업에 따라 다릅니다. Selenium 자동화에는 세 가지 주요 유형의 프록시가 사용되며, 각각의 장점이 있습니다:

프록시 유형 속도 익명성 최고의 시나리오
데이터 센터 프록시 매우 높음 (100+ Mbps) 중간 공공 데이터 파싱, 성능 테스트, 대량 검사
주거용 프록시 중간 (10-50 Mbps) 매우 높음 안티봇 시스템 우회, 소셜 미디어 파싱, 전자상거래, 강력한 보안 사이트
모바일 프록시 중간 (5-30 Mbps) 최대 모바일 사이트 작업, 소셜 미디어, 모바일 IP 확인이 필요한 애플리케이션

선택 권장 사항:

  • 뉴스 사이트, 공개 API, 간단한 카탈로그 파싱에는 데이터 센터 프록시가 적합합니다. 이들은 더 저렴하고 빠릅니다.
  • Amazon, eBay, Google, 소셜 미디어 작업에는 주거용 프록시만 사용해야 합니다. 이러한 플랫폼은 데이터 센터 IP를 적극적으로 차단합니다.
  • 모바일 사용자 에뮬레이션이나 Instagram, TikTok 작업에는 모바일 프록시가 필수입니다.
  • 지리적 위치 테스트에는 특정 국가 및 도시를 선택할 수 있는 프록시를 선택하세요.

Selenium에서 Chrome용 프록시 설정

Chrome WebDriver는 Selenium 자동화에 가장 인기 있는 선택입니다. 프록시 설정은 ChromeOptions 객체를 통해 수행됩니다. 몇 가지 방법을 살펴보겠습니다.

방법 1: 인증 없는 HTTP/HTTPS 프록시 (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 프록시 설정
PROXY = "123.45.67.89:8080"  # 귀하의 프록시 서버로 변경하세요.

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# 안정성을 위한 추가 옵션
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# 드라이버 시작
driver = webdriver.Chrome(options=chrome_options)

# IP 확인
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()

방법 2: SOCKS5 프록시 (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY = "123.45.67.89:1080"

chrome_options = Options()
# SOCKS5의 경우 프로토콜을 명시적으로 지정합니다.
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

중요: Chrome은 HTTP, HTTPS 및 SOCKS5 프록시를 지원합니다. SOCKS4의 경우 추가 설정이나 확장 프로그램 사용이 필요합니다.

Java에서 Chrome용 프록시 설정

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;

public class ChromeProxyExample {
    public static void main(String[] args) {
        // 프록시 설정
        Proxy proxy = new Proxy();
        proxy.setHttpProxy("123.45.67.89:8080");
        proxy.setSslProxy("123.45.67.89:8080");
        
        ChromeOptions options = new ChromeOptions();
        options.setProxy(proxy);
        options.addArguments("--no-sandbox");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://httpbin.org/ip");
        
        System.out.println(driver.getPageSource());
        driver.quit();
    }
}

Selenium에서 Firefox용 프록시 설정

Firefox WebDriver는 브라우저 프로필을 통해 프록시를 설정하는 다른 접근 방식을 사용합니다. 이는 더 많은 유연성을 제공하지만 구성 매개변수에 대한 이해가 필요합니다.

Firefox용 HTTP/HTTPS 프록시 (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080

firefox_options = Options()

# preferences를 통한 프록시 설정
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# 로컬 주소에 대한 프록시 비활성화
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Firefox용 SOCKS5 프록시 (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)

# SOCKS5의 경우 DNS를 프록시를 통해 수행
firefox_options.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Firefox의 장점: network.proxy.socks_remote_dns 매개변수는 DNS 요청을 프록시를 통해 수행할 수 있게 하여 익명성을 높이고 DNS 수준의 차단을 우회하는 데 도움을 줍니다.

인증이 필요한 프록시 작업하기

대부분의 품질 좋은 프록시 서비스는 사용자 이름과 비밀번호를 통한 인증을 사용합니다. Selenium은 Chrome의 프록시 URL에 직접 자격 증명을 전달하는 것을 지원하지 않으므로 우회 솔루션이 필요합니다.

방법 1: 인증을 위한 Chrome 확장 프로그램 (추천)

프록시에 연결할 때 자동으로 사용자 이름과 비밀번호를 입력하는 임시 Chrome 확장 프로그램을 생성합니다:

import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

# 확장 프로그램의 매니페스트 생성
manifest_json = """
{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    }
}
"""

# 인증 스크립트
background_js = """
var config = {
    mode: "fixed_servers",
    rules: {
        singleProxy: {
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
    }
};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: [""]},
    ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)

# 확장 프로그램 생성
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
    zp.writestr("manifest.json", manifest_json)
    zp.writestr("background.js", background_js)

# 확장 프로그램과 함께 Chrome 시작
chrome_options = Options()
chrome_options.add_extension(plugin_path)

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()
os.remove(plugin_path)  # 임시 파일 삭제

방법 2: Firefox에서 인증 (더 간단)

Firefox는 프로필 설정을 통해 자격 증명을 전달할 수 있습니다:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# 인증 (항상 작동하지 않으며 Firefox 버전에 따라 다름)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)

# 인증 요청 비활성화
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

참고: 프록시 제공자가 IP 화이트리스트를 지원하는 경우, 서버의 IP를 화이트리스트에 추가하고 인증 없이 프록시를 사용하는 것이 더 간단합니다.

Selenium에서 프록시 회전

대량의 데이터를 파싱할 때 프록시를 변경하는 것이 차단을 피하는 데 매우 중요합니다. 두 가지 접근 방식이 있습니다: 코드 수준 회전 및 회전 프록시 사용.

코드 수준 회전 (새 드라이버 생성)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random

# 프록시 목록
PROXY_LIST = [
    "123.45.67.89:8080",
    "98.76.54.32:8080",
    "11.22.33.44:8080",
]

def create_driver_with_proxy(proxy):
    """지정된 프록시로 드라이버 생성"""
    chrome_options = Options()
    chrome_options.add_argument(f'--proxy-server=http://{proxy}')
    chrome_options.add_argument('--no-sandbox')
    return webdriver.Chrome(options=chrome_options)

# 회전으로 파싱
urls_to_parse = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
]

for url in urls_to_parse:
    # 랜덤 프록시 선택
    current_proxy = random.choice(PROXY_LIST)
    
    # 프록시로 새 드라이버 생성
    driver = create_driver_with_proxy(current_proxy)
    
    try:
        driver.get(url)
        # 파싱 로직
        print(f"{url}를 {current_proxy}를 통해 파싱했습니다.")
        print(driver.title)
    except Exception as e:
        print(f"{current_proxy}에서 오류 발생: {e}")
    finally:
        driver.quit()  # 드라이버를 닫는 것이 중요합니다.

회전 프록시 사용 (더 간단)

많은 프록시 제공자가 회전 엔드포인트를 제공합니다 — 하나의 URL로, 각 요청 시 또는 특정 간격으로 IP를 자동으로 변경합니다. 이는 코드를 단순화합니다:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 회전 프록시 엔드포인트 (IP가 자동으로 변경됨)
ROTATING_PROXY = "rotating.proxycove.com:8080"

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')

driver = webdriver.Chrome(options=chrome_options)

# 각 요청은 새로운 IP로 이루어집니다.
urls = ['https://httpbin.org/ip'] * 5

for url in urls:
    driver.get(url)
    print(driver.find_element("tag name", "body").text)
    # 각 출력은 다른 IP를 보여줍니다.

driver.quit()

권장 사항: 대규모 프로젝트의 경우 회전 프록시를 사용하세요 — 이는 자원을 절약하고 (드라이버를 재생성할 필요 없음) 코드를 단순화합니다. 주거용 프록시는 일반적으로 기본적으로 회전을 지원합니다.

일반적인 오류 및 해결 방법

오류: "ERR_PROXY_CONNECTION_FAILED"

원인: Selenium이 프록시 서버에 연결할 수 없습니다.

해결 방법:

  • 프록시의 IP와 포트가 올바른지 확인하세요.
  • 프록시가 활성 상태인지 확인하세요 (curl을 통해 확인: curl -x http://123.45.67.89:8080 https://httpbin.org/ip)
  • 방화벽을 확인하세요 — 프록시로의 아웃바운드 연결이 차단되었을 수 있습니다.
  • 인증을 사용하는 경우, 사용자 이름/비밀번호가 올바른지 확인하세요.

오류: "ERR_TUNNEL_CONNECTION_FAILED"

원인: 프록시를 통한 HTTPS 연결 문제입니다.

해결 방법:

  • 프록시가 HTTPS를 지원하는지 확인하세요 (CONNECT 메소드)
  • HTTPS 사이트의 경우 HTTPS 프록시 또는 SOCKS5를 사용하세요.
  • SSL 오류 무시 옵션 추가: chrome_options.add_argument('--ignore-certificate-errors')

오류: 프록시는 작동하지만 사이트가 봇을 감지합니다.

원인: 사이트가 고급 감지 방법(fingerprinting, 행동 분석)을 사용합니다.

해결 방법:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# webdriver 플래그 비활성화 (자동화의 주요 특징)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=chrome_options)

# navigator.webdriver 제거
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    '''
})

driver.get('https://bot.sannysoft.com/')  # 감지 확인을 위한 사이트

추가로 undetected-chromedriver 라이브러리를 사용하는 것이 좋습니다. 이 라이브러리는 자동으로 많은 안티 감지 기술을 적용합니다.

문제: 프록시를 통한 페이지 로딩 속도가 느림

원인: 프록시가 과부하되었거나 지리적으로 멀리 있습니다.

해결 방법:

  • 목표 서버에 더 가까운 프록시를 선택하세요 (예: 미국 사이트를 파싱할 경우 미국 프록시 사용)
  • 속도가 더 중요할 경우 데이터 센터 프록시를 사용하세요.
  • Selenium에서 타임아웃을 설정하여 멈춤을 피하세요:
from selenium.webdriver.support.ui import WebDriverWait

driver.set_page_load_timeout(30)  # 최대 30초 로딩 시간
driver.implicitly_wait(10)  # 요소에 대한 암시적 대기

프록시 작업 시 모범 사례

1. 프록시 풀 사용
하나의 프록시 서버에 의존하지 마세요. 10-50개의 프록시로 풀을 만들고 회전하세요. 하나의 프록시가 차단되면 다른 프록시로 계속 파싱할 수 있습니다.

2. 랜덤 지연 추가
프록시를 사용하더라도 너무 빠른 요청은 의심스러워 보입니다. 요청 간에 2-5초의 랜덤 지연을 추가하세요:

import time
import random

for url in urls:
    driver.get(url)
    # 파싱...
    time.sleep(random.uniform(2, 5))  # 2-5초 랜덤 지연

3. 프록시 품질 모니터링
사용하기 전에 프록시를 확인하세요. 응답하지 않거나 오류를 반환하는 프록시는 풀에서 제외하세요:

import requests

def check_proxy(proxy):
    """프록시 작동 여부 확인"""
    try:
        response = requests.get(
            'https://httpbin.org/ip',
            proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
            timeout=10
        )
        return response.status_code == 200
    except:
        return False

# 작동하는 프록시 필터링
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"작동하는 프록시: {len(working_proxies)}/{len(PROXY_LIST)}")

4. 헤드리스 모드 사용에 주의하세요
헤드리스 브라우저는 감지하기가 더 쉽습니다. 복잡한 사이트의 경우 일반 모드로 브라우저를 실행하거나 --window-size를 사용하세요 대신 --headless.

5. 모든 요청 기록하기
각 요청에 사용된 프록시에 대한 정보를 저장하세요. 이는 문제 있는 프록시를 식별하고 오류를 디버깅하는 데 도움이 됩니다.

6. robots.txt 및 요청 제한 준수
프록시를 사용하더라도 사이트의 규칙을 존중하세요. 공격적인 파싱은 프록시의 전체 서브넷이 차단될 수 있으며, 이는 다른 사용자에게 피해를 줄 수 있습니다.

결론

Selenium WebDriver에서 프록시를 올바르게 설정하는 것은 안정적인 파싱 및 자동화의 기초입니다. 우리는 Chrome 및 Firefox에 대한 프록시 통합의 모든 주요 방법, 인증 작업, IP 주소 회전 및 일반적인 문제 해결 방법을 살펴보았습니다. 가장 중요한 것은 귀하의 작업에 적합한 프록시 유형을 선택하는 것입니다: 간단한 파싱에는 데이터 센터 프록시가 충분하지만, 보호된 플랫폼에서 작업할 때는 주거용 또는 모바일 프록시가 필요합니다.

모범 사례를 기억하세요: 프록시 풀을 사용하고, 랜덤 지연을 추가하며, 연결 품질을 모니터링하고, 안티 감지 기술을 적용하세요. 이는 귀하의 스크립트 안정성을 높이고 차단 위험을 수십 배로 줄일 수 있습니다.

높은 익명성 및 안티봇 시스템 우회를 요구하는 파싱 자동화를 계획하고 있다면, 주거용 프록시를 시도해 보시기 바랍니다 — 이는 소셜 미디어, 전자상거래 플랫폼 및 고급 보안이 있는 서비스와 같은 모든 사이트에서 최대한의 안정성을 제공합니다. 대량 데이터 처리 속도가 중요한 작업에는 데이터 센터 프록시가 가격 대비 성능의 최적 선택이 될 것입니다.

```