이 가이드에서 배우게 될 내용:
- 셀레니움 와이어란 무엇인가
- 웹 스크래핑에 Selenium Wire를 사용해야 하는 이유
- Selenium Wire의 주요 기능
- 프록시 로테이션을 활용한 Selenium Wire의 웹 스크래핑 활용 사례
- Bright Data 프록시와 Selenium Wire의 연동
자, 시작해 보겠습니다!
셀레니움 와이어란?
Selenium Wire는Selenium의 Python 바인딩용 확장 기능으로, 브라우저 요청을 제어할 수 있게 해줍니다. 특히 Selenium을 사용하면서 Python 코드에서 직접 요청과 응답을 실시간으로 가로채고 수정할 수 있게 합니다.
참고: 이 라이브러리는 더 이상 유지 관리되지 않지만, 여러 스크래핑 기술과 스크립트가 여전히 이를 기반으로 합니다.
웹 스크래핑에 Selenium Wire를 사용하는 이유는 무엇인가요?
셀레늄은 웹 스크래핑에서 일반 사용자와 동일하게 사이트와 상호작용하기 위해 널리 사용되는 브라우저 자동화 프레임워크입니다. 자세한내용은 저희셀레늄 웹 스크래핑 가이드에서 확인하세요.
문제는 브라우저가 웹 스크래핑을 어렵게 만드는 특정 제한 사항을 가지고 있다는 점입니다. 예를 들어, 인증된 프록시 URL을 설정하거나 실시간으로 프록시를 회전시키는 기능을 지원하지 않습니다. Selenium Wire는 이러한 제한을 극복하는 데 도움을 줍니다.
웹 스크래핑에 셀레늄 와이어를 사용해야 하는 세 가지 이유는 다음과 같습니다:
- 네트워크 계층 접근: 고급 데이터 추출을 위해 AJAX 네트워크 트래픽을 해석, 검사 및 수정합니다.
- 안티봇 우회:
ChromeDriver는안티봇 시스템이 사용자를 봇으로 식별하는 데 활용할 수 있는 상당량의 정보를 노출합니다. Selenium Wire는undetected-chromedriver같은 기술에 활용되어 이를 방지하고 대부분의 안티봇 솔루션을 우회하는 데 도움을 줍니다. - 브라우저의 한계 극복: 최신 브라우저는 시작 시 동작을 구성하기 위해 플래그를 사용하지만, 이러한 설정은 정적이며 변경하려면 재시작이 필요합니다. Selenium Wire는 동적 수정을 지원하여 이 한계를 극복합니다. 이렇게 하면 동일한 브라우저 세션 중에 요청 헤더나 프록시를 업데이트할 수 있어 웹 스크래핑에 이상적입니다.
Selenium Wire의 주요 기능
이제 셀레니움 와이어가 무엇이며 웹 스크래핑에 사용해야 하는 이유를 알게 되었습니다. 이제 가장 중요한 기능을 살펴볼 시간입니다!
요청 및 응답 접근
Selenium Wire는 브라우저가 생성한 HTTP/HTTPS 트래픽을 캡처하여 다음과 같은 속성에 접근할 수 있게 합니다:
| 속성 | 설명 |
|---|---|
driver.requests |
포착된 요청 목록을 시간순으로 보고합니다 |
driver.last_request |
가장 최근에 캡처된 요청을 보고합니다 ( driver.requests[-1]을 사용하는 것보다 효율적입니다) |
driver.wait_for_request(pat, timeout=10) |
이 메서드는pat매개 변수로 정의된 패턴(부분 문자열 또는정규 표현식)과 일치하는 요청이 나타날 때까지timeout매개 변수로 정의된 시간 동안 대기합니다. |
driver.har |
발생한 HTTP 트랜잭션의 JSON 형식HAR아카이브입니다. |
driver.iter_requests() |
캡처된 요청에 대한 반복자를 반환합니다. |
자세한 내용은 Selenium Wire Request 객체가 다음과 같은 속성을 가집니다:
| 속성 | 설명 |
|---|---|
본문 |
본문의 요청은 바이트로 표시됩니다. 요청에 본문이 없는 경우 body의 값은 비어 있습니다(예: b''). |
cert |
서버 SSL 인증서에 대한 정보를 사전 형식으로 보고합니다(HTTPS가 아닌 요청의 경우 비어 있음). |
date |
요청이 이루어진 날짜와 시간을 표시합니다. |
headers |
요청 헤더의 사전과 유사한 객체를 보고합니다(Selenium Wire에서는 헤더가 대소문자를 구분하지 않으며 중복이 허용됨). |
host |
요청 호스트를 보고합니다(예: https://brightdata.com/). |
method |
HHTP 메서드(GET, POST 등)를 지정합니다. |
params |
요청의 매개 변수 사전(dictionary)을 보고합니다(동일한 이름의 매개 변수가 요청에 여러 번 나타나는 경우, 사전에서 해당 값은 리스트가 됩니다). |
path |
요청 경로를 보고합니다. |
쿼리 문자열 |
쿼리 문자열을 보고합니다. |
응답 |
요청과 관련된 응답 객체를 보고합니다(요청에 응답이 없는 경우 값은 None임에 유의하십시오). |
url |
호스트, 경로 및 쿼리 문자열이 포함된 요청 URL을 보고합니다. |
ws_messages |
요청이 웹 소켓인 경우(이 경우 URL은 일반적으로 wss://와 유사함) ws_messages에는 송수신된 모든 웹 소켓 메시지가 포함됩니다. |
대신, 응답 객체는 다음과 같은 속성을 노출합니다:
| 속성 | 설명 |
|---|---|
body |
응답의 본문이 바이트로 표시됩니다. 응답에 본문이 없는 경우 body의 값은 비어 있습니다(예: b''). |
date |
응답을 수신한 날짜와 시간을 표시합니다. |
헤더 |
응답 헤더의 사전과 유사한 객체를 보고합니다(Selenium Wire에서는 헤더가 대소문자를 구분하지 않으며 중복이 허용됨). |
reason |
응답의 이유 문구(예: OK, Not Found 등)를 보고합니다. |
status_code |
응답 상태를 보고합니다(예: 200, 404 등). |
이 기능을 테스트하려면 다음과 같은 Python 스크립트를 작성할 수 있습니다:
from seleniumwire import webdriver
# Selenium Wire로 WebDriver 초기화
driver = webdriver.Chrome()
try:
# 대상 웹사이트 열기
driver.get("https://brightdata.com/")
# 캡처된 모든 요청 접근 및 출력
for request in driver.requests:
print(f"URL: {request.url}")
print(f"Method: {request.method}")
print(f"Headers: {request.headers}")
print(f"Response Status Code: {request.response.status_code if request.response else 'No Response'}")
print("-" * 50)
finally:
# 브라우저 닫기
driver.quit()
위 코드는 대상 웹사이트를 열고 driver.requests를 사용하여 요청을 캡처합니다. 그런 다음 for 루프를 통해 url, method, headers와 같은 일부 요청 속성을 가로챕니다.
예상 결과는 다음과 같습니다:

대상 페이지는 여러 요청을 수행하며, 스크립트는 이를 모두 추적합니다.
요청 및 응답 가로채기
Selenium Wire는 인터셉터를 통해 요청과 응답을 가로채고 수정할 수 있습니다. 인터셉터는 요청과 응답이 브라우저를 통과할 때 호출되는 함수입니다.
두 가지 별개의 인터셉터가 있습니다:
driver.request_interceptor: 요청을 가로채며 단일 인수를 받습니다.driver.response_interceptor: 응답을 가로채며 두 개의 인자를 받습니다. 하나는 원본 요청에 대한 것이고, 다른 하나는 응답에 대한 것입니다.
다음은 요청 인터셉터 사용 예시입니다:
from seleniumwire import webdriver
# 요청 인터셉터 함수 정의
def interceptor(request):
# 모든 요청에 사용자 정의 헤더 추가
request.headers["X-Test-Header"] = "MyCustomHeaderValue"
# 특정 도메인 요청 차단
if "example.com" in request.url:
print(f"{request.url} 요청 차단 중")
request.abort() # 요청 중단
# Selenium Wire로 WebDriver 초기화
driver = webdriver.Chrome()
# 인터셉터 함수를 드라이버에 할당
driver.request_interceptor = interceptor
try:
# 여러 요청을 생성하는 웹사이트 열기
driver.get("https://brightdata.com/")
# 캡처된 모든 요청 출력
for request in driver.requests:
print(f"URL: {request.url}")
print(f"헤더: {request.headers}")
print("-" * 50)
finally:
# 브라우저 닫기
driver.quit()
이 코드 조각의 역할:
- 인터셉터 함수: 모든 아웃바운드 요청에 대해 호출될 인터셉터 함수를 생성합니다.
request.headers[]를 사용하여 모든 아웃바운드 요청에 사용자 정의 헤더를 추가합니다. 또한example.com도메인에 대한 브라우저 요청을 차단합니다. - 요청 캡처: 페이지 로드 후 수정된 헤더를 포함한 모든 캡처된 요청을 출력합니다.
참고: 요청 차단은 페이지가 광고, 분석 스크립트, 타사 위젯 등 목표와 무관한 추가 리소스를 로드할 때 유용합니다. 이러한 요청을 차단하면 스크래핑 속도가 크게 향상되고 브라우저의 대역폭 사용량이 감소합니다.
예상 결과는 다음과 같습니다:

브라우저가 생성한 요청이 차단되고 추가 헤더 값이 어떻게 추가되었는지 확인하세요.
웹소켓 모니터링
많은 현대 웹 페이지가 서버와의 실시간 통신을 위해웹소켓을사용합니다.웹소켓은브라우저와 서버 간에 지속적 연결을 구축합니다. 이를 통해 기존 HTTP 요청의 오버헤드 없이 데이터를 지속적으로 교환할 수 있습니다.
종종 중요한 데이터가 이러한 채널을 통해 흐르며, 이를 직접 접근하는 것은 데이터 수집에 매우 유용할 수 있습니다. 웹소켓 통신을 가로채면 브라우저가 변환하거나 페이지가 렌더링하기를 기다리지 않고 서버가 전송한 원시 데이터를 추출할 수 있습니다.
요청 객체에 웹소켓 관리를 위한 ws_messages 속성이 있다는 점은 이미 배웠습니다. Selenium Wire 웹소켓 객체의 속성은 다음과 같습니다:
| 속성 | 설명 |
|---|---|
content |
메시지의 내용을 보고하며, 문자열( str ) 또는 바이트(bytes ) 형식일 수 있습니다. |
date |
메시지의 날짜/시간을 표시합니다. |
헤더 |
응답 헤더의 사전과 유사한 객체를 보고합니다(Selenium Wire에서는 헤더가 대소문자를 구분하지 않으며 중복이 허용됨). |
from_client |
이것은 클라이언트가 메시지를 보낸 경우 True를, 서버가 보낸 경우 False를 반환하는 부울 값입니다. |
프록시 관리
프록시 서버는사용자의 장치와 대상 사이트 사이의 중개자 역할을 하며, 이 과정에서 사용자의 IP 주소를 숨깁니다. 웹 스크래핑에 필수적인 이유는 다음과 같습니다:
- IP 기반 제한 우회 지원
- 속도 제한 장치로 인한 차단 방지
- 지리적 제한 사이트의 콘텐츠 스크래핑 가능
Selenium Wire에서 프록시를 구성하는 방법은 다음과 같습니다:
# Selenium Wire 옵션 설정
options = {
"proxy": {
"http": "<YOUR_HTTP_PROXY_URL>",
"https": "<YOUR_HTTPS_PROXY_URL>"
}
}
# Selenium Wire로 WebDriver 초기화
driver = webdriver.Chrome(seleniumwire_options=options)
이 설정은기본 Selenium에서 프록시를 구성하는 방식과 다릅니다.기본 Selenium에서는 Chrome의--proxy-server플래그에 의존해야 합니다. 즉, 기본 Selenium에서는 프록시 구성이 고정되어 있습니다.
프록시를 설정하면 전체 브라우저 세션에 적용되며, 브라우저를 재시작하지 않고는 변경할 수 없습니다. 특히 프록시를 동적으로 교체해야 하는 시나리오에서는 이러한 제한이 불편할 수 있습니다.
반면 Selenium Wire는 동일한 브라우저 인스턴스 내에서 프록시를 동적으로 변경할 수 있는 유연성을 제공합니다. 이는 proxy 속성 덕분에 가능합니다:
# 프록시 동적 변경
driver.proxy = {
"http": "<NEW_HTTP_PROXY_URL>",
"https": "<NEW_HTTPS_PROXY_URL>"
}
또한 Chrome의 --proxy-server 플래그는 URL에 인증 자격 증명이 포함된 프록시를 지원하지 않습니다:
protocol://username:password@host:port
대신 Selenium Wire는 인증된 프록시를 완벽하게 지원하므로 웹 스크래핑에 더 적합한 선택입니다.
프록시 구성은 Selenium Wire의 가장 큰 장점 중 하나이므로, 다음 장에서 이 주제를 더 자세히 살펴보겠습니다.
웹 스크래핑 사용 사례: Selenium Wire에서의 프록시 로테이션
앞서 언급한 바와 같이, 웹 스크래핑에 Selenium Wire를 사용하는 주된 이유는 고급 프록시 관리 기능 때문입니다.
이 안내 섹션에서는 프록시 로테이션을 위해 Selenium Wire 프로젝트를 설정하는 방법을 살펴보겠습니다. 이를 통해 요청마다 출구 IP를 변경할 수 있습니다.
요구 사항
이 튜토리얼을 따라하려면 시스템이 다음 필수 조건을 충족해야 합니다:
- Python 3.7 이상: 3.7보다 높은 모든 Python 버전이 가능합니다. 특히, pip를 통해 종속성을 설치할 예정인데, pip는 3.4보다 높은 모든 Python 버전과 함께 이미 설치되어 있습니다.
- 지원되는 웹 브라우저: Selenium Wire는 Selenium을 확장하므로지원되는 브라우저가 필요합니다.
Selenium Wire 설치 전에 다음과 같이가상 환경디렉터리를 생성할 수 있습니다:
python -m venv venv
활성화하려면 Windows에서 다음을 실행하세요:
venvScriptsactivate
macOS/Linux에서는 다음과 같이 실행합니다:
source venv/bin/activate
이제 Selenium Wire를 설치할 수 있습니다:
pip install selenium-wire
참고: Selenium을 별도로 설치할 필요는 없습니다. Selenium Wire의 의존성 중 하나이므로 함께 설치됩니다.
메인 폴더를 selenium_wire/라고 가정합니다 . 이 단계가 완료되면 폴더 구조는 다음과 같습니다:
selenium_wire/
├── selenium_wire.py
└── venv/
selenium_wire.py는 다음 단계에서 구현할 모든 로직을 담을 Python 파일입니다.
1단계: 프록시 무작위화
먼저 유효한 프록시 URL 목록이 필요합니다. 어디서 구할지 모르겠다면 저희무료 프록시 목록을 참고하세요. 목록에 추가한 후random.choice()를 사용해 무작위 요소를 선택합니다:
def get_random_proxy():
proxies = [
"http://PROXY_1:PORT_NUMBER_X",
"http://PROXY_2:PORT_NUMBER_Y",
"http://PROXY_3:PORT_NUMBER_Z",
# ...
]
# 목록 무작위화
return random.choice(proxies)
이 함수는 호출 시 목록에서 무작위 프록시 URL을 반환합니다.
작동시키려면 random을 반드시 임포트하세요:
import random
2단계: 프록시 설정
get_random_proxy() 함수를 호출하여 프록시 URL을 얻습니다:
proxy = get_random_proxy()
그런 다음 브라우저 인스턴스를 초기화하고 선택한 프록시를 설정하세요:
# 프록시를 사용한 Selenium Wire 구성
seleniumwire_options = {
"proxy": {
"http": proxy,
"https": proxy
}
}
# 브라우저 구성
chrome_options = Options()
chrome_options.add_argument("--headless") # 헤드리스 모드로 브라우저 실행
# 지정된 구성으로 브라우저 인스턴스 초기화
driver = webdriver.Chrome(service=Service(), options=chrome_options, seleniumwire_options=seleniumwire_options)
위의 코드 조각은 다음 임포트가 필요합니다:
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
브라우저 세션 중 프록시를 동적으로 변경하려면 대신 다음 코드를 사용합니다:
driver.proxy = {
"http": proxy,
"https": proxy
}
놀랍게도, 제어되는 Chrome 인스턴스가 이제 요청을 지정된 프록시를 통해 라우팅합니다.
3단계: 대상 페이지 방문
대상 웹사이트를 방문하고 출력을 추출한 후 브라우저를 닫습니다:
try:
# 대상 페이지 방문
driver.get("https://httpbin.io/ip")
# 페이지 출력 추출
body = driver.find_element(By.TAG_NAME, "body").text
print(body)
except Exception as e:
# 브라우저 또는 프록시에서 발생한 오류 처리
print(f"프록시 {proxy} 오류: {e}")
finally:
# 브라우저 종료
driver.quit()
작동시키려면 Selenium에서 By를 임포트하세요:
from selenium.webdriver.common.by import By
이 예시에서 대상 페이지는 HTTPBin 프로젝트의/ip엔드포인트입니다. 이 페이지는 호출자의 IP 주소를 반환하므로 의도적으로 선택한 것입니다. 모든 것이 예상대로 진행되면 스크립트는 실행할 때마다 프록시 목록과 다른 IP를 출력해야 합니다.
이제 확인해 볼 시간입니다!
4단계: 모든 것을 통합하기
다음은 selenium_wire.py 파일에 포함되어야 할 Selenium Wire 프록시 회전 로직 전체입니다:
import random
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
def get_random_proxy():
proxies = [
"http://PROXY_1:PORT_NUMBER_X",
"http://PROXY_2:PORT_NUMBER_Y",
"http://PROXY_3:PORT_NUMBER_Z",
# 여기에 프록시를 더 추가하세요...
]
# 프록시 무작위 선택
return random.choice(proxies)
# 무작위 프록시 URL 선택
proxy = get_random_proxy()
# 프록시 설정된 Selenium Wire 구성
seleniumwire_options = {
"proxy": {
"http": proxy,
"https": proxy
}
}
# 브라우저 설정
chrome_options = Options()
chrome_options.add_argument("--headless") # 헤드리스 모드로 브라우저 실행
# 지정된 설정으로 브라우저 인스턴스 초기화
driver = webdriver.Chrome(service=Service(), options=chrome_options, seleniumwire_options=seleniumwire_options)
try:
# 대상 페이지 방문
driver.get("https://httpbin.io/ip")
# 페이지 출력 추출
body = driver.find_element(By.TAG_NAME, "body").text
print(body)
except Exception as e:
# 브라우저 또는 프록시에서 발생한 오류 처리
print(f"프록시 {proxy} 오류: {e}")
finally:
# 브라우저 종료
driver.quit()
파일 실행 방법:
python3 selenium_wire.py
실행 시마다 출력은 다음과 같아야 합니다:
{
"origin": "PROXY_1:XXXX"
}
또는:
{
"origin": "PROXY_2:YYYY"
}
등등…
스크립트를 여러 번 실행하면 매번 다른 IP 주소가 표시됩니다. 프록시 로테이션이 작동 중입니다!
프록시 로테이션을 위한 더 나은 접근법: Bright Data 프록시
방금 살펴본 바와 같이 Selenium Wire에서 수동 프록시 로테이션은 많은 반복 코드가 필요하며 유효한 프록시 URL 목록을 관리해야 합니다.
다행히Bright Data의 로테이션 프록시는더 효율적인 솔루션입니다!
당사의 회전 프록시는 IP 주소 변경을 자동으로 처리하여 수동 프록시 관리의 필요성을 없앱니다. 195개국을 커버하는 당사의 네트워크는 탁월한 가동 시간과 99.9%의 성공률을 보장합니다. 당사의 글로벌 프록시 네트워크에는 다음이 포함됩니다:
- 데이터센터 프록시– 770,000개 이상의 데이터센터 IP.
- 주거용 프록시– 195개국 이상에 7,200만 개 이상의 주거용 IP.
- ISP 프록시– 70만 개 이상의 ISP IP.
아래 단계를 따라 Selenium Wire에서 Bright Data 프록시를 사용하는 방법을 알아보세요.
이미 계정이 있다면 Bright Data에 로그인하세요. 계정이 없다면 무료로 계정을 생성하세요. 다음 사용자 대시보드를 이용할 수 있습니다:

“프록시 제품 보기” 버튼을 클릭하세요:

아래와 같은 “프록시 및 스크래핑 인프라” 페이지로 이동합니다:

아래로 스크롤하여 “주거용 프록시” 카드를 찾은 후 “시작하기” 버튼을 클릭하세요:

주거용 프록시 설정 대시보드로 이동합니다. 안내된 마법사를 따라 필요에 맞게 프록시 서비스를 설정하세요. 프록시 설정 방법에 대해 궁금한 점이 있으면24시간 연중무휴 지원팀에 문의하세요:

“액세스 매개변수” 탭으로 이동하여 다음과 같이 프록시의 호스트, 포트, 사용자 이름, 비밀번호를 확인하세요:

“호스트” 필드에는 이미 포트가 포함되어 있음을 유의하세요.
이 정보만으로 프록시 URL을 생성하여 Selenium Wire에 설정할 수 있습니다. 모든 정보를 조합하여 다음 구문으로 URL을 생성하세요:
<사용자명>:<비밀번호>@<호스트>
예를 들어, 이 경우 다음과 같습니다:
brd-customer-hl_4hgu8dwd-zone-residential:[email protected]:XXXXX
“Active proxy”를 토글하고 마지막 지침을 따르시면 준비 완료입니다!

Bright Data 통합을 위한 Selenium Wire 프록시 스니펫은 다음과 같습니다:
# Bright Data 프록시 URL
proxy = "brd-customer-hl_4hgu8dwd-zone-residential:[email protected]:XXXXX"
# Selenium Wire 옵션 설정
options = {
"proxy": {
"http": proxy,
"https": proxy
}
}
# Selenium Wire로 WebDriver 초기화
driver = webdriver.Chrome(seleniumwire_options=options)
이 접근법으로 프록시 로테이션이 훨씬 쉬워집니다!
웹 스크래핑을 위한 Selenium vs Selenium Wire
요약하자면, 아래 Selenium과 Selenium Wire 비교표를 참고하세요:
| Selenium | Selenium Wire | |
|---|---|---|
| 목적 | 웹 브라우저 자동화를 통한 UI 테스트 및 웹 상호작용 수행 도구 | Selenium을 확장하여 HTTP/HTTPS 요청 및 응답을 검사하고 수정하는 추가 기능 제공 |
| HTTP/HTTPS 요청 처리 | HTTP/HTTPS 요청이나 응답에 대한 직접적인 접근을 제공하지 않음 | HTTP/HTTPS 요청 및 응답의 검사, 수정 및 캡처 허용 |
| 프록시 지원 | 제한된 프록시 지원(수동 구성 필요) | 동적 설정 지원이 포함된 고급 프록시 관리 |
| 성능 | 가볍고 빠름 | 네트워크 트래픽 캡처 및 처리 오버헤드로 인해 약간 느림 |
| 사용 사례 | 주로 웹 애플리케이션의 기능 테스트에 사용되지만, 기본적인 웹 스크래핑에도 유용함 | API 테스트, 네트워크 트래픽 디버깅, 웹 스크래핑에 유용함 |
결론
이 블로그 글에서는 Selenium Wire가 무엇이며 웹 스크래핑에 어떻게 활용될 수 있는지 알아보았습니다. 특히 프록시 통합 및 회전 프록시에 중점을 두었습니다. Selenium Wire가 유용하지만 만능 솔루션은 아니라는 점을 명심하세요. 또한 더 이상 적극적으로 유지 관리되지 않습니다.
더 나은 접근 방식은 Selenium Wire를 확장하는 것이 아니라, 기본 Selenium이나 다른 브라우저 자동화 도구와 전용 스크래핑 브라우저를 함께 사용하는 것입니다.
Bright Data의 Scraping Browser는Playwright, Puppeteer, Selenium 등과 호환되는 확장 가능한 클라우드 브라우저입니다. 요청마다 자동으로 출구 IP를 회전시키며, 브라우저 지문 인식, 재시도,CAPTCHA 해결 등을 처리할 수 있습니다. 차단 걱정 없이 스크래핑 작업을 효율화하세요.
지금 가입하여 무료 체험을 시작하세요!