JavaRush /Курсы /Python SELF /Обход защиты от ботов: методы обхода антиботов и CAPTCHA

Обход защиты от ботов: методы обхода антиботов и CAPTCHA

Python SELF
33 уровень , 2 лекция
Открыта

1. Антибот-технологии: кто с нами играет в кошки-мышки?

Сегодня мы погрузимся в одну из самых увлекательных и, можно сказать, противоречивых тем веб-скрейпинга — обход защиты от ботов и борьбу с CAPTCHA. Как это часто бывает в жизни программиста, на каждый хитрый болт найдется гайка с левой резьбой, так что давайте посмотрим, как мы можем справляться с этими препятствиями.

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

  • CAPTCHA: Капча — это как ядерное оружие в мире антиботов. Цель — отсеять бот-запросы, представляя пользователю задачи, которые требуются человеческого участия: например, выбрать все изображения с таксами или ввести размазанную комбинацию букв.
  • Анализ поведения: Некоторые сайты оценивают, как быстро вы заполняете формы или взаимодействуете с элементами страницы. Слишком быстро? И вот вы уже забанены.
  • Задержки и ограничения на запросы: Если сайт начинает подозревать, что вы не человек, он может увеличить задержки между запросами или вовсе заблокировать вас.

2. Методы обхода антиботов

Теперь, когда мы знаем врага в лицо, давайте рассмотрим некоторые методы его обхода.

Решение CAPTCHA

Самый очевидный и одновременно сложный метод — это автоматизация решения CAPTCHA. Да, это возможно, но требуются определенные инструменты и служба третьих лиц. CAPTCHA бывает разных типов, включая текстовые, графические и даже аудио капчи.

Для автоматизации решения CAPTCHA можно использовать API сервисы, такие как 2Captcha или Anti-Captcha, которые предлагают решения CAPTCHA за небольшую плату. Давайте посмотрим, как это может быть реализовано на практике:


import requests

def solve_captcha(api_key, site_url, captcha_image_url):
    # Загружаем изображение капчи
    captcha_image = requests.get(captcha_image_url).content
    
    # Отправляем изображение на сервис и получаем ID задачи
    response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
    captcha_id = response.text.split('|')[1]
    
    # Получаем ответ капчи
    solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
    solution_response = requests.get(solution_url)
    
    while 'CAPCHA_NOT_READY' in solution_response.text:
        solution_response = requests.get(solution_url)
    
    return solution_response.text.split('|')[1]

# Пример использования функции
api_key = 'ВАШ_КЛЮЧ_2CAPTCHA'
site_url = 'https://example.com'
captcha_image_url = 'https://example.com/captcha_image'

captcha_solution = solve_captcha(api_key, site_url, captcha_image_url)
print("Решение капчи:", captcha_solution)
    

Этот код иллюстрирует, как можно сделать запрос на решение капчи. Однако, такие методы могут быть неэффективны для сложных графических задач или если сайт активно меняет свои алгоритмы.

Имитация человеческого поведения

Еще один способ обмана — это имитация человеческого поведения. Вы можете внедрять задержки в произвольных местах ваших скриптов, менять user-agent, эмулировать двунаправленные взаимодействия и даже использовать методы движения мыши с Selenium:


from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.get('https://example.com')

# Эмулируем движение мыши
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()

# Задержка для создания естественного взаимодействия
time.sleep(2)

# Выполняем действие
element.click()
    

Подробнее о Selenium мы расскажем в следующих лекциях.

Использование динамических IP и прокси

Вы также можете использовать прокси-серверы, чтобы менять IP-адрес, с которого отправляются запросы. Это может помочь обойти ограничения по количеству запросов от одного IP. Для этого существуют сервисы типа Bright Data и Smartproxy.


import requests

proxy = {
  "http": "http://123.456.789.012:8080",
  "https": "http://123.456.789.012:8080",
}

response = requests.get('https://example.com', proxies=proxy)
print(response.content)
    

3. Важные замечания

Реализация обхода антиботов требует знаний и экспериментов. Важно помнить, что не все методы законны или приветствуются сайтом. Всегда проверяйте, что разрешено в "robots.txt", и соблюдайте Правила Хорошего Тона в веб-скрейпинге, избегая перегрузки серверов. Это не только позволит избежать юридических проблем, но и будет уважением к чужой работе.

Никогда не запускайте серьезный парсер со своего домашнего IP. За учебный парсинг вам ничего не будет, но если ваш скрипт положит чей-то сервер, случайно отправив одновременно несколько тысяч запросов, к вам могут возникнуть вопросы. А вслед за вопросами к вам придут люди, которые захотят эти вопросы задать.

Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дмитрий Уровень 1
15 января 2026
Реальный API_KEY? Когда нужно будет ввести номер карты и CVV?
Томаш Попов Уровень 39
27 октября 2025
import requests def solve_captcha(api_key, captcha_image_url): # Загружаем изображение капчи captcha_image = requests.get(captcha_image_url).content Так-то лучше)
Vlad Tagunkov Уровень 25
9 января 2025
авторы вы хоть сами то функции в лекции проверяете? или просто тупой копи-пейст? функция - def solve_captcha(api_key, site_url, captcha_image_url) зачем параметр site_url? зачем вы его используете в примере?

def solve_captcha(api_key, site_url, captcha_image_url):
    # Загружаем изображение капчи
    captcha_image = requests.get(captcha_image_url).content

    # Отправляем изображение на сервис и получаем ID задачи
    response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
    captcha_id = response.text.split('|')[1]

    # Получаем ответ капчи
    solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
    solution_response = requests.get(solution_url)

    while 'CAPCHA_NOT_READY' in solution_response.text:
        solution_response = requests.get(solution_url)

    return solution_response.text.split('|')[1]