Автоматизація збору цін у супермаркетах за допомогою 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 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів