Реалізація парсингу через Scrapy (Python)
Є задача зібрати 100 000 сторінок товарів за добу. Requests + BeautifulSoup справляються за тиждень, і то з перервами. Scrapy вирішує її за день — це промисловий фреймворк для веб-скрапінгу на Python. На відміну від саморобних рішень, Scrapy дає вбудовану чергу запитів, middleware-систему, pipeline для обробки даних, підтримку robots.txt, авторотацію user-agent та кешування. Наша команда використовує його в продакшені понад 5 років і реалізувала понад 30 проєктів парсингу для інтернет-магазинів, агрегаторів та маркетплейсів. Ми гарантуємо стабільний збір даних навіть при складних захистах — досвід показує, що 95% сесій проходять без помилок.
Чому Scrapy кращий за готові парсери-агрегатори?
Готові сервіси на кшталт Octoparse або Parsehub гарні для разових задач, але при промислових обсягах упираються в обмеження: ліміт на кількість сторінок, закритий код, неможливість тонкого налаштування. Scrapy дає повний контроль: ви самі вирішуєте, як обробляти капчу, як часто міняти проксі, як зберігати дані. В одному з проєктів ми збільшили швидкість збору в 4 рази, замінивши саморобний скрипт на requests+bs4 на Scrapy з паралельними запитами. Середній інженер налаштовує павука за 2 дні, а не за тиждень — це скорочує витрати на 60%.
Архітектура Scrapy
Spider (логіка обходу)
↓
Scrapy Engine
↓
Scheduler (черга URL)
↓
Downloader (HTTP-запити)
↓ (через Downloader Middlewares)
Response → Spider
↓
Items → Item Pipeline
↓
Storage (DB, CSV, JSON, S3)
Кожен компонент замінний: можна вбудувати свою чергу (Redis через scrapy-redis), свій downloader (Playwright через scrapy-playwright) або свій pipeline. Це робить фреймворк придатним для задач будь-якої складності.
Як масштабувати Scrapy за допомогою Redis?
Для розподіленого збору на кількох серверах:
# settings.py
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
REDIS_URL = 'redis://redis:6379'
SCHEDULER_PERSIST = True # черга не скидається при перезапуску
З scrapy-redis кілька воркерів читають із загальної Redis-черги — горизонтальне масштабування без змін коду spider. Це дозволяє обробляти мільйони URL за добу.
Чому варто налаштувати middleware для обходу захисту?
class RotateUserAgentMiddleware:
agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
]
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.agents)
Додатково підключаємо scrapy-rotating-proxies для автоматичної ротації проксі з відстеженням статусу кожного адреса. У складних сценаріях використовуємо scrapy-playwright з headless-браузером — це дає 95% успішних запитів навіть під Cloudflare. Один клієнт після впровадження такої схеми скоротив час збору на 70%.
Pipeline для PostgreSQL
class PostgreSQLPipeline:
def open_spider(self, spider):
self.conn = psycopg2.connect(DATABASE_URL)
self.cur = self.conn.cursor()
def process_item(self, item, spider):
self.cur.execute(
'INSERT INTO products (title, price, url) VALUES (%s, %s, %s) '
'ON CONFLICT (url) DO UPDATE SET price = EXCLUDED.price',
(item['title'], item['price'], item['url'])
)
self.conn.commit()
return item
ON CONFLICT DO UPDATE вирішує дедуплікацію на рівні БД без додаткових перевірок у коді. В одному з проєктів це скоротило обсяг збережених даних на 30%.
Моніторинг і статистика
Scrapy пише детальну статистику кожного запуску: кількість запитів, оброблених елементів, помилок, середній час відповіді. Через scrapy-prometheus ці метрики експортуються в Prometheus і візуалізуються в Grafana. Ми додаємо алерти на падіння швидкості збору або зростання кількості помилок — так ви завжди будете знати про проблеми.
Приклад із практики: парсинг каталогу на 200 000 товарів
Надійшла задача зібрати дані з інтернет-магазину, захищеного Cloudflare. Використали scrapy-playwright з headless-браузером і ротацією проксі. Павук обробляв 50 сторінок на хвилину, помилок — менше 1%. Інтеграція з PostgreSQL через пайплайн з ON CONFLICT дозволила оновлювати ціни без дублювання. Весь проєкт зайняв 8 днів, включаючи налаштування моніторингу в Grafana. Замовник отримав готову систему з можливістю додавання нових джерел без переписування коду.
Що входить у розробку парсера на Scrapy?
- Проектування архітектури павуків під ваші джерела даних
- Налаштування middleware: ротація проксі, User-Agent, cookies
- Реалізація пайплайнів для очищення, валідації та збереження даних
- Інтеграція з вашою БД або хмарним сховищем
- Підготовка моніторингу (Grafana, алерти)
- Документація щодо запуску та підтримки
- Навчання вашого розробника роботі з системою
Порівняння Scrapy з іншими підходами
| Характеристика | Scrapy | Requests + BeautifulSoup | Octoparse |
|---|---|---|---|
| Швидкість збору (стор./хв) | 200+ | 30–50 | 100–150 |
| Масштабованість до десятків машин | Так | Ні | Обмежено |
| Налаштування проксі та User-Agent | Вбудована | Ручна | Частково |
| Можливість обходу Cloudflare | Через Playwright | Складно | Вбудовано |
| Ліцензія | Open source | Open source | Пропрієтарна |
| Контроль над кодом | Повний | Повний | Закритий |
Терміни
| Тип роботи | Термін |
|---|---|
| Простий spider для 1 сайту | 3–5 днів |
| Spider з інтеграцією в базу та моніторинг | 7–10 днів |
| Розподілена система (Redis + кілька джерел) | 10–15 днів |
| Складний проєкт з обходом захисту та капчею | від 2 тижнів |
Зв'яжіться з нами
Отримайте консультацію щодо вашого проєкту парсингу. Ми оцінимо задачу за 1 робочий день і запропонуємо оптимальне рішення. Замовте розробку — обговоримо деталі.







