Как обойти Cloudflare и защиту от ботов при парсинге Python-скриптом

🛡️ Кратко: Cloudflare и антибот-системы часто блокируют простые скрипты. Вот как сделать ваш парсер «человечнее» — без нарушения правил и с уважением к сайту.
python обойти защиту сайта

Если ваш парсер внезапно начал возвращать ошибку 503 Service Temporarily Unavailable или страницу Cloudflare с капчей — скорее всего, сайт распознал ваш скрипт как бота.

В этой статье покажу, как сделать запросы «человечнее» с помощью простых, но эффективных приёмов: User-Agent, прокси, паузы между запросами и правильные заголовки.
Всё это — без нарушения правил, без Selenium (если не требуется) и без «взлома». Только этичный и устойчивый парсинг публичных данных.

⚠️ Важно: эта статья — не про взлом, а про уважительное взаимодействие с сайтами, которые позволяют парсинг публичных данных.

Почему Cloudflare блокирует простые скрипты?

Cloudflare и подобные системы анализируют:

  • Поведение: скорость запросов, отсутствие пауз
  • Заголовки: отсутствие User-Agent, Accept-Language
  • IP: повторные запросы с одного адреса
  • JS-фингерпринт: отсутствие выполнения JavaScript (но это уже для Playwright)

Если поведение «не похоже на человека» — сайт показывает капчу или вовсе блокирует.

Способ 1. Добавьте реалистичные заголовки

Браузер всегда отправляет десятки заголовков. Добавьте хотя бы основные:

import requests

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
}

response = requests.get("https://example.com", headers=HEADERS)

💡 Берите User-Agent из своего браузера (DevTools → Network → любой запрос → Headers).

Способ 2. Внедрите паузы между запросами

Боты листают страницы за миллисекунды. Люди — за секунды.

import time
import random

for i in range(1, 11):
    print(f"Парсим страницу {i}")
    response = requests.get(f"https://example.com/page/{i}", headers=HEADERS)
    # ... обработка ...
    
    # Случайная пауза от 1 до 3 секунд
    delay = random.uniform(1, 3)
    time.sleep(delay)

✅ Это снижает нагрузку на сервер и выглядит естественно.

Способ 3. Ротация User-Agent

Используйте список популярных User-Agent и выбирайте случайный при каждом запросе:

import random

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36...",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36...",
]

def get_random_headers():
    return {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept-Language": "en-US,en;q=0.9",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    }

# Использование
response = requests.get(url, headers=get_random_headers())

📚 Актуальные User-Agent легко найти в интернете или скопировать прямо из DevTools вашего браузера.

💡 Дополнительно: библиотека fake-useragent

Если вы всё же хотите использовать код — используйте библиотеку fake-useragent она по-прежнему еще работает:

from fake_useragent import UserAgent
ua = UserAgent()
print(ua.random)

Но учтите: её данные иногда устаревают, и Cloudflare может распознавать «подозрительно стандартные» UA из этой библиотеки.

Способ 4. Использование прокси

Если сайт блокирует по IP, ротация прокси — единственный выход:

proxies = [
    "http://user:pass@192.168.1.10:8080",
    "http://user:pass@192.168.1.11:8080",
    # или бесплатные (но ненадёжные): "http://1.2.3.4:8080"
]

for i, url in enumerate(urls):
    proxy = {"http": proxies[i % len(proxies)], "https": proxies[i % len(proxies)]}
    try:
        response = requests.get(url, headers=HEADERS, proxies=proxy, timeout=10)
        # обработка
    except Exception as e:
        print(f"Ошибка с прокси {proxy}: {e}")
        continue

⚠️ Бесплатные прокси часто медленные и небезопасные. Для продакшена используйте платные ротирующие прокси (например, Bright Data, Smartproxy).

Когда этих методов недостаточно?

Если сайт:

  • Требует выполнения JavaScript (например, Cloudflare «Under Attack Mode»)
  • Использует поведенческий анализ (движение мыши, клики)

— тогда requests не подойдёт. Нужен браузерный движок, например Playwright или Selenium, с полноценной эмуляцией.

Пример с Playwright (подробнее можно ознакомиться в этой статье):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context(
        user_agent="ваш UA",
        proxy={"server": "ваш прокси"}
    )
    page = context.new_page()
    page.goto("https://сайт-с-cloudflare.com")
    content = page.content()  # получаем HTML после JS

Этичные правила парсинга

  1. Проверьте robots.txt — например: https://сайт.com/robots.txt
  2. Не нагружайте сервер — ставьте паузы, уважайте Crawl-delay
  3. Парсите только публичные данные — не ломайте авторизацию
  4. Указывайте контакт в User-Agent:
MyParser/1.0 (contact@mydomain.com)

Заключение

Python cloudflare bypass — это не магия, а уважительное поведение скрипта.
Если вы:

  • Добавите заголовки
  • Внедрите паузы
  • Ротируете User-Agent и IP

— многие сайты перестанут считать вас ботом.

Но помните: никакой парсинг не должен нарушать условия использования сайта. Цель — не обойти защиту любой ценой, а собирать данные так, чтобы администратору не захотелось вас блокировать.

💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий