Автоматизація збору цін у супермаркетах за допомогою Scrapy, Splash та Kaggle
Мене звати Дмитро, я займаюсь збором даних з інтернету та автоматизацією процесів, пов’язаних з цим. Маю досвід у використанні інструментів для моніторингу та аналізу ринкових тенденцій, зокрема — Scrapy, Splash, Kaggle та Python.
Мій проєкт про порівняння цін на продукти в супермаркетах демонструє, як автоматизація допомагає аналізувати дані для кращого розуміння змін на ринку та прийняття обґрунтованих бізнес-рішень. А саме — дає змогу глибше аналізувати цінові тенденції, сезонні коливання та потенційні зовнішні чинники, які впливають на вартість продуктів.
У статті розповім, як я автоматизував збір цін з супермаркетів АТБ та Metro з 31 серпня 2023 року до 30 вересня 2024 року за допомогою Kaggle, Scrapy й Scrapy-Splash.
Процес збору даних
Ось короткий огляд кроків, які я виконав для автоматизації процесу збору даних.
1. Налаштування середовища
- Kaggle — використав для організації наборів даних та notebook.
- Scrapy (популярний фреймворк Python) — для веб-скрапінгу.
- Scrapy-Splash — для обробки динамічного контенту на сайтах. Наприклад, цін, що рендеряться через JavaScript.
2. Scrapy Spider
Написав парсер на Scrapy для Metro. Нижче представлена спрощена версія того, як я структуризував свої Scrapy-павуки.
Встановив scrapy:
!pip install -q scrapy
І приклад коду:
import scrapy from scrapy.crawler import CrawlerProcess class MySpider(scrapy.Spider): name = "metro" def start_requests(self): urls = <тут згенерувати список url-адрес> for url in urls: yield scrapy.Request(url=url, method="GET", headers=headers, callback=self.parse) def parse(self, response): json_data = json.loads(response.text) <тут видобуваються дані> if __name__ == "__main__": process = CrawlerProcess() process.crawl(MySpider) process.start()
3. Scrapy-Splash Spider
Для скрапінгу АТБ я використовував Scrapy-Splash. Splash дозволяє павуку рендерити JavaScript і працювати з динамічним контентом, що було необхідно для отримання коректних даних з сайту магазину.
Для встановлення і Scrapy, і Scrapy-Splash, я використовував такі команди:
!pip install -q scrapy-splash !pip install -q scrapy
І приклад коду:
import scrapy
import scrapy_splash
from scrapy.crawler import CrawlerProcess
script = """
function main(splash)
splash:init_cookies(splash.args.cookies)
assert(splash:go{
splash.args.url,
headers=splash.args.headers,
http_method=splash.args.http_method,
body=splash.args.body,
})
assert(splash:wait(0.5))
local entries = splash:history()
local last_response = entries[#entries].response
return {
url = splash:url(),
headers = last_response.headers,
http_status = last_response.status,
cookies = splash:get_cookies(),
html = splash:html(),
}
end
"""
headers = {"ключ": "значення"}
class MySpider(scrapy.Spider):
name = "atb"
def start_requests(self):
urls = <тут згенерувати список url-адрес>
for url in urls:
yield scrapy_splash.SplashRequest(url, self.parse,
endpoint='execute',
cache_args=['lua_source'],
args={'lua_source': script},
headers=atb_headers
)
def parse(self, response):
<тут видобуваються дані>
if __name__ == "__main__":
process = CrawlerProcess()
process.crawl(MySpider)
process.start()
4. Scheduling Spiders
На Kaggle є можливість налаштувати автоматичне виконання notebook. Таким чином зручно періодично запускати павуків Scrapy без необхідності ручного втручання. Для налаштування планування виконайте наступні кроки.
У правому меню знайдіть опцію:
Schedule a notebook to run.Налаштуйте розклад відповідно до потреб (наприклад, щоденно, щотижня, щомісяця). Форма проста у використанні й інтуїтивно зрозуміла. У моєму випадку я налаштував щомісячний запуск скриптів.

5. Завантаження даних на Kaggle
Після збору даних я створив датасет Kaggle для зберігання та поширення інформації. Це забезпечує легкий доступ до інформації для подальшого аналізу та візуалізації.
Усі зібрані дані про ціни на продукти у АТБ та Metro можна знайти в цьому датасеті.
6. Ну і аналіз даних
Після збору даних я створив Kaggle's notebook для аналізу цін з часом. Процес підготовки даних і які дані там є, ви можете знайти тут.
Після виконання попередньої обробки даних я отримав наступні результати:

