빠른 답변
Selenium에서 사용자 이름과 비밀번호가 필요한 프록시를 어떻게 사용하나요?
Proxy-Authorization 헤더를 추가하는 작은 로컬 포워더를 실행하고, --proxy-server=http://127.0.0.1:8899 옵션으로 Chrome을 연결하세요. Chrome은 해당 플래그 안의 자격증명을 무시하고 Selenium에는 프록시 비밀번호를 위한 범용 옵션이 없습니다. CrawlRelay 레지덴셜 프록시는 gw.crawlrelay.com:7777에서 이렇게 작동하며, US$0.50/GB에서 구입 가능, KYC 없이 크립토로 결제됩니다.
Selenium 설치 요약
| 왜 포워더가 필요한가요 | Chrome의 --proxy-server 플래그에는 사용자 이름이나 비밀번호를 넣을 수 없습니다 |
|---|---|
| 포워더 | 127.0.0.1:8899에서 수신해 Proxy-Authorization를 추가하고 gw.crawlrelay.com:7777에 전달합니다 |
| 크롬 옵션 | --proxy-server=http://127.0.0.1:8899 |
| 회전 | 각 새로운 CONNECT 터널은 새로운 연결이므로 보통 새로운 출구 IP입니다; 세션 ID를 추가해 하나의 IP를 유지할 수도 있습니다 |
| 간단한 대안 | Playwright는 사용자 이름과 비밀번호를 직접 입력합니다 |
로컬 포워더는 어떻게 작동하나요?
브라우저의 프록시 요청을 받아서, 자격 증명이 포함된 헤더 하나를 삽입한 후 양방향으로 바이트를 복사합니다. HTTPS 사이트의 경우 브라우저가 CONNECT host:443를 보내고, 게이트웨이가 200 Connection established로 응답하며, TLS는 Chrome과 웹사이트 간에 종단 간으로 실행됩니다. 포워더는 페이지 내용을 평문으로 절대 볼 수 없습니다.
이 최소한의 버전은 HTTPS 사이트를 처리하며, 각 연결이 하나의 CONNECT 터널을 가집니다. 이것이 오늘날 거의 모든 웹사이트를 포함합니다. 127.0.0.1에 바인딩해 다른 기기가 자격 증명을 사용할 수 없게 하세요.
import asyncio
import base64
import os
UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())
async def pipe(reader, writer):
try:
while True:
data = await reader.read(65536)
if not data:
break
writer.write(data)
await writer.drain()
except ConnectionError:
pass
finally:
writer.close()
async def handle(client_reader, client_writer):
try:
head = await client_reader.readuntil(b"\r\n\r\n") # request line and headers from the browser
except asyncio.IncompleteReadError:
client_writer.close()
return
lines = head.split(b"\r\n")
lines.insert(1, AUTH) # add the credentials right after the request line
up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
up_writer.write(b"\r\n".join(lines))
await up_writer.drain()
await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))
async def main():
server = await asyncio.start_server(handle, "127.0.0.1", 8899)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())Selenium을 포워더에 어떻게 지정하나요?
한 터미널에서 forwarder.py를 시작한 다음, 로컬 프록시 주소로 Selenium 스크립트를 실행하세요. Selenium 4.6 이상에 내장된 Selenium Manager가 맞는 ChromeDriver를 다운로드하므로 별도 설치가 필요 없습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899") # the local forwarder
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.set_page_load_timeout(60)
driver.get("https://api.ipify.org")
print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
driver.quit()Selenium 세션마다 IP를 하나씩 받거나 페이지마다 새 IP를 받으려면?
포워더는 주어진 사용자명대로 작동하므로, 세션 동작은 사용자명으로 결정됩니다:
- 연결당 회전: 세션 부분(
USERNAME-country-us)을 빼세요. Chrome은 페이지당 여러 연결을 열어 한 페이지가 여러 출구를 통해 로드될 수 있습니다. - Selenium 세션당 하나의 IP: 포워더 시작 전에
CRAWLRELAY_USER을USERNAME-country-us-session-run42-ttl-30로 설정하세요. 이후 모든 연결이 최대 30분 동안 같은 IP를 사용하며, 조기 변경 가능성은 있습니다. - 병행 세션 여러 개: 각 세션마다 8899, 8900 등 다른 로컬 포트에서 포워더를 실행하고 각 WebDriver에 해당 포트를 지정하세요.
selenium-wire나 브라우저 확장 기능은 어떤가요?
트래픽을 가로채서 프록시 인증을 도입했던 인기 패키지 selenium-wire는 2024년 1월 작성자가 저장소를 아카이브하며 더 이상 업데이트되지 않습니다. 프록시 인증 요청을 처리하는 브라우저 확장도 작동하지만, 각 프로필에 설치해야 합니다. 위 포워더는 의존성이 없고 Selenium이 제어하는 모든 브라우저와 호환됩니다. 새 프로젝트는 Playwright가 더 간편하며 프록시 사용자명과 비밀번호를 직접 받습니다.
Selenium과 프록시에 관한 질문들
Selenium에서 프록시를 쓰면 Chrome이 로그인 팝업을 보여주는 이유는?
프록시가 인증을 요청했으나 Chrome에 자격 증명이 없기 때문입니다. --proxy-server 플래그는 호스트와 포트만 인수로 받습니다. 헤드리스 모드에선 같은 문제가 ERR_TUNNEL_CONNECTION_FAILED로 나타납니다. 자격 증명을 추가하는 로컬 포워더를 쓰거나, 사용자명과 비밀번호를 허용하는 Playwright를 사용하세요.
포워더가 스크래핑 속도를 늦추나요?
거의 아닙니다. 포워더는 두 개의 로컬 소켓과 하나의 원격 소켓 간에 바이트를 복사할 뿐, 암호를 해독하지 않습니다. 페이지 로딩 시간은 레지덴셜 출구와 대상 사이트 성능에 따라 결정되며, 같은 머신에서 실행되는 포워더는 영향을 주지 않습니다.
Selenium에서 Chrome 대신 Firefox를 사용할 수 있나요?
예. FirefoxOptions를 통해 Firefox 프록시 설정을 다음과 같이 하세요: network.proxy.type은 1로, network.proxy.http와 network.proxy.ssl은 8899번 포트를 포함한 127.0.0.1로 설정합니다. 포워더를 항상 앞에 두세요. Firefox는 프록시 인증 대화상자를 띄우며, Selenium이 이를 신뢰할 만하게 채우지 못합니다.
포워더 내에서 비밀번호가 안전한가요?
포워더가 127.0.0.1에서 수신 대기하는 동안은 당신의 머신에만 남아 있습니다. 환경 변수에서 읽고 절대 커밋하지 마세요. 유출된 비밀번호로 전체 요금제가 소진되지 않도록 스크래퍼마다 트래픽 한도가 있는 별도 서브 유저를 사용하세요.
Selenium에 레지덴셜 프록시 출구를 적용하세요
US$1.50는 테스트용 1 GB, US$0.50/GB는 50 GB에서 왔습니다.