Реалізація парсингу через Scrapy (Python)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація парсингу через Scrapy (Python)
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація парсинга через Scrapy (Python)

Scrapy—промисловий фреймворк для веб-скрапінгу на Python. Не просто бібліотека, а повноцінна архітектура: вбудована черга запитів, middleware-система, pipeline для обробки даних, вбудована підтримка robots.txt, авторотація user-agent, кеширування відповідей. Якщо потрібно збирати дані з сотень сторінок у паралельному режимі—Scrapy правильний вибір.

Архітектура 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.

Базовий spider

import scrapy

class CatalogSpider(scrapy.Spider):
    name = 'catalog'
    start_urls = ['https://example.com/catalog?page=1']

    def parse(self, response):
        for item in response.css('.product-card'):
            yield {
                'title': item.css('.title::text').get('').strip(),
                'price': item.css('.price::attr(data-value)').get(),
                'url': response.urljoin(item.css('a::attr(href)').get()),
            }

        next_page = response.css('a.next-page::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

Масштабування через 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.

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 для автоматичної ротації прокси з відстеженням статусу кожної адреси.

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 вирішує дедупликацію на рівні БД без додаткових перевірок у коді.

Мониторинг та статистика

Scrapy записує докладну статистику кожного запуску: кількість запитів, обпрацьованих елементів, помилок, середнього часу відповіді. Через scrapy-prometheus ці метрики експортуються у Prometheus та візуалізуються в Grafana.

Терміни

Spider для одного сайту з pipeline та базовими middleware: 3–5 днів. Розподілена система з Redis, мониторингом та кількома source-адаптерами: 10–15 днів.