Модуль 2.4 Робота з даними

REQUESTS ТА API

Курс: Python для аналітиків з нуля

1. ЩО НАВЧИМОСЯ РОБИТИ

Завантажити координати адрес через Nominatim API (безкоштовна геокодування).

API — спосіб програм спілкуватись між собою. Надсилаєш запит, отримуєш JSON з даними. Nominatim, погода, курси валют — все через API.

2. ТЕРМІНОЛОГІЯ

API (Application Programming Interface)

Інтерфейс для програм. URL куди надсилаєш запит, отримуєш дані.

HTTP GET

Запит на отримання даних. Найпоширеніший метод.

Query параметри

Дані у URL після знака питання: ?city=Kyiv&format=json

requests.get(url, params)

Надіслати GET запит, отримати відповідь.

response.json()

Розпарсити JSON з відповіді у Python словник.

timeout

Максимальний час очікування відповіді (секунди). Якщо перевищено — помилка.

3. ТЕОРІЯ

3.1 Як працює API

Приклад: геокодування адреси "Київ, Хрещатик 1"

  • Формуєш URL: https://nominatim.openstreetmap.org/search?q=Київ, Хрещатик 1&format=json
  • Надсилаєш GET запит
  • Отримуєш JSON з координатами
  • Парсиш: витягуєш lat, lon

3.2 Базовий запит

import requests

3.3 Обробка відповіді

Nominatim повертає список результатів:

[

Витягти координати:

data = response.json()

3.4 Обробка помилок

Що може піти не так:

  • Немає інтернету — timeout
  • API недоступний — status_code != 200
  • Невалідний JSON — помилка парсингу
Порожній результат — data = []
import requests

4. КОД З КОМЕНТАРЯМИ

Геокодування списку адрес з CSV:

import requests

5. РОЗБІР ПО РЯДКАХ

headers={'User-Agent': '...'} — ідентифікація. Багато API вимагають це. Nominatim може заблокувати якщо немає.

response.raise_for_status() — викинути виключення якщо код помилки (404, 500 тощо)

time.sleep(1) — пауза 1 секунда. Nominatim дозволяє 1 запит/сек. Більше — бан.

df.iterrows() — ітерація по рядках DataFrame. Повертає (індекс, рядок)
result_df['lat'].notna() — булева серія: True де lat не None/NaN

6. ЗАВДАННЯ 1: ЗНАЙТИ ПОМИЛКУ

Код геокодує 100 адрес без паузи:

for address in addresses:

Відповідь:

Проблема: немає time.sleep() між запитами. Nominatim заблокує після 10-20 запитів.

Виправлено:

for address in addresses:

7. ЗАВДАННЯ 2: ПРОМПТ ДЛЯ AI

Задача: завантажити погоду для координат через Open-Meteo API

API: https://api.open-meteo.com/v1/forecast?latitude=48.46&longitude=35.04¤t_weather=true

Приклад промпту:

Напиши функцію get_weather(lat, lon) що використовує Open-Meteo API. URL: https://api.open-meteo.com/v1/forecast. Параметри: latitude, longitude, current_weather=true. Поверни словник: temperature, windspeed, weathercode. Додай обробку помилок (timeout, status code). Використай requests.get() з timeout=5.

8. ЗАВДАННЯ 3 (ОПЦІОНАЛЬНО)

Пагінація: завантажити 1000 записів з API (по 100 за запит)

Багато API повертають дані порціями (pagination). Треба робити кілька запитів.

Приклад структури API:

GET /api/data?page=1&per_page=100

Підказка:

all_data = []

9. РЕФЛЕКСІЯ

Я розумію що таке API

Я вмію робити GET запити через requests

Я знаю як обробляти JSON відповіді

Я додаю timeout та обробку помилок

Я дотримуюсь rate limits (паузи між запитами)

10. ЩО ДАЛІ

Модуль 2.5: OSINT бібліотеки — BeautifulSoup для парсингу, folium для карт

Головна думка: API = URL + параметри → JSON з даними. Requests надсилає запити, обробляй помилки, дотримуйся пауз.

Рефлексія

Прогрес модуля 0%