Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

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

Усі статті, обговорення, новини про Front-end — в одному місці. Підписуйтеся на телеграм-канал!

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 за продукт і вирішувати, що саме там потрібно робити. Хоча і в компанії мені цього більш ніж достатньо, але корисно подивитись на інші домени.
  • Приємно, коли людям подобається і приносить користь те, що я роблю. Додам пару скріншотів для натхнення.

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

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

👍ПодобаєтьсяСподобалось71
До обраногоВ обраному19
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

Привіт, дякую за статтю і класний сервіс! Гарно написана
Щодо карти як варіант можна перейти на безплатний leafletjs сам кілька раз використовував працює коректно, для розміщення маркерів більш ніж достатньо буде. Якщо не підводить пам’ять це ще й український продукт

Дякую за рекомендацію. Наразі ми вписуємось в безкоштовний ліміт гугл карт і я дуже сподіваюсь що паливо в нас буде і ми ніколи більше за ліміт не вийдемо )
В разі чого — подивлюсь на leafletjs

Про скрейпінг все ясно. А чого не написано, як всі ці дані потрапляють на Гугл мепс?

Дякую за зауваження. Там ± стандартне використання maps api. Статтю більше фокусував на те, як отримати дані

дякую за вашу працю! як користувач який сьогоді заправився по 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("")

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