
Если ваш парсер внезапно начал возвращать ошибку 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
Этичные правила парсинга
- Проверьте
robots.txt— например:https://сайт.com/robots.txt - Не нагружайте сервер — ставьте паузы, уважайте
Crawl-delay - Парсите только публичные данные — не ломайте авторизацию
- Указывайте контакт в User-Agent:
MyParser/1.0 (contact@mydomain.com)
Заключение
Python cloudflare bypass — это не магия, а уважительное поведение скрипта.
Если вы:
- Добавите заголовки
- Внедрите паузы
- Ротируете User-Agent и IP
— многие сайты перестанут считать вас ботом.
Но помните: никакой парсинг не должен нарушать условия использования сайта. Цель — не обойти защиту любой ценой, а собирать данные так, чтобы администратору не захотелось вас блокировать.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!