Середня ціна
Зміни цін з часом у АТБ
- Мінімальна ціна: 68.58;
- Максимальна ціна: 77.05;
- Різниця: 8.47 (зростання на 11%).
Зміни цін з часом у Metro
- Мінімальна ціна: 161.43;
- Максимальна ціна: 177.95;
- Різниця: 16.52 (зростання на 9%).
Порівняння цін за категоріями
Ось порівняння цін тих категорій в АТБ, де відбулися зміни, більші за 15%:
| Category | First Price | Last Price | Difference |
|---|---|---|---|
| Juices, Nectars | 34.87 | 53.98 | 0.354075 |
| Chocolate | 53.34 | 72.07 | 0.259952 |
| Coffee, Cocoa | 139.27 | 178.24 | 0.218641 |
| Kitchen Goods | 83.15 | 105.65 | 0.212967 |
| Baked Goods, Pastries | 33.90 | 42.90 | 0.209790 |
| Oils and Vinegar | 112.63 | 140.98 | 0.201108 |
| Hard Cheeses | 60.95 | 76.15 | 0.199594 |
| Sour Cream | 36.26 | 45.20 | 0.197788 |
| Water | 26.23 | 32.67 | 0.196939 |
| Breakfast Cereals | 33.45 | 41.43 | 0.192729 |
| Flour | 44.35 | 54.15 | 0.180979 |
| Baby Dairy Products | 15.50 | 18.83 | 0.176627 |
| Nuts, Dried Fruits | 50.16 | 60.00 | 0.163974 |
| Cream | 37.10 | 44.33 | 0.163158 |
| Yogurts | 28.91 | 34.51 | 0.162276 |
| Pet Food | 49.03 | 58.38 | 0.160262 |
| Fruits, Berries | 44.56 | 52.93 | 0.158070 |
| Batteries | 61.73 | 73.03 | 0.154731 |
| Candies | 99.38 | 117.36 | 0.153158 |

А ось порівняння змін цін категорій Metro:
| Category | First Price | Last Price |
|---|---|---|
| Babies | 162.72 | 159.95 |
| Bakery | 59.07 | 62.37 |
| Canned Food, Oil, Vinegar | 129.71 | 145.60 |
| Chemicals | 167.64 | 179.31 |
| Crisps and Snacks | 75.12 | 83.27 |
| Dairy and Eggs | 102.97 | 111.06 |
| Drinks | 123.01 | 135.72 |
| Eighteen Plus | 418.15 | 421.95 |
| For Animals | 220.11 | 236.55 |
| Frozen | 209.00 | 235.10 |
| Fruits and Vegetables | 134.88 | 194.08 |
| Hobby and Rest | 294.90 | 165.82 |
| Home Interior and Textiles | 227.50 | 189.43 |
| Hot Drinks | 202.35 | 227.18 |
| Household Goods | 141.75 | 228.22 |
| Kitchenware | 288.90 | 329.60 |
| Meat, Fish, Poultry | 170.23 | 195.46 |
| Packets and Cereals | 93.96 | 102.67 |
| Personal Hygiene | 213.18 | 207.52 |
| Sauces and Spices | 71.01 | 84.39 |
| Snacks and Sweets | 79.66 | 98.33 |
| Stationery | 94.66 | 99.20 |

Висновок
З серпня 2023 до вересня 2024 року дані показують суттєві коливання цін у різних категоріях продуктів в супермаркетах АТБ та Metro. АТБ продемонстрував більш значні зміни. При цьому в окремих категоріях, таких як соки, шоколад та кава, спостерігалося зростання цін понад 20%. Ці збільшення, ймовірно, були спричинені факторами ланцюга постачання та інфляцією.
Metro загалом демонстрував помірніші зміни, проте в категоріях «Фрукти та овочі» спостерігалося значне зростання. «Побутові товари» також зазнали різкого зростання цін, у той час як ціни на товари з категорій «Хобі та відпочинок» й «Інтер'єр дому» несподівано знизилися. Можливо, через розпродажі або зміну пріоритетів споживачів.
Цей аналіз підкреслює, що ціни в супермаркетах можуть варіюватися не лише між різними ритейлерами, але й у межах категорій з часом. Автоматизувавши збір та аналіз даних за допомогою таких інструментів, як Scrapy та Scrapy-Splash, стає легше відстежувати ці зміни.
Такі інсайти можуть допомогти споживачам приймати обґрунтовані рішення щодо покупок, а ритейлерам — ефективно коригувати стратегії ціноутворення.
Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.
12 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів