Визуальный no-code-инструмент для веб-скрейпинга, доступный каждому.

Визуальный no-code-инструмент для веб-скрейпинга, доступный каждому.

В этом руководстве я покажу, как я работаю с CAPTCHA при использовании Scrapy. Я проведу вас через методы, которые использую для их обхода, чтобы ваш скрейпер работал стабильно и без постоянных прерываний.

Что такое CAPTCHA?

CAPTCHA расшифровывается как “Completely Automated Public Turing test to tell Computers and Humans Apart.” Проще говоря, это тест, который используется, чтобы определить, человек посетитель или бот.

К типам CAPTCHA относятся:

  • Тесты с выбором изображений (выберите все квадраты с автомобилем).
  • Текстовые головоломки (введите буквы, которые видите).
  • ReCAPTCHA от Google (чекбокс «Я не робот»).
  • Невидимые CAPTCHA (работают в фоновом режиме и незаметно блокируют ботов).

Почему Scrapy-скрейперы блокируются

Scrapy эффективен и быстр. Но в этом и проблема. Боты часто отправляют много запросов очень быстро. Серверы распознают такие паттерны и активируют CAPTCHA.

Вот несколько причин, по которым скрейперы на Scrapy сталкиваются с CAPTCHA:

  • Повторные визиты с одного и того же IP-адреса.
  • Отсутствуют корректные заголовки браузера.
  • Слишком частые запросы.
  • Отсутствует выполнение JavaScript.

Теперь разберем, как обходить CAPTCHA при использовании Scrapy.

Способ 1: Используйте Web Scraping API

Самый простой способ обойти CAPTCHA — использовать API для скрапинга. Эти API берут на себя всё за вас: прокси, CAPTCHA и рендеринг JavaScript.

Что такое API для веб-скрапинга?

Это сервис, который собирает данные за вас. Вы отправляете целевой URL, а API возвращает данные страницы после решения CAPTCHA и обхода блокировок.

Как это работает

  • Вы отправляете запрос с целевым URL.
  • API берет на себя всю защиту от ботов.
  • Вы получаете чистый HTML-код.

Best Tools

Вот несколько лучших API для скрапинга:

  • Яркие данные
  • ScraperAPI
  • Smartproxy
  • Oxylabs
  • Apify

Пример с Bright Data

Let’s see how to use Bright Data with Scrapy.

Шаг 1: Зарегистрируйтесь в Bright Data

Перейдите на их сайт и создайте аккаунт. Получите данные доступа к API.

Шаг 2: Отправьте запрос

импорт scrapy
импорт requests
класс APISpider(scrapy.Spider):
имя = 'api_spider'
def start_requests(себя):
url = "https://target-website.com"
proxy_url = f"https://brd.superproxy.io:22225"
response = requests.get(
"https://example-api.brightdata.com",
params={"url": url, "render": "правда"},
auth=('username', 'password') # Replace with your API credentials
)
урожайность scrapy.http.HtmlResponse(
url=url,
body=response.text,
encoding='utf-8'
)

Этот подход быстрый и позволяет обходить большинство CAPTCHA.

Способ 2: Используйте сервисы для решения CAPTCHA

Еще один способ обойти CAPTCHA — использовать сервисы для решения CAPTCHAЭти сервисы используют людей или ИИ, чтобы решать CAPTCHA за вас.

Popular Solving Services

  • Решатель CAPTCHA от Bright Data
  • 2Captcha
  • Anti-Captcha
  • DeathByCaptcha
  • CapMonster

Эти платформы выдают вам API-ключ. Вы отправляете им CAPTCHA, а они возвращают ответ.

Пример с 2Captcha

Let’s solve a reCAPTCHA with 2Captcha using Scrapy.

Шаг 1: Установите библиотеку

pip install 2captcha-python

Шаг 2: Получите API-ключ

Зарегистрируйтесь в 2Captcha и скопируйте API-ключ из панели управления.

Шаг 3: Scrapy Spider с CAPTCHA Solver

импорт scrapy
с сайта twocaptcha импорт TwoCaptcha
класс CaptchaSpider(scrapy.Spider):
имя = 'captcha_spider'
start_urls = ["https://site-with-captcha.com"]
def solve_captcha(self, site_key, url):
solver = TwoCaptcha('YOUR_API_KEY')
попробуйте:
result = solver.recaptcha(sitekey=site_key, url=url)
возврат result.get('code')
кроме Исключение в роли e:
self.logger.error(f"Error solving CAPTCHA: {e}")
возврат Нет
def разбор(self, response):
site_key = "SITE_KEY_FROM_HTML"
captcha_code = self.solve_captcha(site_key, response.url)
если captcha_code:
self.logger.info("CAPTCHA решена!")
# Continue scraping using captcha_code

Этот подход полезен для форм и страниц входа, использующих reCAPTCHA.

Способ 3: Ротация премиум-прокси

Один из разумных способов избежать CAPTCHA — использовать разные IP-адреса. Это скрывает идентичность вашего бота и снижает вероятность столкнуться с CAPTCHA.

Что такое прокси с ротацией?

Ротация прокси дают вам новый IP-адрес для каждого запроса. Они не позволяют сайтам обнаруживать паттерны скрапинга.

Виды прокси

Использование прокси в Scrapy

Edit the Scrapy settings file (settings.py) and add proxy settings.

DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
'myproject.middlewares.RandomProxy': 100,
}
PROXY_LIST = [
"http://user:pass@ip1:port",
"http://user:pass@ip2:port",
# Add more proxies9
]

Затем создайте middleware, которое выбирает случайный прокси.

импорт случайно
класс RandomProxy:
def обрабатывать_запрос(self, request, spider):
proxy = random.choice(spider.settings.get('PROXY_LIST'))
request.meta['proxy'] = proxy

Это циклически меняет прокси и снижает вероятность столкнуться с CAPTCHA.

Метод 4: используйте headless-браузеры

Иногда одного Scrapy недостаточно для сайтов с большим количеством JavaScript. Некоторые CAPTCHA загружаются через JavaScript и не могут обрабатываться напрямую.

Чтобы исправить это, можно использовать headless-браузеры, такие как:

  • Селен
  • Драматург
  • Всплеск (для Scrapy)

Использование Splash с Scrapy

Splash — это сервис рендеринга JavaScript, созданный для Scrapy.

Шаг 1: установите Splash

Вы можете запустить его с помощью Docker:

docker run -p 8050:8050 scrapinghub/splash

Шаг 2: добавьте middleware

In settings.py:

DOWNLOADER_MIDDLEWARES.update({
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
})
SPIDER_MIDDLEWARES.update({
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
})
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

Шаг 3: Используйте SplashRequest

с сайта scrapy_splash импорт SplashRequest
класс JSPageSpider(scrapy.Spider):
имя = 'js_page'
start_urls = ['https://example-js-page.com']
def start_requests(себя):
для url в self.start_urls:
урожайность SplashRequest(url, self.parse, args={'wait': 2})

Лучшие практики, позволяющие избежать CAPTCHA

Даже без навороченных инструментов есть простые вещи, которые можно сделать, чтобы избежать CAPTCHA:

1. Use User-Agent Headers

Всегда используйте заголовки настоящего браузера, чтобы выглядеть как обычный пользователь.

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

2. Снизьте скорость запросов

Добавляйте задержки между запросами, чтобы не вызывать подозрений.

DOWNLOAD_DELAY = 2

3. Use Cookies

Сохраняйте и повторно используйте сессионные cookies при скрейпинге. Это делает поведение вашего бота более последовательным.

4. Используйте заголовки Referer и Accept

Добавляйте заголовки, чтобы имитировать поведение реального браузера.

Какой метод выбрать?

Заключительные размышления

CAPTCHA встречаются повсюду и становятся все умнее. Но вам не нужно отказываться от проекта на Scrapy. С правильными инструментами и методами можно обойти почти любую CAPTCHA.

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

С этими инструментами в вашем арсенале вы сможете продолжать скрейпинг безопасно и эффективно.

Похожие записи