← Назад к блогу

Настройка прокси в Google Colab и Jupyter для парсинга без блокировок IP

Разбираем настройку прокси в Google Colab и Jupyter Notebook для парсинга: почему облачные IP банят чаще, как подключить requests и Selenium, какие ограничения учитывать.

📅7 ноября 2026 г.

Google Colab и Jupyter Notebook — удобные инструменты для быстрого написания и запуска скриптов парсинга без установки Python на локальную машину. Но у облачных ноутбуков есть особенность, о которой часто забывают: все запросы идут с IP-адресов дата-центров Google, которые давно известны антибот-системам и банятся почти мгновенно. В этой статье разберём, как правильно подключить прокси в Colab и Jupyter, какие ограничения накладывает облачная среда и как выстроить парсинг так, чтобы он не падал после первых 50 запросов.

Почему Google Colab банят чаще, чем обычный ПК

Главная проблема Colab для парсинга — это общий пул IP-адресов. Каждый раз, когда вы запускаете ноутбук, Google выделяет виртуальную машину с IP из своих облачных диапазонов (AS15169 и похожие). Эти диапазоны давно внесены в черные списки большинства антибот-систем: Cloudflare, DataDome, PerimeterX, а также встроенная защита Wildberries, Ozon и маркетплейсов распознают их за доли секунды. Запрос даже не доходит до сайта — его отсекает фильтр по ASN (Autonomous System Number) ещё до проверки User-Agent или поведения.

Вторая причина — массовость использования. Тысячи разработчиков одновременно гоняют парсеры, боты и ML-скрипты через Colab, поэтому репутация этих IP у многих целевых сайтов уже «сожжена» задолго до вашего запроса. Даже если вы делаете один аккуратный GET-запрос раз в 10 секунд, сайт может вернуть 403 просто потому, что с этого же диапазона час назад кто-то долбил сервер в 500 потоков.

Третья причина — Jupyter, запущенный локально, этой проблемы обычно не имеет (если у вас обычный домашний или офисный IP), но стоит начать работу через JupyterHub на сервере хостинга или в контейнере облачного провайдера — ситуация становится такой же, как в Colab. Поэтому вопрос «прокси нужны или нет» для облачных ноутбуков решается однозначно: без них парсинг практически не работает дальше первых нескольких запросов.

Какой тип прокси подходит для облачного парсинга

Выбор типа прокси зависит от того, что именно вы парсите и насколько агрессивна защита целевого сайта. Для Colab и Jupyter важно учитывать ещё один нюанс: сессия ноутбука ограничена по времени, поэтому долгоживущие sticky-сессии прокси не всегда критичны — чаще важна стабильность подключения именно в рамках одного запуска.

Тип прокси Когда использовать в 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 нет постоянного файла конфигурации, поэтому логин и пароль прокси приходится либо хардкодить (что небезопасно при публикации ноутбука), либо хранить в переменных окружения Colab через google.colab.userdata, либо подключать через 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}

Прокси с Selenium и headless Chrome в Colab

Если сайт рендерит контент через JavaScript (типичная ситуация для Wildberries, Ozon, Avito), простого requests недостаточно — нужен headless-браузер. В 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-авторизацию (whitelisting по статичному IP ноутбука, что в Colab нестабильно, так как IP машины меняется при каждом новом запуске), либо генерировать расширение Chrome «на лету» с прописанными учётными данными прокси, либо использовать прокси-туннель через библиотеку вроде selenium-wire, которая поддерживает authenticated proxy из коробки.

!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 через облачный сервис: JupyterHub на VPS, Kaggle Notebooks, Deepnote, Binder или корпоративный облачный кластер. В этих случаях IP снова принадлежит дата-центру провайдера, и все проблемы Colab актуальны один в один. Главное отличие от Colab — у таких сервисов часто более стабильный IP на протяжении сессии (не меняется при каждом перезапуске ядра), что упрощает настройку whitelisting по IP, если ваш прокси-провайдер это поддерживает.

Практический вывод: если парсинг критичен для бизнеса (например, ежедневный мониторинг цен конкурентов на маркетплейсах), лучше не привязываться к бесплатным облачным ноутбукам как к продакшн-среде, а использовать их только для разработки и тестирования скрипта, перенося финальный парсер на сервер с постоянным IP и настроенными прокси.

Ограничения облачных ноутбуков, которые ломают парсинг

Помимо проблем с репутацией IP, у Google Colab есть ряд технических ограничений, которые напрямую влияют на стабильность парсинга:

  • Таймаут неактивности. Бесплатная версия Colab отключает ноутбук после ~90 минут простоя и принудительно завершает сессию через 12 часов непрерывной работы — долгий парсинг тысяч страниц нужно разбивать на части или сохранять промежуточные результаты на Google Drive.
  • Смена IP при каждом новом раннтайме. Если вы отключили и заново подключили среду выполнения, IP-адрес виртуальной машины меняется — это ломает любую настройку с whitelisting по IP на стороне прокси-сервиса.
  • Ограничение на исходящие соединения. Google ограничивает количество одновременных сетевых подключений с одной виртуальной машины, поэтому агрессивная многопоточность с десятками параллельных запросов может упираться не в блокировку сайта, а в лимиты самого Colab.
  • Нет персистентного хранилища без монтирования диска. Куки, сессии браузера и кэш прокси-соединений пропадают при каждом перезапуске — для парсинга с авторизацией нужно явно сохранять cookies в файл на Google Drive.
  • Непредсказуемые задержки сети. Облачная инфраструктура Google иногда даёт скачки латентности, из-за которых таймауты запросов нужно ставить с запасом (15-30 секунд вместо стандартных 5-10).

Эти ограничения делают 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) эту логику дополнительно оборачивают в очередь задач с паузами между запросами и сохранением промежуточных результатов в CSV или базу данных прямо в Google Drive, чтобы не терять прогресс при обрыве сессии Colab.

Чек-лист перед запуском парсера в Colab

  • Прокси подключены и протестированы отдельным тестовым запросом перед основным циклом
  • Логин и пароль прокси хранятся в Colab Secrets, а не в открытом коде
  • Для JS-сайтов используется Selenium с selenium-wire или прописанным расширением авторизации
  • В коде есть retry-логика и ротация прокси при ошибках 403/429
  • Промежуточные результаты сохраняются на Google Drive каждые N записей
  • Таймауты запросов увеличены с учётом возможных задержек облачной сети
  • Параллельность запросов ограничена, чтобы не упереться в лимиты исходящих соединений Colab
  • Для продакшн-задач предусмотрен перенос скрипта на отдельный сервер с постоянным IP

Заключение

Google Colab и облачный Jupyter отлично подходят для быстрой разработки и тестирования логики парсера, но из-за общих IP дата-центров почти всегда требуют прокси уже на первых шагах. Для простых сайтов без агрессивной защиты хватит прокси дата-центров, а для парсинга маркетплейсов, поисковых систем и соцсетей надёжнее работают резидентные и мобильные IP, которые реже попадают под фильтры по ASN.

Если вы планируете регулярный мониторинг цен на Wildberries или Ozon прямо из Colab, рекомендуем начать с резидентных прокси — они дают стабильный доступ без частых блокировок, а для разовых тестовых скриптов можно обойтись более бюджетными прокси дата-центров, подключив их по той же схеме через requests или Selenium.