Скрейпимо публічні дані, або Як я робив мапу АЗС

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

24 лютого 2022 року росія почала повномасштабну війну проти України. Буквально в перші години на АЗС утворились кілометрові черги, які досі не зникли. Суттєво ситуація погіршилася в травні 2022 року після ракетного удару по нафтопереробній галузі. Як власник авто, я довго страждав, переглядаючи додатки різних АЗС в пошуках бензину і врешті-решт вирішив зробити свій ресурс, де буде видно загальну картину станом на зараз. Так з’явилась zapravka.info (далі — «заправка») — онлайн мапа працюючих АЗС з фільтрацією по типу пального та можливості купити за готівку чи банківську картку.

Спочатку я ділився посиланням з друзями і в себе в соцмережах, але сайт сподобався людям настільки, що зараз відвідуваність сягає більше 1000 унікальних користувачів на день, а мій коментар про «заправку» потрапив в найкращі в темі про пальне на DOU. Тому я вирішив поділитися зі спільнотою підкапотними процесами і розібратись, як робити корисний продукт на основі публічних даних. Стаття буде корисною людям, які роблять свої перші кроки в скрейпінгу, але вже мають уявлення, як клієнт і сервер спілкуються між собою та знайомі з мовою програмування (будь-якою).

Мене звати Вадим, я — Lead Software Engineer в Mate academy. Моя кар’єра в IT почалася з Frontend розробки, але бажання вивчити щось нове дозволило швидко познайомитися з Backend і навчитись закривати задачі end to end. Ще в доковідні часи на нетворкінгу спілкувалися з колегами про важливість pet-проєктів для розробника, і що основна задача девелопера, це не писати код, а вирішувати проблеми за допомогою коду. Крім того, pet project допомагає відчувати ownership та відповідальність за продукт, який ти робиш. На lemon.io є цікава стаття на цю тему. Я радий, що можу зробити щось корисне для суспільства за допомогою коду і, в цьому випадку, зекономити людям трохи часу хоча б в пошуках місця, де заправитись.

Як це працює

В основі роботи додатку лежить робота з публічними даними за допомогою скрейпінгу. Це коли ми кодом імітуємо візит на сайт і парсимо контент в потрібну нам структуру даних. Підхід дуже популярний в сферах продажу чи оренди житла / авто, e-commerce, порівняння цін на товари чи послуги, і т. д.

Найпопулярніші приклади українських компаній, побудованих на скрейпінгу:

  • ЛУН, flatfy і їх дочірні продукти (продаж та оренда нерухомості).
  • hotline.ua, price.ua (порівняння цін в інтернет магазинах).
  • в Mate academy ми скрейпимо вакансії для студентів з різних ресурсів.

Одночасно з «заправкою» з’явились ще декілька телеграм-ботів, де теж можна дізнатись стан справ на АЗС. Вони також побудовані на даних, зібраних з публічних джерел:

Чи це законно

Працюючи з даними з інших ресурсів свідомо виникає питання, наскільки це легально. Якщо відповісти коротко, то вебскрейпінг легальний, якщо ми працюємо з публічними даними. Іншими словами, якщо можливо відкрити посилання в браузері і побачити контент, значить дані можна скрейпити. Існує навіть прецедент програної справи LinkedIn проти компаній, які парсили публічні профайли користувачів.

У статті я хотів би детальніше розповісти, які проблеми вирішував під час роботи з даними мереж АЗС. Базовий принцип роботи «заправки» — зібрати дані і розмістити маркери на мапі.

В якості мапи я обрав google maps, але є ще варіант — mapbox. UI частина зроблена на nextjs і деплоїться на vercel (так було найшвидше + я вже працюю з реактом). Бекенд — nestjs, який я деплою на сервер digitalocean (загалом тут підійде будь який хостинг, де можна купити віртуальну машину).

Так виглядав proof of concept, де був доступний тільки WOG:

Як працювати з даними

