Як обійти CAPTCHA за допомогою Scrapy
У цьому посібнику я покажу, як я працюю з CAPTCHA під час роботи зі Scrapy. Я проведу вас через методи, які використовую для їх обходу, щоб ваш вебскрапер працював стабільно без постійних збоїв.
Що таке CAPTCHA?
CAPTCHA розшифровується як «повністю автоматизований публічний тест Тьюринга для розрізнення комп’ютерів і людей». Простими словами, це тест, який використовують, щоб визначити, чи відвідувач є людиною, чи ботом.
До типів CAPTCHA належать:
- Тести на вибір зображень (оберіть усі квадрати з автомобілем).
- Текстові завдання (введіть літери, які бачите).
- ReCAPTCHA від Google (прапорець «Я не робот»).
- Невидимі CAPTCHA (працюють у фоновому режимі та непомітно блокують ботів).
Чому вебскрапери на Scrapy блокуються
Scrapy ефективний і швидкий. Але це також проблема. Боти часто надсилають багато запитів дуже швидко. Сервери виявляють такі патерни та вмикають CAPTCHA.
Ось кілька причин, чому вебскрапери на Scrapy стикаються з CAPTCHA:
- Повторні візити з тієї самої IP-адреси.
- Відсутні коректні браузерні заголовки.
- Запити надсилаються занадто швидко.
- Відсутнє виконання JavaScript.
Тепер розгляньмо, як обійти CAPTCHA під час використання Scrapy.
Спосіб 1: Скористайтеся API для вебскрапінгу
Найпростіший спосіб обійти CAPTCHA — це використовувати API для вебскрапінгу. Такі API беруть на себе все за вас — проксі, CAPTCHA та рендеринг JavaScript.
Що таке API для вебскрапінгу?
Це сервіс, який отримує дані замість вас. Ви надсилаєте цільову URL-адресу, а API повертає дані сторінки після розв’язання CAPTCHA та обходу блокувань.
How It Works
- Ви надсилаєте запит із цільовою URL-адресою.
- API бере на себе весь захист від ботів.
- Ви отримуєте чистий HTML-код.
Best Tools
Ось кілька найкращих API для вебскрапінгу:
- Bright Data
- ScraperAPI
- Smartproxy
- Oxylabs
- Apify
Приклад із Bright Data
Let’s see how to use Bright Data with Scrapy.
Крок 1: Зареєструйтеся в Bright Data
Перейдіть на їхній сайт і створіть обліковий запис. Отримайте свої облікові дані API.
Крок 2: Надішліть запит
import scrapy
import requests
class APISpider(scrapy.Spider):
name = 'api_spider'
def start_requests(self):
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": "true"},
auth=('username', 'password') # Replace with your API credentials
)
yield scrapy.http.HtmlResponse(
url=url,
body=response.text,
encoding='utf-8'
)
Цей підхід швидкий і дозволяє уникнути більшості CAPTCHA.
Спосіб 2: Скористайтеся сервісами для розв’язання CAPTCHA
Інший спосіб обійти CAPTCHA — це використання сервіси для розв’язання CAPTCHA. Ці сервіси використовують людей або ШІ, щоб розв’язувати CAPTCHA за вас.
Popular Solving Services
- Bright Data’s CAPTCHA Solver
- 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 із CAPTCHA Solver
import scrapy
from twocaptcha import TwoCaptcha
class CaptchaSpider(scrapy.Spider):
name = 'captcha_spider'
start_urls = ["https://site-with-captcha.com"]
def solve_captcha(self, site_key, url):
solver = TwoCaptcha('YOUR_API_KEY')
try:
result = solver.recaptcha(sitekey=site_key, url=url)
return result.get('code')
except Exception as e:
self.logger.error(f"Error solving CAPTCHA: {e}")
return None
def parse(self, response):
site_key = "SITE_KEY_FROM_HTML"
captcha_code = self.solve_captcha(site_key, response.url)
if captcha_code:
self.logger.info("CAPTCHA розв’язано!")
# Continue scraping using captcha_code
Цей підхід корисний для форм і сторінок входу, які використовують reCAPTCHA.
Спосіб 3: ротація преміум-проксі
Розумний спосіб уникати CAPTCHA — використовувати різні IP-адреси. Це приховує ідентичність вашого бота та зменшує ймовірність натрапити на CAPTCHA.
Що таке ротаційні проксі?
Ротаційні проксі надають вам нову IP-адресу для кожного запиту. Вони не дають сайтам виявляти патерни вебскрапінгу.
Типи проксі
- Datacenter Proxies (дешеві, але їх простіше виявити)
- Residential Proxies (дорожчі, але їх важче блокувати)
- Mobile Proxies (дуже ефективно, але дорого)
Використання проксі у 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, який вибирає випадковий проксі.
import random
class RandomProxy:
def process_request(self, request, spider):
proxy = random.choice(spider.settings.get('PROXY_LIST'))
request.meta['proxy'] = proxy
Це ротує проксі та зменшує ймовірність натрапити на CAPTCHA.
Спосіб 4: Використовуйте headless-браузери
Іноді самого Scrapy недостатньо для сайтів із великою кількістю JavaScript. Деякі CAPTCHA завантажуються через JavaScript і не можна обробити напряму.
Щоб це виправити, можна використовувати headless-браузери, такі як:
- Selenium
- Playwright
- Splash (для 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
from scrapy_splash import SplashRequest
class JSPageSpider(scrapy.Spider):
name = 'js_page'
start_urls = ['https://example-js-page.com']
def start_requests(self):
for url in self.start_urls:
yield 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
Додавайте заголовки, щоб імітувати поведінку справжнього браузера.
Який метод варто обрати?

Final Thoughts
CAPTCHA є всюди, і вони стають розумнішими. Але вам не потрібно відмовлятися від свого проєкту на Scrapy. З правильними інструментами та методами ви зможете обійти майже будь-яку CAPTCHA.
Використовуйте API для зручності, розв’язувачі за потреби, ротуйте проксі, щоб зберігати анонімність, і завжди імітуйте людську поведінку за допомогою заголовків і затримок.
Маючи ці інструменти у своєму арсеналі, ви можете продовжувати вебскрапінг безпечно та ефективно.

