Розробка бота-парсера відгуків на товари з зовнішніх майданчиків

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка бота-парсера відгуків на товари з зовнішніх майданчиків
Середня
~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

Розробка бота-парсера відзивів на товари

Відзиви з маркетплейсів та агрегаторів — цінний контент для карточки товара: підвищують довіру, додають ключові слова в UGC, впливають на SEO через structured data. Парсер збирає відзиви, нормалізує їх та імпортує в базу магазину.

Джерела та методи доступу

Платформа Метод Особливості
Wildberries JSON API Відкритий API, пагінація
Ozon Playwright SPA, потрібна авторизація
Google Reviews Places API Платна, офіційна
iHerb HTML / JSON API Структурований HTML

Wildberries: парсинг через JSON API

# scraper/reviews/wildberries.py
import httpx
import asyncio
from dataclasses import dataclass

@dataclass
class Review:
    external_id: str
    product_nm_id: int
    author: str
    rating: int
    text: str
    pros: str | None
    cons: str | None
    date: str
    helpful_count: int

class WildberriesReviewScraper:
    REVIEWS_URL = "https://feedbacks2.wb.ru/feedbacks/v2/{nm_id}"

    async def get_reviews(self, nm_id: int, take: int = 100) -> list[Review]:
        all_reviews = []
        skip = 0

        while True:
            params = {"immt": nm_id, "skip": skip, "take": take, "order": "dateDesc"}
            resp = await self.client.get(self.REVIEWS_URL.format(nm_id=nm_id), params=params)
            resp.raise_for_status()

            data = resp.json()
            feedbacks = data.get("feedbacks", [])

            if not feedbacks:
                break

            for fb in feedbacks:
                all_reviews.append(self._normalize(nm_id, fb))

            skip += take
            await asyncio.sleep(1.0)

            if skip >= 1000:
                break

        return all_reviews

Laravel Job з обробкою дублів

// app/Jobs/ImportProductReviews.php
class ImportProductReviews implements ShouldQueue
{
    public int $tries = 3;

    public function handle(ReviewImportService $service): void
    {
        $mapping = ProductReviewMapping::where('product_id', $this->productId)->firstOrFail();
        $reviews = $this->scrape($mapping->external_id);

        $imported = $skipped = 0;

        foreach ($reviews as $reviewData) {
            // Дедупліка ція за external_id + source
            $exists = ProductReview::where([
                'source'      => $this->source,
                'external_id' => $reviewData['external_id'],
            ])->exists();

            if ($exists) {
                $skipped++;
                continue;
            }

            $service->import($this->productId, $this->source, $reviewData);
            $imported++;
        }

        Log::info("Reviews imported", [
            'product_id' => $this->productId,
            'imported'   => $imported,
            'skipped'    => $skipped,
        ]);
    }
}

Модерація та фільтрація

class ReviewImportService
{
    private array $stopWords = ['купите', 'скидка', 'промокод', 'vk.com', 't.me'];

    public function import(int $productId, string $source, array $data): ?ProductReview
    {
        // Фільтрація занадто коротких відзивів
        if (mb_strlen($data['text']) < 20) return null;

        // Фільтрація стоп-слів (спам)
        foreach ($this->stopWords as $word) {
            if (mb_stripos($data['text'], $word) !== false) return null;
        }

        return ProductReview::create([
            'product_id'  => $productId,
            'source'      => $source,
            'external_id' => $data['external_id'],
            'author'      => $this->anonymizeAuthor($data['author']),
            'rating'      => max(1, min(5, (int) $data['rating'])),
            'text'        => $this->sanitize($data['text']),
            'verified'    => $data['verified'] ?? false,
            'status'      => 'pending',
        ]);
    }
}

Строк розробки

Парсер однієї платформи з модерацією та structured data: 3-5 робочих днів.