Перша і основна проблема, з якою я зіштовхнувся, це збір даних і їх конвертація в потрібний мені формат. Кожна мережа показує дані своїм способом. В одних можна просто зробити запит на їх API і отримати майже готову до «production» відповідь, а для інших потрібно відкривати автоматизований браузер і парсити HTML. Також я не додавав всі станції одразу, а робив це поступово, по мірі знаходження інформації про роботу тієї чи іншої мережі. Відповідно додавання нових мереж не мало б причиняти багато страждань і рефакторингу існуючого функціоналу (це той же Open-Closed principle з SOLID).

Для спрощення життя я використав патерн «адаптер». В його основі якраз можливість приводити різні об’єкти до одного формату. Якщо дуже поверхнево, то архітектура «заправки» виглядає приблизно так:

У цьому прикладі роль «скрейпера» — дістати дані тим чи іншим способом, а адаптера — перетворити відповідь у зручний для подальшого використання формат. Наприклад, OKKO віддає інформацію про стан пального в форматі HTML:

Так це виглядає в коді:

Після обробки адаптером інформація конвертується в більш зручний формат:

На що звертати увагу при скрейпінгу

Коли ми працюємо з публічними даними, потрібно звертати увагу на те, що дуже часто вони будуть форматовані в стилі «як зручніше для користувача». Приклад з ОККО і їхнім HTML описує ситуацію найкраще.

Основні місця, де можна шукати дані, це:

  • HTML-сторінка.
  • Відкрите API.
  • Мобільний додаток.

Якщо вдалось знайти відкрите API, вважайте це перемогою (буде менше проблем з форматуванням). У випадку з АЗС я дивився, в першу чергу, на запити на сторінці мапи станцій через Chrome DevTools (більше про Chrome DevTools можна почитати в статті мого колеги).

Приклад: API + HTML контент (OKKO)

Для ОККО вдалося побачити запит на /fuel-map.

Проблема була в тому, що програмно сюди не виходило зробити запит (через fetch, request чи їх аналоги в інших мовах) в зв’язку з їх системою захисту від DDOS. Але URL коректно працюватиме, якщо його відкрити в браузері. На допомогу прийшла бібліотека Playwright. Вона корисна і використовується, в основному, для end to end тестування, але в той же час ніхто не забороняє використати їх headless браузер в своїх цілях. Код для отримання даних з ОККО виглядає приблизно так:

Я ще додатково передаю user-agent браузера Chrome, щоб мій запит виглядав менш підозріло.

В Firefox є дуже зручний спосіб побачити відформатований JSON (про інші особливості Firefox можна почитати в статті мого колеги). Дані, які нам потрібні, знаходяться в полі notification. Вже під час написання статті я побачив, що у відповіді з’явились поля {fuel_name}_tip_oplati. Це суттєво спрощує парсинг, але ще декілька тижнів тому цих полів не було, тому доводилось парсити HTML з notification).

Для обробки «сирого» HTML я використав бібліотеку node-html-parser (підійде будь-який аналог на вашій мові програмування). Бібліотека дозволяє перетворити HTML-рядок на об’єкт з інстансами HTML-нод (схожий до DOM в браузері) і використовувати більш декларативні методи і властивості, наприклад node.textContent. Основна особливість підходу — шукаємо контент за ключовими словами. У цьому випадку нам важливі наступні фрази:

  • «Графік роботи:».
  • «За готівку і банківські картки доступно».
  • «З паливною карткою і талонами доступно».

Алгоритм наступний:

  • Проходимось по всіх HTML-нодах.
  • Якщо контент містить ключові слова, парсимо відповідний блок.

Після парсингу дані потрапляють в адаптер, на виході з якого ми отримуємо вже готовий до використання об’єкт, котрий і передасться на UI. Приклад того, як адаптер мапить дані:

Приклад: API (WOG)

Найпростіше було працювати з WOG. На сторінці з мапою одразу видно запит на api.wog.ua/fuel_stations

Єдиний нюанс — немає інформації про пальне. Її можна отримати, зробивши додатковий запит по id станції:

Як і в прикладі з OKKO, отримуємо дані про пальне, розпарсивши рядок workDescription, тільки тут простіше, бо працюємо зі звичайним рядком, а не з HTML-кодом. Ключові фрази в цьому випадку:

  • «пальне відсутнє»;
  • «тільки спецтранспорт»;
  • «готівка»;
  • «талони».

Приклад: Source code (UPG)

У випадку з UPG, сайт не шле запити на API, а дані на сторінку додаються ще на сервері. До того, як сторінка завантажиться і відобразиться в браузері. Тут корисно було почитати source code сторінки і знайти, як малюється сама мапа.

Знаходимо в devtools запит на сторінку:

Якщо трохи прогортати, знайдемо JS, що відповідає за ініціалізацію мапи і об’єкт objmap:

Це саме те, що нам потрібно. Подивимось на об’єкт в консолі:

Playwright дозволяє виконати JS код на сторінці за допомогою команди page.evaluate. Код для отримання даних виглядатиме наступним чином:

Пальне, де Price != 0, доступне для покупки за готівку чи банківську картку. Далі стандартна процедура з форматуванням даних і маємо +1 ресурс.

Приклад: мобільні додатки (БРСМ Нафта, АВІАС, Socar)

Зараз АВІАС і Socar показують більш-менш актуальні дані в вебверсії, але в момент додавання їх до «заправки», дані з мобільного додатку були точніші. АВІАС показував всі АЗС на сайті незалежно від того, є пальне, чи нема, а Socar в якийсь момент поламався і почав показувати застарілі дані (бензин по 30 грн, наприклад). Тому я вирішив перевірити їх мобільні додатки і знайшов там багато цікавого. Основне, що мені було потрібно, це інформація про API, яке там використовується. За допомогою додатку proxyman я перевірив запити, які надсилає мій телефон при використанні апки. Ось декілька скріншотів з БРСМ Нафта. Крім аналітики, тут з’явились запити на td4.brsm-nafta.com. Один з них був на /get_full_ffs. Те, що нам потрібно:

Повна адреса: td4.brsm-nafta.com/...​pi/v2/Mobile/get_full_ffs

В браузері посилання теж без проблем відкривається і віддає необхідні дані. Якщо масив fuels не пустий, це означає, що на заправці є пальне у вільному продажу.

Зробивши додатковий запит на інформацію про заправку, отримаємо необхідні дані.

АВІАС віддає дані в .zip форматі, тому перед використанням їх потрібно додатково розархівувати. З Socar особливих проблем не було, стандартний запит на API і форматування відповіді. Як наслідок, я додав +3 ресурси теж без особливих зусиль.

Висновки

Використавши нестандартні підходи до отримання даних, на «заправці» вдалось зібрати близько 2000 АЗС з 6 найбільших мереж України. А правильний архітектурний підхід дозволяє додавати нові станції досить швидко. Останню мережу «БРСМ Нафта» я додав за годину, при цьому більше 30хв пішло на те, щоб намалювати маркер для мапи в figma.

До речі, про маркери. Мій внутрішній перфекціоніст не витримав і я таки намалював стандартні іконки для всіх мереж:

Зараз «заправка» виглядає набагато приємніше, ніж в першому варіанті:

Сподіваюсь, стаття була корисною і ви отримали більше натхнення і прикладів, як можна працювати з публічними даними і робити корисні речі. Буду радий, якщо хтось із вас зробить щось подібне і вирішить проблему, яка давно висить тягарем і забирає багато часу. Нижче додам декілька інсайтів та порад, які вважаю корисним виділити зі статті:

Поборов 100vh на телефонах

Хто верстав різні full-screen секції, той знає, що 100vh на телефоні рахуються без урахування панелі з URL, яка ховається при скролі. Якщо сторінку не скролити, то панель перекриває частину контенту, що дуже незручно. Є різні підходи, як це виправляти. Один з найкращих — значення -webkit-fill-available для Safari та Chrome, або -moz-available для Firefox. Автопрфіксер дозволяє написати max-height: stretch і на виході додає потрібні значення:

