Этот проект предназначен для автоматического сбора информации о товарах и сравнения цен на идентичные товары.
В проекте используется асинхронное программирование для эффективного получения данных и предоставления подробного отчета о разнице в ценах по категориям.
Для примера взяты некоторые категории товаров из магазинов Магнит и Перекрёсток.
- Асинхронное получение данных о товарах из указанных разделов и магазинов.
- Асинхронное сохранение информацию о товарах в базе данных.
- Асинхронное сравнение средние цены на товары в одних и тех же категориях из магазинов.
Проект использует следующие технологии и библиотеки:
- Python - основной язык программирования проекта.
- aiohttp - для асинхронного HTTP-клиента, используемого для получения HTML-страниц.
- BeautifulSoup - для парсинга HTML и извлечения данных из веб-страниц.
- PostgreSQL - основная база данных для хранения информации о продуктах.
- SQLAlchemy 2.0 - для взаимодействия с базой данных и ORM.
- pydantic - для валидации данных и управления настройками конфигурации.
- asyncpg - для асинхронного взаимодействия с PostgreSQL.
- asyncio для управления асинхронными задачами и повышения производительности при работе с сетью и базой данных.
- Клонируйте репозиторий:
git clone https://github.com/TheRomanVolkov/PriceComparator.git
- Создайте виртуальное окружение и установите необходимые зависимости:
pip install -r requirements.txt
- Создайте файл .env в корневой директории проекта из примера .example.env со следующим содержимым:
MAGNIT_BASE_URL=https://dostavka.magnit.ru/
PEREKRESTOK_BASE_URL=https://www.perekrestok.ru/
DATABASE_URL="postgresql+asyncpg://username:password@localhost:5432/price_compare"
- Настройте необходимые названия магазинов и сравниваемых разделов (т.к. в магазинах разделы называются по-разному) в файле config.py:
STORES = {
"Магнит": MAGNIT_BASE_URL,
"Перекрёсток": PEREKRESTOK_BASE_URL,
}
SECTIONS = {
"Готовая еда": {
"Магнит": "express/catalog/4435-gotovaya-yeda",
"Перекрёсток": "cat/mc/25/gotovaa-eda"
},
"Кофе": {
"Магнит": "express/catalog/44121-kofe",
"Перекрёсток": "cat/c/80/kofe"
},
"Молоко": {
"Магнит": "express/catalog/45723-moloko-pasterizovannoye",
"Перекрёсток": "cat/c/114/moloko"
}
}
- Настройки селекторов Файл parsers/selectors.py содержит настройки селекторов для парсинга данных с сайтов Магнит и Перекрёсток. Эти селекторы определяют, какие HTML-элементы будут использованы для извлечения информации о продуктах.
magnit_selectors = {
'product_links': ('a', {'class': 'app-link product-card product-list__item'}),
'product_details': {
'name': ('h1', {'class': 'm-page-header__title text--h1'}),
'description': ('div', {'class': 'product-detail-text'}),
'price_new': ('div', {'data-test-id': 'product-price'}),
'price_old': ('div', {'data-test-id': 'product-price_old'}),
'article': ('span', {'data-test-id': 'product-article'}),
}
}
- product_links: Селектор для ссылок на страницы продуктов.
- product_details: Селекторы для получения деталей продукта, таких как название, описание, новая и старая цена, а также артикул.
perekrestok_selectors = {
'product_links': ('a', {'class': 'product-card__link'}),
'product_details': {
'name': ('h1', {'class': 'sc-fubCzh ibFUIH product__title'}),
'price_new': ('div', {'class': 'price-new'}),
'price_old': ('div', {'class': 'price-old'}),
'rating': ('div', {'role': 'img', 'class': 'sc-fFucqa drDzyo'}),
'availability': ('div', {'class': 'price-card-balance-state'}),
}
}
- product_links: Селектор для ссылок на страницы продуктов.
- product_details: Селекторы для получения деталей продукта, таких как название, новая и старая цена, рейтинг и доступность.
Эти настройки селекторов используются парсерами для извлечения необходимых данных с веб-страниц. При необходимости парсинг новых полей - добавить нужные селекторы в соответствующий словарь.
- Запустите скрипт для сбора данных:
python main.py
- Запустите скрипт для сравнения собранных данных:
python price_comparator.py
- Автоматическое сопоставление разделов при парсинге разделов.
- Добавить историю изменения товаров и цен.
- Кеширование данных.