Многие сайты используют Cloudflare для «разгрузки» своих серверов, ведь это крупнейшая сеть доставки контента в мире (CDN). Параллельно Cloudflare может взять на себя защиту сайта от DDoS-атак, а также выполнять роль посредника. В этом случае сервис работает как фильтр, который детально анализирует входящий трафик, выявляет и блокирует подозрительные подключения. Это так называемый WAF (файрволл для веб-приложений).
Данный материал будет посвящён ошибке Cloudflare с кодом 1010. Расскажем что она обозначает, в каких случаях появляется и как её избежать/обойти при парсинге.
Обратите внимание! Ошибку 1010 будет возвращать не целевой сайт, который вы хотите спарсить, а сервис-посредник – Cloudflare. Это значит, что он работает в роли файервола и блокирует подозрительные подключения.
Cloudflare-ошибка с кодом 1010 (Access Denied, Bad IP) – это ошибка доступа из-за неправильного (неподходящего) IP-адреса.
Такая ошибка с большой вероятностью связана с тем, что IP-адрес, который вы использовали для подключения к сайту (свой или прокси-сервера), ранее был замечен в подозрительной активности и не прошёл проверку системы безопасности.
Понятие «безопасности» может быть предельно широким, поэтому ниже рассмотрим причины ошибки Cloudflare с кодом 1010 с разных точек зрения.
Но если сильно не погружаться в детали, то в большинстве случаев ошибка с кодом 1010 отдаётся посетителям из-за срабатывания следующих правил защиты:
Такие правила могут настраиваться и активироваться:
Какая симптоматика свидетельствует о возникновении ошибки Cloudflare 1010? Тут всё достаточно просто. С большой вероятностью вы поймёте всё по специальной странице-заглушке.
Браузер отобразит что-то вида:
Чтобы исправить ошибку с кодом 1010, обычному пользователю можно пройтись по следующим пунктам и устранить проблемы:
Следует помнить, что задача Cloudflare при фильтрации нежелательного трафика для сайта как раз сводится к тому, чтобы эффективно отсеивать все «мусорные» подключения, которые выполняются ботами и парсерами. Они не несут для сайта полезной нагрузки, а иногда откровенно вредят.
Поэтому, если в процессе парсинга вы сталкиваетесь с ошибкой 1010 от Cloudflare, то ваш парсер недостаточно хорош для того, чтобы обойти правила защиты Cloudflare. Ну или проблема в типе/качестве прокси.
Типичные причины, которые приводят к появлению такой ошибки:
Идеальные прокси-серверы для доступа к ценным данным со всего мира.
Нельзя сказать, что какие-то определённые конструкции программного кода приводят к возникновению ошибки 1010. Это не ошибка кода/вашего скрипта, это проблема логики работы парсера, касающаяся его поведения – скрипт обнаруживают и блокируют. Было бы глупо, если бы разработчики Cloudflare выдали прямой набор рекомендаций по исключению/обходу ошибки 1010.
Поэтому, во-первых, ваш парсер должен уметь обрабатывать ошибки Cloudflare 1010, чтобы своевременно получать сигналы о необходимости остановки или об активации специальных алгоритмов обхода / ответных действий.
Во-вторых, нужно пройтись по причинам появления ошибки 1010 и вдумчиво изменить логику работы вашего парсера. Может быть, придётся исправить что-то одно, а может – придётся полностью переписать весь ваш парсер с нуля, так как он морально устарел и легко выявляется антибот-защитой Cloudflare. В соответствии со списком наиболее вероятных причин, которые были обозначены выше можно дать следующие советы для оперативного реагирования.
Конкретный набор технических реализаций может разниться от проекта к проекту. Универсального рецепта, к сожалению, нет.
Мы любим Python, поэтому скрипты для примеров пишем на нём:
import random
import time
import requests
import telegram
from selenium.webdriver.common.action_chains import ActionChains
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
# -------------------------------
# CONFIG
# -------------------------------
TARGET_URLS = [
"https://example.com/page1",
"https://example.com/page2"
]
BACKCONNECT_PROXIES = [
"proxy1.example.com:1234",
"proxy2.example.com:1234",
"proxy3.example.com:1234"
]
BROWSER_PROFILES = [
{"user_agent": "Mozilla/5.0 ... Chrome/121.0", "cookies": "cookies/profile1.txt"},
{"user_agent": "Mozilla/5.0 ... Firefox/119.0", "cookies": "cookies/profile2.txt"},
{"user_agent": "Mozilla/5.0 ... Safari/605.1.15", "cookies": "cookies/profile3.txt"}
]
REQUEST_TIMEOUT = 20
RETRY_LIMIT = 3
TG_TOKEN = "YOUR_TELEGRAM_TOKEN"
TG_CHAT_ID = "YOUR_CHAT_ID"
bot = telegram.Bot(TG_TOKEN)
# -------------------------------
# UTILITIES
# -------------------------------
def send_telegram_message(text):
bot.send_message(chat_id=TG_CHAT_ID, text=text)
def get_random_proxy():
return random.choice(BACKCONNECT_PROXIES)
def random_delay():
time.sleep(random.uniform(3, 5))
def is_cloudflare_1010(response):
if response.status_code == 403 and "1010" in response.text:
return True
return False
# -------------------------------
# HEADLESS SELENIUM LOADER
# -------------------------------
def load_with_selenium(url, profile):
proxy = get_random_proxy()
options = uc.ChromeOptions()
options.headless = False # остаётся видимым, но можно скрыть окно
options.add_argument(f"--proxy-server=http://{proxy}")
options.add_argument(f"--user-agent={profile['user_agent']}")
driver = uc.Chrome(options=options)
# загрузка cookies (если есть)
try:
with open(profile["cookies"], "r", encoding="utf-8") as f:
cookies = f.read().split("\n")
for c in cookies:
if "=" in c:
name, value = c.split("=", 1)
driver.add_cookie({"name": name.strip(), "value": value.strip()})
except:
pass
driver.get(url)
time.sleep(3)
# Имитация действий
actions = ActionChains(driver)
# движение мыши
for _ in range(3):
actions.move_by_offset(
random.randint(-50, 50),
random.randint(-50, 50)
).perform()
time.sleep(0.3)
# скролл
for _ in range(3):
driver.execute_script("window.scrollBy(0, arguments[0]);", random.randint(200, 700))
time.sleep(0.5)
html = driver.page_source
driver.quit()
return html
# -------------------------------
# REQUESTS LOADER
# -------------------------------
def load_with_requests(url, profile):
proxy = get_random_proxy()
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}"
}
headers = {
"User-Agent": profile["user_agent"],
"Accept": "text/html,application/xhtml+xml",
"Accept-Language": "en-US,en;q=0.9"
}
# загрузка cookies
cookies_dict = {}
try:
with open(profile["cookies"], "r", encoding="utf-8") as f:
for line in f:
if "=" in line:
k, v = line.split("=", 1)
cookies_dict[k.strip()] = v.strip()
except:
pass
response = requests.get(
url,
headers=headers,
cookies=cookies_dict,
proxies=proxies,
timeout=REQUEST_TIMEOUT
)
return response
# -------------------------------
# MAIN PARSE FUNCTION
# -------------------------------
def process_url(url):
print(f"Processing: {url}")
attempts = 0
while attempts < RETRY_LIMIT:
attempts += 1
profile = random.choice(BROWSER_PROFILES)
random_delay()
try:
response = load_with_requests(url, profile)
if is_cloudflare_1010(response):
print("Cloudflare 1010 detected. Switching to Selenium...")
html = load_with_selenium(url, profile)
return html
if response.status_code == 200:
return response.text
else:
print(f"Error {response.status_code}, attempt {attempts}")
except Exception as e:
print(f"Request error: {e}, attempt {attempts}")
# если всё плохо — отправить в Telegram
send_telegram_message(f"⚠️ Error when processing URL after {RETRY_LIMIT} attempts:\n{url}")
return None
# -------------------------------
# ENTRY POINT
# -------------------------------
if __name__ == "__main__":
for url in TARGET_URLS:
html = process_url(url)
if html:
print(f"Loaded: {len(html)} bytes")
else:
print("Failed.")
Не забудьте установить необходимые библиотеки и дождаться завершения загрузки headless-браузеров для Selenium.
Что делает скрипт:
В скрипте нет конкретной логики парсинга, но вы можете описать её самостоятельно или посмотреть в наших примерах из соответствующих материалов блога. Для синтаксического анализа мы рекомендуем BeautifulSoup.
Проблемы Cloudflare возникают не из-за целевого сайта (того, который вы хотите спарсить), а из-за механизмов защиты самого Cloudflare. Этот сервис выступает в роли веб-антивируса (или продвинутого файрволла) и имеет анализировать большое количество атрибутов соединений: браузерных отпечатков, истории IP-адресов, поведения пользователей и пр. Пройти защиту Cloudflare иногда достаточно сложно и сервис не ограничивается только ошибкой 1010.
Вы можете столкнуться с массой других ошибок доступа. Самый неприятный формат – решение капчи. Материал о том, как обходить защиту Cloudflare. Если вы увидели ошибку, это значит, что вы не прошли автоматическую проверку системы безопасности Cloudflare. Обычным пользователям, которые не связаны с парсингом сайтов, достаточно отключить VPN или прокси – с большой вероятность проблема с ошибкой 1010 возникла из-за них. Но могут быть и другие причины, их все мы рассмотрели выше.
Не всегда. Если систему безопасности Cloudflare не устроил браузерный профиль (цифровой отпечаток), то смена IP не поможет. Хотя да, основная первопричина – низкое качество адреса. Ещё одна ситуация, когда ротация IP не спасёт: если IP относится к подсети ASN или к пулу IP-адресов конкретного провайдера, которые помечены как нежелательные, тогда ротация IP из той же подсети опять будет приводить к ошибке 1010.
Косвенно. Если Cloudflare определяет клиента как подозрительного, то сервис может показать CAPTCHA или сразу вернуть код 1010. Но сама ошибка означает именно отказ в доступе на уровне правил, а не обязательный вызов CAPTCHA.
Да. Иногда облачные правила Cloudflare-защиты меняются динамически: возможны A/B-тестирования, временная геоблокировка, эпизодические фильтры трафика или повышение «подозрения» после нескольких быстрых запросов. Через некоторое время доступ вполне может вернуться.
Итак, несмотря на чёткое указание номера и причины ошибки, код 1010 может показываться при совокупности большого количества факторов – от действительно плохого IP-адреса до «подозрительной» активности пользователя (при обнаружении признаков автоматизации и парсинга с данного IP).
Ошибку не всегда можно убрать за счёт оперативной смены (ротации) IP-адреса. Но именно качество IP и его «естественность» лежат в основе последующих действий по обходу проблемы.
Найти качественные прокси можно у нас. Froxy это свыше 10 млн. резидентных и мобильных IP с таргетингом до города и провайдера связи. Тарификация на основе предоплаченных пакетов трафика.