Google maps — досить дорогий продукт

Google maps дає $200 в місяць безкоштовно для розвитку продукту. Це ~28500 завантажень карти кожного місяця. Спочатку я думав, що цього буде достатньо, але на момент написання статті (21 червня 2022 р.) «заправка» вже використала $400 з початку місяця і це число продовжує рости. Орієнтуюсь на чек в $600 за червнеь. Not bad для волонтерського продукту, правда? :) Поки що просто замінюю акаунт, коли безкоштовні кредіти добігають кінця + в дружини ще діє $300 google cloud free trial. Це дозволяє хостити мапу умовно безкоштовно.

Це не прохання підтримати мене фінансово, просто ділюсь враженням. Якщо ж маєте бажання допомогти проєкту, задонатьте на потреби ЗСУ. Хлопці і дівчата роблять неймовірні речі і саме завдяки їм ми з вами маємо можливість в тому числі і ділитись інсайтами тут на форумі. Особисто я пересилаю гроші в наступні фонди:

Update від 28.06.2022: Google заапрувив «заправку», як «critical responders» і надав $2500/місяць на використання карти до кінця літа.


Копати глибоко — корисно

Ще в минулій статті про анімації я рекомендував розбиратись, як працюють ті чи інші речі. Є декілька простих трюків, щоб дозволили відносно легко отримати доступ до потрібних даних. Яскравий приклад — глобальна змінна objmap в UPG. Я дізнався про неї, почитавши вихідний код сторінки.

Розуміння, як працює інтернет, точно не завадить

Клієнт-серверна комунікація — основа основ, яку варто знати хоча б на базовому рівні. Наприклад, розуміння, що клієнт не отримує дані магічним способом, а робить простий запит на API, дозволяє думати в потрібному напрямку. У тому числі це дозволило працювати з мережами, чиї дані доступні тільки в мобільних додатках. Почитати про це детальніше можна в статті від MDN.

Pet projects — важливі

До IT я допомагав батькам з сімейним бізнесом. В нас була (і є) невелика мережа продуктових магазинів. Там я познайомився з 1С і навчився автоматизовувати рутинні процеси, так і потрапив в девелопмент. Одна з найбільших проблем, яку ми мали, це автоматизація обліку розрахунків з постачальниками. Тому ще тоді, будучи Junior Frontend Developer’ом, я вже почав вивчати бекенд і робити власний додаток. Код там був дуже страшний (дуже!), але свою задачу та штука виконувала. А відчуття, що я своїми силами створив щось, що дозволило вирішити проблему бізнесу, було неймовірно крутим.

Зараз я продовжую виділяти декілька годин в місяць (в неробочий час, звісно ж) на власні проєкти і це дозволяє змінити контекст. Тут має місце жарт про водія вантажівки, який після тяжкого дня повертається додому і відпочиває, граючи в умовний Euro Truck Simulator.

Що це мені дає?

  • Я маю можливість спробувати щось нове, з чим ще раніше не працював. Буде це нова технологія чи принципово новий підхід в розробці — не так важливо.
  • Круто відчувати ownership за продукт і вирішувати, що саме там потрібно робити. Хоча і в компанії мені цього більш ніж достатньо, але корисно подивитись на інші домени.
  • Приємно, коли людям подобається і приносить користь те, що я роблю. Додам пару скріншотів для натхнення.

А який функціонал ви б хотіли бачити на «заправці»? Маєте приклади власних петпроєктів? Є зауваження чи фідбек по роботі продукту?

Відповідь на ці питання та інші думки сміливо пишіть в коментарях :)

Сподобалась стаття? Натискай «Подобається» внизу. Це допоможе автору виграти подарунок у програмі #ПишуНаDOU

👍ПодобаєтьсяСподобалось65
До обраногоВ обраному17
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

дякую за вашу працю! як користувач який сьогоді заправився по 50, але побачив бензин також по 58 хотів уточнити — чи скрейпиться\доступна для відображення вартість пального? можливо було б показувати наприклад червоним дорожче, зеленим -звичайна середня вартість, зірочкою — найкраща ціна?

Дякую за фідбек. Загалом можна робити порівняння по ціні. Сам декілька разів зустрічав бензин по 60+ в період жорсткого дефіциту. Зараз на всіх більш менш великих заправках ціни в районі 50-52грн, тому вже не так боляче.

З сумного, деякі компанії не показують ціну пального на сайті, тому потрібно ще погратись, щоб отримати необхідні дані. Але ідея крута, записав в можливі наступні фічі :)

зайди у додаток ВОГ
Знайди на мапі Камʼянець-Подільський
За річкою Смотрич є ще 1 АЗС(навпроти Авіасу має бути), на якій є паливо. А в твоїй апці, наче, немає
ВОГ зняв ліміти, тож дані у інакшому форматі тепер. Можливо це додасть ще заравок на карту.
Дякую!

Так іноді буває, там лаг в 10-15хв в апці порівняно з офіційним АПІ. Припускаю, що це одиничний випадок і формат там ок підлаштований, бо на інших станціях все працює

Є ще до речі мережі АЗС, як Мотто наприклад, де наявність пального можна через телеграм бот моніторити. t.me/Motto_Bot . Якщо із цього боту можливо автоматизувати збір даних, то буде ще +1 мережа на мапі.

UPD. Ще напевно AMIC можна додати. Наявність пального ось тут викладають: amicenergy.com.ua/ua/prodykciya

P.S. Щиро дякую за ваш проєкт. Дуже корисна штука вийшла.

Дякую дякую, мотто буквально сьогодні додав, уже є на «заправці» 😜
А от АМІС гляну, ще не доходили до нього ручки

Ви мотто парсили через тг? Я якось пробував але акаунт з якого я намагався стукати в бот, тг забанив навічно (правда потім розбанив по запиту). А додаток їхній добре захищений, апішку витягнути не вдалось на жаль.

Ні, я знайшов апі від yaskrava. Вони разом з убором зробили апку

і amic вдалось додати, дякую за наводку

Кому треба багато парсити рекомендую чудовий сервіс apify.com (ніяк з ними не звязаний, але в низ крутий саппорт і вони підтримують Україну).

Не треба паритись з хедлесс браузерами, вручну світчити проксі, юзерагенти, виставляти таймаути між сторінками і попадати на блокі клаудфлера) Просто через будь який http клієнт віддаєте ім url і отримуєте данні)

Цікава штука, дякую 🤓

Дякую, Вадиме! Як тестувальник можу сказати, що це найвдаліший проект з усіх наявних на ринку!

Хех, дякую, приємно це чути 😜

Доброго дня! Чи все там добре з кроном? Бо останнє оновлення показує 10:54... :(

це дивно, наче все працює і в мене ок показує

snipboard.io/DNSxwr.jpg

Вже так. А дакілько годин тому не оновлювалось...

Знову я ))))))))))))))) Шось там з UPG — сайт (і додаток) показує шо бєнз є, zapravka.info якщо обрати всі станції — показує шо бєнз 95 є. а коли обрати Бензин А95+ => UPG заправка не показується :( відос ===> take.ms/BtOqj

точно, був баг. Пофіксив, зараз все працює
snipboard.io/5d7XoS.jpg

дякую, що допомагаєш, це приємно :)

ще даю наводку — у KLO нарешті запрацював додаток і показує наявне пальне ;) досить коректно, перевіряв по АЗС, що занходиться поруч з домом

Так, це хороша новина. Єдиний нюанс — там апі закрите, потрібна автентифікація. Це не зовсім підпадає під концепцію публічних даних, але можна ж нікому не казати 😅

OKKO навіть headless Chrom(ium) банить, тому я щоб автоматизувати завантаження ексцельки з пальним звідти використав Selenium.

