Кратко опишу суть проекта.
Есть дистрибьютор, который реализует товар (скажем, 300 наименований) пятидесяти другим мелким фирмам-оптовикам, у каждой из которых есть свой сайт. Дистрибьютор желает регулярно (каждый день) парсить эти 50 сайтов, преследуя следующие цели:
- Контроль демпинга цен.
- Возможность видеть динамику изменения цен на свой товар.
Немного о себе: есть опыт написания веб-скрейперов на Node.js (1 год). Есть небольшой опыт работы с noSQL базой данных RethinkDB (1 проект).
Проект будет состоять из:
- Собственно, веб-скрейпер.
- Небольшая админ-панель на локалхосте.
Админ-панель будет состоять из:
- Главная страничка, с которой осуществляется управление скрейпером: "старт", "пауза", "стоп", "загрузить новые данные о товарах" (загрузить .csv файл со списком точных наименований товаров и их стоимостью; по умолчанию будет использоваться последний загруженный файл). Также на главной страничке будет отображаться ход парсинга в виде лоадера (реализую это через socket.io), а по окончании парсинга - краткая сводка с результатами (на каких сайтах продается товар ниже себестоимости).
- Страничка со списком всех товаров в следующем виде: слева товар, справа - график (chart.js) средней цены на этот товар за последний месяц.
- Можно кликнуть по товару и перейти на страницу с этим товаром, которая содержит следующую информацию: графики цен на каждом из 50 сайтов (lazy loading) за последние N дней.
- Можно кликнуть по любому из сайтов и перейти на страничку с соответствующей информацией: слева товары, справа - графики цен на товар на данном сайте за последние N дней.
Реализовать весь бэкенд планирую в следующем виде: server.js, который будет хостить админпанель и который будет запускать менеджер парсеров manager.js (через child_process.fork()), который в свою очередь будет форкать 50 парсеров (firstsitecom.js, secondsitecom.js, ...). Зачем столько форков? Почему просто не сделать это через module.export? Для того, чтобы ошибка в одном из парсеров не положила всю систему. Так, я буду иметь возможность при выходе из строя одного из модулей просто перезапустить его, либо игнорировать и парсить дальше.
И, наконец-таки, сам вопрос, точнее, два:
- Как лучше реализовать хранение данных в БД? Может быть, создать таблицу на каждый из пятидесяти сайтов, или лучше создать по таблице на каждый товар? За любой подробный ответ буду очень благодарен.
- Какой стек технологий лучше всего подойдет? Я пока остановился на MEAN: Node.js, Express, Angular 2 (прошел туториалы PhoneCat и Hero на оф. сайте, вроде всё понятно, но смущает его монструозность и TypeScript), MongoDB (похожа на RethinkDB). Если у Вас есть советы касательно выбора стека, буду раз узнать их.
Понимаю, что с моими не очень обширными знаниями всё это может занять у меня много времени и сил, но я, конечно же, готов к этому и потрачу столько усилий, сколько необходимо.
Возможно, Вам есть что сказать, либо на ум пришли какие-то полезные ссылки. Буду рад любому ответу. Спасибо.