Сделать оценку проекта?

Как мы создавали интернет магазин на 5 млн. товаров

К нам обратилась компания из Китая, которая занимается продажей деталей для микроэлектроники (транзисторы, конденсаторы, электроплаты и т.д.) за услугой создание интернет магазина. Общий объем товаров примерно 5 млн. штук. Сайт должен сканировать категории товаров и продукцию из других магазинов и отображать актуальные данные про наличие и цены у себя (дальше будем их называть сайты поставщиков):

http://uk.farnell.com/

http://www.digikey.com/

http://ru.mouser.com/

Наш магазин должен парсить все эти три сайта в фоновом режиме, автоматически загружать категории товаров и сами товары (Название, описание, наличие на складе, спецификацию производителя). Ориентироваться в таком большом каталоге очень сложно обычному пользователю, он предназначался для людей, которые конкретно знают, что им нужно, знают код товара производителя (manufacturer number) и захотят найти его в поиске по сайту. Поэтому поиск по интернет магазину должен быть очень быстрый и находить нужный товар.

Наши первые шаги

Приступая к проекту, что мы не знали, как поведут себя каждый 3 вышеперечисленных сайтов, если мы будем посылать очень большое количество запросов к ним. Вполне вероятно, что у них может стоять  «Капча» или проверка «cookies». Поэтому в первую очередь мы стали тестировать возможность парсинга информации с этих сайтов.

Самым удачным для парсинга оказался магазин http://www.digikey.com/ чуть менее подходящим: http://uk.farnell.com/ и наименее подходящим http://ru.mouser.com/

На сайте http://ru.mouser.com/ стояла защита от ботов, поэтому мы его отбросили практически сразу.

Проблемы с которыми мы столкнулись

  1. В каждом интернет-магазине была своя структура каталога. Ассортимент товаров пересекался примерно на 80% у farnell.com и digikey.com. Как нам свести такое большое количество данных в один каталог нашего сайта?
  2. Мы решили однозначно идентифицировать товар по его manufacture part number (код производителя), но мы обнаружили дубляжи этого товара на одном сайте. Дело в том, что один и тот же товар может иметь разную фасовку, например 1000 шт. и 5 000 штук в упаковке. В каталоге фарнела и диджикея —  это два разные товара, у каждого свои остатки на складе и цена. Отличает эти товары только код товара самого магазина. Поэтому мы решили в нашей базе идентификатором товара сделать комбинацию (Manufacturer part number, код товара на сайте поставщика и идентификатор самого сайта поставщика (фарнел или диджикей)).
  3. Нам нужно было в фоновом режиме еженедельно обновлять информацию про остатки на складе и цены в магазине поставщика. Что бы выполнить обновление информации по всем товарам по всем 5 млн. товаров за неделю мы должны были парсить 500 товаров за миниту. Это могло давать очень большие нагрузки как на наш сервера, так и на сервер поставщика.
  4. Также стояла задача получить список категорий из самого магазина, после этого по каждой категории получить список товаров и для каждого товара получить остатки. С didgikey получилось немного проще, у него есть страница откуда можно получить список всех категорий http://www.digikey.com/product-search/en. У другого сайта такой страницы нет, поэтому нужно было задавать перечень страниц с категориями самому. Возможность задавать категории товаров вручную мы предоставили администратору сайта.
  5. Объединение категорий двух магазинов в один мы решили следующим образом: Для каждой из категорий нашего сайта, администратором можно указать несколько категорий из сайтов поставщиков, таким образом при парсинге все товары из этих категорий попадут в нашу категорию. Наша идея понравилась заказчику, но на этапе наполнения возникло много проблем с наполнением. Поэтому за основу мы взяли категории из сайта digikey.

 

Оптимизация запросов к базе данных и выбор базы данных

Изначально для ускорения парсинга мы попробовали библиотеку http://php.net/manual/ru/book.pthreads.php , которая позволяет создавать в php потоки, но в итоге мы от нее отказались. Честно говоря, сейчас уже не вспомню почему.

Базу данных мы выбрали My SQL тип MyIsam – такой выбор связан с поддержкой MyIsam полнотекстового индекса и ценой хостинга и также оптимизацией выборки для больших данных.

Конечно можно было взять и MS Sql или Oracle, но  с нашими задачи My SQL также прекрасно справился.

Для оптимизации поиска мы использовали библиотеку http://sphinxsearch.com/ и также тщательно оптимизировали ключевые запросы.

Учитывая выборку поиска и получения данных о товарах и категория мы добавили индексы на все таблицы.

В страницу товара мы добавили еще один столбец, который назвали search_text – этот текст содержал информацию из других столбцов товара. Для этого столбца мы добавили полнотекстовый индекс, таким образом поиск по интернет магазину осуществляется именно выборкой из этого столбца. Как показало тестирование данное решение работало значительно быстрее нежели полнотекстовый поиск по 4 разным столбцам одной и тоже таблицы.

Все запросы для которых критичная скорость выполнения мы писали на чистом SQL, а запросы, которые не связаны с выборкой товаров, такие как отображение страниц, новостей, корзины и т.д. мы писали на Yii2 ORM библиотеке.

 

Что не нагружать сильно сервер сайта digikey.com мы получаем все данные из страницы списка товаров категории: http://www.digikey.com/product-search/en/audio-products/accessories/720980?pageSize=500

А наличие на складе и стоимость мы запрашиваем уже непосредственно при отображении этого товара на нашем сайте http://semicon-components.com/. Запрошенные данные кэшируются на нашем сайте и при повторном запросе берутся уже из базы данных нашего интернет магазина.

 

Для самого парсинга html мы не использовали библиотеки для парсинга такие как например, PHP Simple HTML DOM Parser, так как они очень грузят сервер и подходят для небольших задач. В этом случае мы использовали обычные regex.

 

Результат: http://semicon-components.com/

Скорость генерации страниц: 200-300 мс.

 

Методологию разработки мы использовали экстремальное программирование.

Участники проекта:

Дима – project manager

Андрей – Team lead

Илля – php programmer (работал над парсингом)

Виталий – Yii programmer

Виталий – frontend developer

Катя – дизайнер сайта

 

 

Статьи по теме
Подпишитесь на обновления
Email *
Узнать стоимость сайта
  • Отправьте нам заявку на бесплатный просчет стоимости сайта и наш специалист с Вами свяжется. Или звоните:
    (044) 383-40-91 (066) 136-71-39

  • Расширенная формаСкачать бриф
Сделать оценку проекта?