Цікаво що із Playwright вдалось. Треба буде ознайомитись із цим рішенням — раніше не користувався.

Так, в мене теж перші рази не виходило, а потім вийшло 🤪
Там ще user agent кастомний може допомогти

User Agent полюбому — бо так воно навіть curl банить.

Так а в чому принципова різниця між headless Chromium та Selenium в плані детекції їх як робота?

Без поняття
Можливо headless Chromium якось ідентифікує що він — headless.

Для мене принципова різниця в тому що headless Chromium (із тим же Селеніумом) воно банить, а просто Chromium із Селеніумом — ні.

Selenium отвратительный для скрейпинга

Я робив саме через playwright, все чітко)

@Vadim Ilchenko, гарна реалізація

Я також робив бота одним з перших) Його нема в Вашій статті. Моніторить вибране місто в радіусі 20 км. Якщо є якісь зміни в наявності, присилає оновлений список.
Є всі основні мережі.
Лінк на бот: t.me/de_palyvo_bot

Я не дуже розумію одну річ.
Сьогодні (29 червня) зайшов на ваш сайт і показує, що у місті Подільськ на авіасі нічого немає. Але на сайті авіасу начебто щось є. Я чогось не розумію?
Якщо раптом ви відповісте у найближчі години, то я зганяю перевірю =)
P. S. Вчора був там о 21:00, лише по талонах.

Сайт і мобільна апка можуть показувати різні дані. В якийсь момент я почав працювати з АПІ саме мобільних додатків, тому дані можуть відрізнятись. Найкращий варіант в даному випадку — зателефонувати на гарячу лінію

На що звертати увагу при скрейпінгу

Якщо розробник робить webscraping для компанії/замовника — то тут можна повністю зосередитись на технічній стороні цього питання.
Але якщо розробник хоче створити продукт на базі webscraping тоді доведеться самостійно приділяти увагу іншим аспектам цієї справи (юридичному в тому числі).

Тут є ряд нетехнічних нюансів.

Публічні дані.

Існує навіть прецедент програної справи LinkedIn проти компаній, які парсили публічні профайли користувачів.

З попередніх судів (в тому числі і з бідьш ранніх судів з lindedin) зараз в західних юрисдикціях є більш-менш зрозуміле визначення того, що є публічними даними.
Публічними даними (якщо зовсім спростити) є те, що.. може бути отримано без авторизації/реєстрації.

Власне через це, зараз в найбільших соціальних мережах більшість суттєвої інформації доступно лише авторизованим користувачам, які погодились на певні умови використання.(декілька років тому це було не так)
Для авторизації тут попросять логін/пароль, email, номер мобільного і/або прив’язку аккаунту іншого сервісу.
Згода користувача з умовами використання — тобто те, на що більшість користувачів погоджуються відразу не читаючи (а там ймовірніше за все є пункт, який забороняє webscraping).
І тут вже не має значення кількість користувачів у системі, дві сотні чи два мільярди — якщо інформація доступна лише авторизованим користувачам, то вона вже не є публічною.

Безпекові ризики.
В Україні вже є прецедент, коли розробник хотів зробити щось корисне з відкритими даними за допомого webscraping, але дещо пішло трішки не так dou.ua/forums/topic/24731
Так чи інакше автором має бути враховано, що дані, які він так охайно позначає на карту — цілком можуть бути використані.. зовсім іншими людьми для зовсім інших цілей.
Можливо дехто вважає такі ризики перебільшенням, але особисто мене в нинішніх обставинах не дуже приваблює перспектива опинитися у черзі/пробці за пальним разом з ще декількома сотнями водіїв, які були майже одночасно зкеровані в цю одну заправку з цього сайту, координати якої доступні не тільки водіям і не тільки з України.

Приклад: мобільні додатки (БРСМ Нафта, АВІАС, Socar)

