← 블로그로 돌아가기

Google Colab 및 Jupyter에서 IP 차단 없이 크롤링을 위한 프록시 설정

Google Colab과 Jupyter Notebook에서 파싱을 위한 프록시 설정을 다룹니다: 클라우드 IP가 더 자주 차단되는 이유, requests와 Selenium 연결 방법, 고려해야 할 제한 사항.

📅2026년 11월 7일

Google Colab 및 Jupyter Notebook은 Python을 로컬 머신에 설치하지 않고도 웹 스크래핑 스크립트를 신속하게 작성하고 실행할 수 있는 편리한 도구입니다. 그러나 클라우드 노트북에는 자주 잊혀지는 특성이 있습니다: 모든 요청이 Google 데이터 센터의 IP 주소에서 발생하며, 이 IP는 이미 많은 안티봇 시스템에 알려져 있어 거의 즉시 차단됩니다. 이 기사에서는 Colab 및 Jupyter에서 프록시를 올바르게 연결하는 방법, 클라우드 환경이 부과하는 제한 사항, 그리고 첫 50개의 요청 이후에도 스크래핑이 중단되지 않도록 하는 방법을 살펴보겠습니다.

왜 Google Colab이 일반 PC보다 더 자주 차단되는가

Colab의 스크래핑에 대한 주요 문제는 공용 IP 주소 풀입니다. 노트북을 실행할 때마다 Google은 클라우드 범위(AS15169 등)에서 IP가 할당된 가상 머신을 제공합니다. 이러한 범위는 대부분의 안티봇 시스템에 이미 블랙리스트에 올라 있으며, Cloudflare, DataDome, PerimeterX와 같은 시스템은 이를 몇 초 만에 인식합니다. 요청은 사이트에 도달하지도 못하고 ASN(자율 시스템 번호) 필터에 의해 차단됩니다.

두 번째 이유는 사용의 대중성입니다. 수천 명의 개발자가 동시에 Colab을 통해 스크래퍼, 봇 및 ML 스크립트를 실행하고 있기 때문에 이러한 IP의 평판은 이미 많은 대상 사이트에서 "타버린" 상태입니다. 10초마다 하나의 정중한 GET 요청을 하더라도, 한 시간 전에 같은 범위에서 누군가가 500개의 스레드로 서버를 공격했기 때문에 사이트가 403을 반환할 수 있습니다.

세 번째 이유는 로컬에서 실행되는 Jupyter는 일반적으로 이러한 문제를 겪지 않지만, 호스팅 서버의 JupyterHub 또는 클라우드 제공자의 컨테이너를 통해 작업을 시작하면 상황은 Colab과 동일해집니다. 따라서 클라우드 노트북에 대한 "프록시가 필요한가?"라는 질문에 대한 답은 명확합니다: 첫 몇 개의 요청 이후에는 프록시 없이 스크래핑이 거의 작동하지 않습니다.

클라우드 스크래핑에 적합한 프록시 유형

프록시 유형의 선택은 무엇을 스크래핑하는지와 대상 사이트의 보호 수준에 따라 다릅니다. Colab 및 Jupyter에서는 또 다른 점을 고려해야 합니다: 노트북 세션은 시간 제한이 있으므로, 장기 지속적인 스티키 세션 프록시가 항상 중요하지는 않습니다. 오히려 하나의 실행 내에서 연결의 안정성이 더 중요합니다.

프록시 유형 Colab/Jupyter에서 사용할 때 특징
데이터 센터 프록시 강력한 보호가 없는 사이트, 공개 API, 정적 페이지 스크래핑 높은 속도, 낮은 가격, 그러나 공격적인 사이트에서 ASN으로 차단될 수 있음
주거용 프록시 Wildberries, Ozon, Avito, Google, 안티봇 보호가 있는 소셜 미디어 스크래핑 실제 사용자 IP, 블랙리스트에 올라갈 확률이 낮음, 지연 시간이 더 높음
모바일 프록시 모바일 버전 사이트, TikTok, Instagram API 스크래핑 가장 높은 신뢰도, 그러나 더 비싸고 회전 속도가 느림

대부분의 마켓플레이스 및 검색 엔진 스크래핑 작업에 대해 Colab에서의 최적의 균형은 각 요청마다 회전하는 주거용 프록시의 조합입니다. 이는 행동 패턴으로 인한 차단 가능성을 줄여줍니다. 비록 요청이 Google 클라우드 환경에서 실행되더라도 말입니다.

requests 및 urllib에서 프록시 설정하기

Colab에서의 기본 프록시 설정은 로컬 Python 환경과 다르지 않습니다. 차이점은 Colab에서는 일반적으로 !pip install를 통해 라이브러리를 추가로 설치해야 한다는 것입니다. 기본 이미지에는 필요한 모든 것이 포함되어 있지 않을 수 있습니다.

!pip install requests

import requests

proxy = {
    "http": "http://login:[email protected]:9000",
    "https": "http://login:[email protected]:9000"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}

response = requests.get(
    "https://example.com/catalog",
    proxies=proxy,
    headers=headers,
    timeout=15
)

print(response.status_code)
print(response.text[:500])

중요한 점: Colab에는 지속적인 구성 파일이 없기 때문에 프록시의 로그인과 비밀번호를 하드코딩해야 하거나 (노트북을 공개할 때 안전하지 않음), google.colab.userdata를 통해 Colab의 환경 변수에 저장하거나 Colab Secrets를 통해 연결해야 합니다. 이는 코드에 비밀번호를 직접 저장하는 것보다 편리하며, 특히 동료와 노트북을 공유할 때 유용합니다.

from google.colab import userdata

proxy_login = userdata.get('PROXY_LOGIN')
proxy_pass = userdata.get('PROXY_PASS')

proxy_url = f"http://{proxy_login}:{proxy_pass}@gate.proxycove.com:9000"
proxies = {"http": proxy_url, "https": proxy_url}

Colab에서 Selenium 및 헤드리스 Chrome과 함께 프록시 사용하기

사이트가 JavaScript를 통해 콘텐츠를 렌더링하는 경우(예: Wildberries, Ozon, Avito), 단순한 requests로는 충분하지 않습니다. 헤드리스 브라우저가 필요합니다. Colab에서는 일반적으로 Selenium과 Chromium을 사용하며, 기본 이미지에는 포함되어 있지 않기 때문에 수동으로 설치해야 합니다.

!apt-get update
!apt install chromium-chromedriver
!pip install selenium

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

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--proxy-server=http://gate.proxycove.com:9000')

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://example.com/catalog")
print(driver.page_source[:500])
driver.quit()

문제는 --proxy-server 플래그가 로그인과 비밀번호를 직접 지원하지 않는다는 것입니다. Selenium에서 인증이 필요한 프록시를 사용하려면 IP 인증(노트북의 정적 IP에 대한 화이트리스트 설정, Colab에서는 불안정함) 또는 프록시의 인증 정보를 포함한 Chrome 확장을 "실시간"으로 생성하거나, selenium-wire와 같은 라이브러리를 통해 인증된 프록시를 지원해야 합니다.

!pip install selenium-wire

from seleniumwire import webdriver

proxy_options = {
    'proxy': {
        'http': 'http://login:[email protected]:9000',
        'https': 'http://login:[email protected]:9000',
    }
}

driver = webdriver.Chrome(seleniumwire_options=proxy_options, options=chrome_options)
driver.get("https://example.com/catalog")

Jupyter Notebook: 로컬 vs 클라우드

로컬 머신에서 실행되는 Jupyter Notebook(Anaconda를 통해 또는 pip를 통해 직접 실행)은 귀하의 가정 또는 사무실 IP 주소를 사용합니다. 이 경우 프록시는 단지 마스킹이나 지리적 제한 우회를 위해 필요할 뿐, 데이터 센터의 ASN 차단으로부터 보호하기 위해서는 필요하지 않습니다. 이 경우 설정은 일반 Python 스크립트와 완전히 동일합니다: 동일한 requests, 동일한 Selenium, 드라이버 및 시스템 패키지 설치에 대한 제한이 없습니다.

클라우드 서비스에서 Jupyter를 사용하는 경우 상황이 달라집니다: VPS의 JupyterHub, Kaggle Notebooks, Deepnote, Binder 또는 기업 클라우드 클러스터. 이 경우 IP는 다시 제공자의 데이터 센터에 속하며, Colab의 모든 문제가 동일하게 적용됩니다. Colab과의 주요 차이점은 이러한 서비스가 종종 세션 동안 더 안정적인 IP를 제공한다는 것입니다(커널을 재시작할 때 변경되지 않음), 이는 프록시 제공자가 이를 지원하는 경우 IP 화이트리스트 설정을 간소화합니다.

실용적인 결론: 스크래핑이 비즈니스에 중요하다면(예: 마켓플레이스에서 경쟁자의 가격을 매일 모니터링하는 경우), 무료 클라우드 노트북을 프로덕션 환경으로 사용하는 것보다는 스크립트 개발 및 테스트에만 사용하는 것이 좋으며, 최종 스크래퍼는 고정 IP와 설정된 프록시가 있는 서버로 옮기는 것이 좋습니다.

스크래핑을 방해하는 클라우드 노트북의 제한 사항

Google Colab은 IP 평판 문제 외에도 스크래핑의 안정성에 직접적인 영향을 미치는 여러 기술적 제한 사항이 있습니다:

  • 비활성 타임아웃. 무료 버전의 Colab은 약 90분의 유휴 상태 후에 노트북을 종료하고, 12시간의 연속 작업 후에 세션을 강제로 종료합니다. 수천 페이지를 스크래핑하는 긴 작업은 부분적으로 나누거나 Google Drive에 중간 결과를 저장해야 합니다.
  • 새로운 런타임마다 IP 변경. 환경 실행을 끄고 다시 연결하면 가상 머신의 IP 주소가 변경됩니다. 이는 프록시 서비스 측에서 IP 화이트리스트 설정을 깨뜨립니다.
  • 아웃바운드 연결 제한. Google은 하나의 가상 머신에서 동시에 허용되는 네트워크 연결 수를 제한하므로, 수십 개의 병렬 요청을 사용하는 공격적인 멀티스레딩은 사이트의 차단이 아니라 Colab 자체의 한도에 부딪힐 수 있습니다.
  • 디스크 마운트 없이 지속적인 저장소 없음. 쿠키, 브라우저 세션 및 프록시 연결 캐시는 매번 재시작 시 사라집니다. 인증이 필요한 스크래핑의 경우 쿠키를 Google Drive의 파일에 명시적으로 저장해야 합니다.
  • 예측할 수 없는 네트워크 지연. Google의 클라우드 인프라는 때때로 지연이 발생하여 요청 타임아웃을 여유를 두고 설정해야 합니다(표준 5-10초 대신 15-30초).

이러한 제한 사항은 Colab을 스크래퍼의 로직을 개발하고 디버깅하는 데 훌륭한 도구로 만들지만, 장기적인 프로덕션 작업에는 적합하지 않습니다. 이러한 작업에는 준비된 스크립트를 VPS 또는 고유 IP가 있는 전용 서버로 이동하는 것이 좋습니다.

프록시 회전 및 루프에서 오류 처리하기

스크래핑이 첫 번째 차단 시 중단되지 않도록 하려면 코드에 프록시 교체와 재시도 로직이 필요합니다. 아래는 Colab에서 직접 실행할 수 있는 간단한 회전 및 오류 처리 루프의 예입니다.

import requests
import time
import random

proxy_pool = [
    "http://login:[email protected]:9000",
    "http://login:[email protected]:9001",
    "http://login:[email protected]:9002",
]

def get_with_retry(url, max_retries=5):
    for attempt in range(max_retries):
        proxy_url = random.choice(proxy_pool)
        proxies = {"http": proxy_url, "https": proxy_url}
        try:
            response = requests.get(url, proxies=proxies, timeout=20)
            if response.status_code == 200:
                return response
            else:
                print(f"시도 {attempt+1}: 상태 {response.status_code}")
        except requests.exceptions.RequestException as e:
            print(f"시도 {attempt+1}: 오류 {e}")
        time.sleep(random.uniform(2, 5))
    return None

result = get_with_retry("https://example.com/catalog")
if result:
    print(result.status_code)
else:
    print("모든 시도가 소진되었습니다.")

대규모 카탈로그(예: Wildberries의 수천 개의 상품 카드)를 스크래핑할 때 이 로직은 요청 간의 간격과 Google Drive에 중간 결과를 CSV 또는 데이터베이스에 저장하는 작업 큐로 추가적으로 감싸져야 하며, Colab 세션이 중단될 때 진행 상황을 잃지 않도록 합니다.

Colab에서 스크래퍼 실행 전 체크리스트

  • 프록시가 연결되고 기본 루프 전에 개별 테스트 요청으로 테스트됨
  • 프록시의 로그인과 비밀번호는 공개 코드가 아닌 Colab Secrets에 저장됨
  • JS 사이트에는 Selenium과 selenium-wire 또는 인증 확장이 사용됨
  • 코드에는 403/429 오류 시 재시도 로직과 프록시 회전이 포함됨
  • 중간 결과는 N개의 레코드마다 Google Drive에 저장됨
  • 클라우드 네트워크의 가능한 지연을 고려하여 요청 타임아웃이 증가됨
  • Colab의 아웃바운드 연결 한도에 부딪히지 않도록 요청의 병렬성이 제한됨
  • 프로덕션 작업을 위해 스크립트를 고정 IP가 있는 별도의 서버로 이동할 계획이 있음

결론

Google Colab 및 클라우드 Jupyter는 스크래퍼 로직을 신속하게 개발하고 테스트하는 데 적합하지만, 데이터 센터의 공용 IP로 인해 거의 항상 초기 단계에서 프록시가 필요합니다. 공격적인 보호가 없는 간단한 사이트에는 데이터 센터 프록시가 충분하지만, 마켓플레이스, 검색 엔진 및 소셜 미디어 스크래핑에는 ASN 필터에 덜 걸리는 주거용 및 모바일 IP가 더 안정적으로 작동합니다.

Wildberries 또는 Ozon의 가격을 Colab에서 정기적으로 모니터링할 계획이라면, 주거용 프록시로 시작하는 것이 좋습니다. 이들은 빈번한 차단 없이 안정적인 접근을 제공하며, 일회성 테스트 스크립트에는 요청 또는 Selenium을 통해 동일한 방식으로 연결할 수 있는 더 저렴한 데이터 센터 프록시로도 충분할 수 있습니다.