클래식한 Selenium과 Puppeteer 조합은 Cloudflare, DataDome 및 PerimeterX와 같은 안티봇 시스템에 점점 더 자주 걸리게 됩니다. 이를 대체하기 위해 Scrapling, Botasaurus 및 nodriver와 같은 새로운 프레임워크가 등장했으며, 이들은 처음부터 탐지를 우회하는 데 중점을 두고 설계되었습니다. 그러나 가장 진보된 프레임워크도 올바르게 설정된 프록시 없이는 쓸모가 없습니다. 이 기사에서는 세 가지 도구 각각에서 프록시를 연결하는 방법, 효율성을 저해하는 오류, 특정 파싱 작업에 적합한 IP 유형을 선택하는 방법을 살펴보겠습니다.
Scrapling, Botasaurus 및 nodriver가 Selenium과 다른 점
세 가지 프레임워크 모두 Selenium과 일반 Puppeteer가 너무 쉽게 탐지된다는 응답으로 등장했습니다. 안티봇 시스템은 CDP 프로토콜, navigator.webdriver, 캔버스 렌더링, 이벤트 타이밍 등 수십 가지 매개변수를 검사합니다. 그리고 클래식 드라이버는 거의 모든 매개변수에서 특징적인 흔적을 남깁니다.
Scrapling은 HTML의 적응형 파싱과 Camoufox 기반의 StealthyFetcher를 통해 브라우저를 에뮬레이션하는 기능을 결합한 Python 라이브러리입니다. 이는 리소스 소비를 최소화하면서 빠른 파싱이 필요한 작업에 적합하지만, 사이트의 TLS 지문을 적극적으로 검사하는 경우에 유용합니다.
Botasaurus는 수정된 Chromium(undetected-chromedriver가 내부에서 작동하는) 기반의 프레임워크로, 브라우저 프로필을 자동으로 관리하고 외부 서비스로 캡차를 해결하는 기능을 내장하여 대규모 병렬 스크래핑에 최적화되어 있습니다.
nodriver는 같은 저자가 만든 undetected-chromedriver의 후계자로, Selenium WebDriver를 완전히 포기하고 CDP(Chrome DevTools Protocol)를 통해 직접 작동하여 탐지 가능한 자동화 아티팩트의 상당 부분을 제거합니다.
세 가지 공통점은 브라우저 지문 수준에서 탐지를 줄이지만 IP 평판 문제를 해결하지는 못한다는 것입니다. 데이터 센터 IP에서 요청이 발생하고 DataDome이나 Cloudflare의 블랙리스트에 이미 등록되어 있다면, 브라우저 패치로는 캡차나 403 오류를 피할 수 없습니다.
Scrapling에서 프록시 설정하기
Scrapling은 빠른 HTTP 모드(Fetcher)와 브라우저 모드(StealthyFetcher) 모두에서 프록시를 지원합니다. JS 렌더링 없이 정적 파싱을 위해서는 프록시를 요청 매개변수에 직접 전달합니다:
from scrapling.fetchers import Fetcher
response = Fetcher.get(
"https://example.com",
proxy="http://user:[email protected]:9000"
)
print(response.status)
완전한 브라우저 모드(StealthyFetcher on Camoufox)에서는 프록시를 서버, 로그인 및 비밀번호의 개별 필드를 가진 사전으로 전달해야 합니다. 이는 Camoufox가 일반 Chromium과는 다르게 프록시 인증을 처리하기 때문입니다:
from scrapling.fetchers import StealthyFetcher
response = StealthyFetcher.fetch(
"https://example.com",
proxy={
"server": "gate.proxycove.com:9000",
"username": "user",
"password": "pass"
},
headless=True
)
print(response.status)
흔한 오류는 브라우저 모드에서 프록시를 전체 문자열로 전달하는 것입니다. Camoufox는 이 경우 인증을 무시하거나 프록시 서버에 연결하는 단계에서 타임아웃이 발생합니다. ERR_NO_SUPPORTED_PROXIES 오류가 발생하면 반드시 개별 필드가 있는 사전 형식을 확인하세요.
Botasaurus에서 프록시 설정하기
Botasaurus는 드라이버 구성을 위해 @browser 데코레이터를 사용하며,
프록시는 이 데코레이터의 매개변수로 전달되거나 실행 함수에 직접 전달됩니다:
from botasaurus.browser import browser, Driver
@browser(
proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
driver.get("https://example.com")
return driver.page_html
scrape_data()
각 병렬 작업에 대해 서로 다른 프록시를 연결해야 하는 경우(이는 Botasaurus를 통한 대규모 스크래핑 시 중요합니다), 프록시는 데코레이터에 하드코딩하지 말고 데이터 목록을 통해 동적으로 전달하는 것이 좋습니다:
from botasaurus.browser import browser, Driver
@browser
def scrape_with_proxy(driver: Driver, data):
driver.config.proxy = data["proxy"]
driver.get(data["url"])
return driver.page_html
tasks = [
{"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
{"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)
Botasaurus는 multiprocessing을 통해 작업을 훌륭하게 병렬화하므로 대규모 스크래핑 시 충분한 IP 풀을 가진 프록시를 사용하는 것이 중요합니다. 그렇지 않으면 여러 스레드가 동일한 주소에 충돌하게 되어 요청 빈도 패턴에 따라 자동화가 즉시 감지됩니다.
nodriver에서 프록시 설정하기
nodriver는 Selenium 레이어 없이 CDP에 직접 연결하여 작동하므로 프록시는 별도의 API가 아닌 브라우저 실행 인수로 설정됩니다. 인증이 필요 없는 프록시는 간단합니다:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
await asyncio.sleep(3)
browser.stop()
asyncio.run(main())
문제는 Chromium이 --proxy-server를 통해 직접적으로 로그인/비밀번호를 지원하지 않는다는 것입니다.
nodriver에서 인증된 프록시를 사용하려면 인증 없이 로컬 프록시 터널을 설정하거나(px 또는 3proxy를 통해) CDP 이벤트 Fetch.authRequired를 처리해야 합니다:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
async def auth_handler(event):
await page.send(uc.cdp.fetch.continue_with_auth(
request_id=event.request_id,
auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
response="ProvideCredentials",
username="user",
password="pass"
)
))
page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
await asyncio.sleep(5)
browser.stop()
asyncio.run(main())
이는 세 가지 프레임워크 중 가장 불명확한 점으로, 많은 개발자들이 Fetch 도메인에 대해 알지 못해 인증이 작동하지 않는 이유를 이해하는 데 몇 시간을 낭비합니다.
프록시 회전 및 안티봇과의 싸움
완벽하게 설정된 브라우저 지문도 보호된 도메인에 대해 IP당 분당 50-100개 이상의 요청이 발생하면 소용이 없습니다. DataDome과 Cloudflare는 특정 주소에서 요청 빈도와 행동 간의 시간 패턴을 분석합니다. 너무 균일한 간격도 의심스럽습니다.
세 가지 프레임워크에 대한 작업 회전 방식은 동일하게 구성됩니다:
- 제공업체 수준에서 IP 자동 회전을 지원하는 게이트웨이를 사용하세요. 각 요청마다 주소 변경 로직을 작성할 필요가 없습니다.
- 세션 작업(로그인, 다중 페이지 탐색)에서는 연결 문자열에서 sticky 매개변수를 통해 세션당 IP를 고정하세요.
- 정적 페이지의 간단한 파싱을 위해서는 각 요청마다 또는 5-10 요청마다 IP를 회전하세요.
- 요청 간에 무작위 지연(1-4초)을 추가하세요. 이는 시간 패턴에 따른 탐지를 줄입니다.
연결 문자열에서 sticky 세션의 예로, session-id가 동일한 출발 IP를 10분 동안 유지하는 경우입니다:
proxy = "http://user-session-abc123:[email protected]:9000"
Botasaurus에서는 이 방식이 특히 유용합니다. 병렬 스크래핑 시 각 프로세스가 고유한 session-id를 받을 수 있어, 주소 목록을 수동으로 관리하지 않고도 다양한 IP 풀을 안정적으로 유지할 수 있습니다.
각 프레임워크에 적합한 프록시 유형 선택하기
프록시 유형은 프레임워크 선택만큼이나 파싱 성공에 영향을 미칩니다. 아래는 작업에 따른 비교입니다:
| 작업 | 추천 프록시 유형 | 이유 |
|---|---|---|
| Cloudflare/DataDome이 있는 사이트 파싱 | 레지던트 프록시 | 실제 가정 사용자의 IP는 안티봇 블랙리스트에 잘 걸리지 않습니다. |
| 엄격한 보호가 없는 대규모 파싱 | 데이터 센터 프록시 | 높은 속도, 낮은 비용으로 대량 요청에 적합합니다. |
| 모바일 사이트에서 실제 사용자 에뮬레이션 | 모바일 프록시 | 통신사의 CGNAT 주소는 안티봇에게 최대 신뢰도를 가집니다. |
Scrapling의 StealthyFetcher 모드에서는 레지던트 프록시가 가장 큰 효과를 발휘합니다. Camoufox가 이미 브라우저 지문 문제를 해결했기 때문입니다. Botasaurus의 경우 대규모 병렬 스크래핑 시 데이터 센터 프록시가 종종 속도/가격 비율에서 최적입니다. 단, 대상 사이트가 DataDome 수준의 고급 보호를 사용하지 않는 경우에 한합니다.
프록시와 브라우저 자동화 연결 시 흔히 발생하는 오류
실제로 대부분의 파싱 실패는 프레임워크 자체가 아닌 프록시의 잘못된 구성과 관련이 있습니다. 다음은 가장 자주 발생하는 오류 목록입니다:
- 모든 병렬 Botasaurus 스레드에 동일한 IP 사용. 안티봇은 한 주소에서 20개의 동시 세션을 감지하고 몇 분 안에 차단합니다.
- Scrapling의 브라우저 모드에서 프록시를 문자열로 전달. Camoufox는 분리된 필드가 있는 사전을 요구합니다. 그렇지 않으면 인증이 통과하지 않습니다.
- nodriver에서 CDP Fetch 도메인 무시. authRequired 핸들러가 없으면 인증된 프록시가 연결되지 않고 브라우저가 로딩 중에 멈춥니다.
- 세션 작업에서 회전 없음. 인증된 세션 중간에 IP를 변경하면 자동화가 즉시 감지됩니다. sticky 세션을 사용하세요.
- 프록시의 지리적 위치와 브라우저 로케일 불일치. 독일의 IP가 Accept-Language: ru 헤더를 가진 경우, 이는 프로드 스코어링 시스템에서 봇의 전형적인 징후입니다.
- 회전이 있더라도 너무 공격적인 요청 빈도. IP 회전이 요청 간의 지연을 없애는 것은 아닙니다. 행동 패턴도 분석됩니다.
브라우저 모드에서 프록시를 사용할 때 DNS 누수를 별도로 확인해야 합니다. 때때로 브라우저는 시스템 DNS를 통해 도메인을 해결하여 프록시 터널이 아닌 요청 IP와 해결 IP 간의 비동기 상태를 초래할 수 있으며, 이는 보호 시스템에 의해 쉽게 감지됩니다.
결론
Scrapling, Botasaurus 및 nodriver는 브라우저 지문 수준에서 탐지 문제를 해결하는 데 있어 전통적인 Selenium보다 훨씬 더 효과적이지만, 그들 중 어느 것도 품질 좋은 프록시의 중요성을 대체하지는 않습니다. 올바른 인증 설정(특히 nodriver에서 CDP를 통해), IP 회전 및 특정 안티봇 시스템에 적합한 프록시 유형 선택은 장기적으로 안정적인 파싱을 결정짓는 세 가지 요소입니다.
Cloudflare 또는 DataDome과 같은 고급 보호가 있는 사이트를 파싱하는 경우, 레지던트 프록시로 시작하세요. 이들은 IP의 평판 덕분에 성공적인 요청 비율이 가장 높습니다. 엄격한 보호가 없는 대규모 작업의 경우 데이터 센터 프록시가 여전히 속도와 비용 비율에서 최적의 선택입니다.