На сайтах двох з них опубліковані умови використання за якими поширення інформації з їх додатків/сайту можливе лише за їх письмової згоди.
У автора є їх письмова згода? Просто цікаво.
І звісно, якщо присутня саме авторизація з мобільного додатку — то ці дані вже не дуже й публічні.

Дякую за конструктив. Дійсно, якщо дані доступні після автентифікації, то їх не можна використовувати в скрейпінгу. Грубо кажучи, якщо посилання відкривається в інкогніто, то це можна скрейпити.

Також є різні «види» публічних даних, тут теж погоджуюсь. Викладати в загальний доступ адреси проживання людей не зовсім ок 🤪

Щодо черг маю зауважити, що особисто бачив, як одна заправка має кілометрову чергу, а інша, через 500м, пуста. Скоріш за все люди бояться їхати далі, бо не знають, чи є там бензин. «Заправка» як раз створена більше для того, щоб розвантажити АЗС.

Підозрюю, що в LinkedIn з історії вище теж була прописана заборона скрейпінгу в їх policy, але людей це не спиняло. Припускаю, що я можу бути неправий тут, але все ж роблю корисну справу. Тим більше, що проект не має комерційної складової.

Викладати в загальний доступ адреси проживання людей не зовсім ок 🤪

Але МінЮст це робить. Реєстр ФОПів — публічний із адресами.

дякую! Дуже корисна штука!

Проект крутий! Чи можна, будь ласка, подивитись на репозіторій проекта?

Привіт. Репозиторій поки приватний, тому не вийде глянути. А що саме цікавить? Загалом там код одного скрейпера досить просто виглядає, а все інше — обв’язка під фреймворки

Він хоче подивитись код, бо диявол в деталях =)

А всех заправок то и нет. А именно на региональных сетях было топливо всегда, без очередей и по вменяемым ценам.
Палю годноту: overpass-turbo.eu/s/1jId
Сравните: imgur.com/a/IHBvogY и imgur.com/a/piWYlBM

Доречі, останнім часом дійсно бачу багато локальних АЗС з пальним. Іноді ціни завищені, але в цілому ок.

А звідки тут беруться дані? Ще й UI такий «девелоперський») цікаво 😜

Перетягнiть мапу на будь-яке мiсто и натиснiть «Старт».

Заправився на такій АЗС. Хто знає як лічільник палива зкинути? Бо нагнали повітря в бак(або неякісного пального), і тепер в мене датчік показує шо захоче, а не реальний залишок палива.

Корисний проект! Дякую! Цікаво було би мати додаток для мобільного телефона, з можливістью бачити требуєме пальне навкруги поточного положення (автомобіля)

Цікава ідея, дякую 😉
Зараз на «заправці» можна перевірити свою локацію, але щось типу «х заправок продають пальне в радіусі 1км» було б корисно, погоджуюсь

Треба парсити телеграм канали, інакше інформація завсім нерелевантна. Спробуй додати ось цей канал, там зрозуміла структура повідомлень про пальне

t.me/kyiv_gas

Телеграм канали в більшості випадків беруть дані з тих самих офіційних апок, тому тут все ± однаково. Інша справа, коли люди самі можуть репортити в канал стан пального на тій чи іншій станції.

Дякую за наводку, подивлюсь на скільки це можливо 😉

Так, той канал, що я скинув бере інфу саме від людей і я саме по ньому оріентуюся, дуже допомогає.
Дякую за статтю!

Цікаво. Ще й про чергу звітують )

#!/usr/bin/env python3

import requests,json

def wog_station(number):
    station_dict = []
    apiurl = "https://api.wog.ua/fuel_stations/"+ str(number)
    apireq = requests.get(apiurl)
    apidata = json.loads(apireq.text)
    main_data = apidata['data']
    station_dict.append(main_data['city'])
    station_dict.append(main_data['link'])
    station_dict.append(main_data['workDescription'])
    station_dict.append(main_data['name'])
    return station_dict

for number in range(800,1200,1):
    try:
        print(number,wog_station(number))
    except KeyError:
        print("")

Підписатись на коментарі