Як обійти CAPTCHA за допомогою Scrapy

Як обійти 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-адресу для кожного запиту. Вони не дають сайтам виявляти патерни вебскрапінгу.

Типи проксі

Використання проксі у 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 для зручності, розв’язувачі за потреби, ротуйте проксі, щоб зберігати анонімність, і завжди імітуйте людську поведінку за допомогою заголовків і затримок.

Маючи ці інструменти у своєму арсеналі, ви можете продовжувати вебскрапінг безпечно та ефективно.

Схожі записи