ВГТУ
2024-12-03
Сбор данных является ключевым элементом в разработке интеллектуальных систем. Открытые API предоставляют доступ к различным данным, которые можно использовать для анализа и построения моделей. В этой лекции мы рассмотрим, что такое API, как собирать данные с помощью API, и какие инструменты и методы можно использовать для анализа этих данных.
API (Application Programming Interface) — это набор правил и механизмов, с помощью которых приложения взаимодействуют друг с другом. Открытые API предоставляют доступ к данным и функциональности, предоставляемым другими сервисами и платформами.
import requests
url = "https://api.example.com/data"
params = {
"api_key": "your_api_key",
"param1": "value1",
"param2": "value2"
}
response = requests.get(url, params=params)
data = response.json()
import pandas as pd
# Преобразование данных в DataFrame
df = pd.DataFrame(data)
# Очистка и подготовка данных
df = df.dropna()
df['date'] = pd.to_datetime(df['date'])
import requests
url = "https://api.example.com/graphql"
query = """
{
data(param1: "value1", param2: "value2") {
field1
field2
}
}
"""
response = requests.post(url, json={'query': query}, headers={'Authorization': 'Bearer your_api_key'})
data = response.json()
Для работы с открытыми API существует множество библиотек, которые упрощают процесс отправки запросов, обработки ответов и управления аутентификацией. Рассмотрим некоторые из них:
Описание: Requests — это одна из самых популярных библиотек для работы с HTTP-запросами в Python. Она проста в использовании и поддерживает все основные HTTP-методы (GET, POST, PUT, DELETE и другие).
Пример использования:
import requests
url = "https://api.example.com/data"
params = {
"api_key": "your_api_key",
"param1": "value1",
"param2": "value2"
}
response = requests.get(url, params=params)
data = response.json()
Описание: HTTPx — это современная библиотека для работы с HTTP-запросами, поддерживающая асинхронные операции. Она предоставляет интерфейс, схожий с Requests, но добавляет поддержку асинхронного программирования.
Пример использования:
import httpx
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data", params={
"api_key": "your_api_key",
"param1": "value1",
"param2": "value2"
})
data = response.json()
return data
Описание: Aiohttp — это асинхронная библиотека для работы с HTTP-запросами и создания веб-сервисов. Она хорошо подходит для случаев, когда требуется высокая производительность и работа с большим количеством запросов.
Пример использования:
import aiohttp
import asyncio
async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get("https://api.example.com/data", params={
"api_key": "your_api_key",
"param1": "value1",
"param2": "value2"
}) as response:
data = await response.json()
return data
loop = asyncio.get_event_loop()
data = loop.run_until_complete(fetch_data())
Описание: Graphene — это библиотека для работы с GraphQL API. Она позволяет легко создавать запросы и мутации к GraphQL API.
Пример использования:
import requests
url = "https://api.example.com/graphql"
query = """
{
data(param1: "value1", param2: "value2") {
field1
field2
}
}
"""
response = requests.post(url, json={'query': query}, headers={'Authorization': 'Bearer your_api_key'})
data = response.json()
Описание: PyGraphQL — это еще одна библиотека для работы с GraphQL API. Она предоставляет удобный интерфейс для выполнения запросов и обработки ответов.
Пример использования:
Описание: Axios — это популярная библиотека для работы с HTTP-запросами в JavaScript. Она поддерживает промисы и асинхронные функции.
Пример использования:
const axios = require('axios');
axios.get('https://api.example.com/data', {
params: {
api_key: 'your_api_key',
param1: 'value1',
param2: 'value2'
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
Описание: OkHttp — это мощная библиотека для работы с HTTP-запросами в Java, поддерживающая синхронные и асинхронные запросы.
Пример использования:
OkHttpClient client = new OkHttpClient();
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.example.com/data").newBuilder();
urlBuilder.addQueryParameter("api_key", "your_api_key");
urlBuilder.addQueryParameter("param1", "value1");
urlBuilder.addQueryParameter("param2", "value2");
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
} else {
String responseData = response.body().string();
System.out.println(responseData);
}
}
});
Описание: HttpClient — это встроенная в .NET библиотека для работы с HTTP-запросами.
Пример использования:
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
string url = "https://api.example.com/data?api_key=your_api_key¶m1=value1¶m2=value2";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseData = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseData);
}
}
Nominatim — это инструмент для геокодирования, который использует данные OpenStreetMap (OSM) для преобразования адресов в координаты (широта и долгота) и обратно. Он предоставляет удобный API, который можно использовать для различных приложений, связанных с геолокацией.
Пример запроса на преобразование адреса в координаты:
import requests
address = "1600 Amphitheatre Parkway, Mountain View, CA"
url = "https://nominatim.openstreetmap.org/search"
params = {
"q": address,
"format": "json",
"addressdetails": 1
}
response = requests.get(url, params=params)
data = response.json()
# Получаем координаты первого результата
latitude = data[0]["lat"]
longitude = data[0]["lon"]
print(f"Coordinates: {latitude}, {longitude}")
Пример запроса на преобразование координат в адрес:
import requests
latitude = 37.4224764
longitude = -122.0842499
url = "https://nominatim.openstreetmap.org/reverse"
params = {
"lat": latitude,
"lon": longitude,
"format": "json",
"addressdetails": 1
}
response = requests.get(url, params=params)
data = response.json()
# Получаем адрес
address = data["display_name"]
print(f"Address: {address}")
Пример запроса на поиск мест по ключевым словам:
import requests
query = "restaurant near Mountain View, CA"
url = "https://nominatim.openstreetmap.org/search"
params = {
"q": query,
"format": "json",
"addressdetails": 1
}
response = requests.get(url, params=params)
data = response.json()
# Выводим результаты поиска
for place in data:
print(f"Name: {place.get('display_name')}, Coordinates: ({place.get('lat')}, {place.get('lon')})")
Для более подробной информации и дополнительных параметров запроса вы можете обратиться к официальной документации Nominatim API: Nominatim API Documentation
format
можно установить в json
, xml
, html
, или jsonv2
в зависимости от ваших потребностей.addressdetails
, limit
, bounded
, polygon_geojson
, чтобы настроить запросы под ваши нужды.Для работы с API Nominatim нам понадобится библиотека requests
. Установите её с помощью pip, если она у вас ещё не установлена:
Создайте файл nominatim_app.py
и добавьте в него следующий код:
import requests
class NominatimAPI:
def __init__(self):
self.base_url = "https://nominatim.openstreetmap.org"
def geocode(self, address):
params = {
"q": address,
"format": "json",
"addressdetails": 1
}
response = requests.get(f"{self.base_url}/search", params=params)
data = response.json()
if data:
return data[0]["lat"], data[0]["lon"]
else:
return None, None
def reverse_geocode(self, latitude, longitude):
params = {
"lat": latitude,
"lon": longitude,
"format": "json",
"addressdetails": 1
}
response = requests.get(f"{self.base_url}/reverse", params=params)
data = response.json()
if "error" not in data:
return data["display_name"]
else:
return None
def main():
api = NominatimAPI()
while True:
print("Choose an option:")
print("1. Geocode an address")
print("2. Reverse geocode coordinates")
print("3. Exit")
choice = input("Enter your choice (1/2/3): ")
if choice == "1":
address = input("Enter the address: ")
lat, lon = api.geocode(address)
if lat and lon:
print(f"Coordinates: {lat}, {lon}")
else:
print("Address not found.")
elif choice == "2":
try:
latitude = float(input("Enter the latitude: "))
longitude = float(input("Enter the longitude: "))
address = api.reverse_geocode(latitude, longitude)
if address:
print(f"Address: {address}")
else:
print("Coordinates not found.")
except ValueError:
print("Invalid coordinates.")
elif choice == "3":
print("Exiting the application.")
break
else:
print("Invalid choice. Please enter 1, 2, or 3.")
if __name__ == "__main__":
main()
Теперь вы можете запустить приложение, выполнив следующую команду в терминале:
NominatimAPI класс: Этот класс инкапсулирует взаимодействие с Nominatim API. В нём есть два метода:
geocode
: для преобразования адреса в координаты.reverse_geocode
: для преобразования координат в адрес.main функция: Основная функция, которая предоставляет пользователю интерфейс командной строки для выбора между геокодированием, обратным геокодированием и выходом из приложения.
Пользовательский интерфейс: Пользователь выбирает действие, вводит адрес или координаты, и получает результат от API.
import requests
import tkinter as tk
from tkinter import messagebox
class NominatimAPI:
def __init__(self):
self.base_url = "https://nominatim.openstreetmap.org"
def geocode(self, address):
params = {
"q": address,
"format": "json",
"addressdetails": 1
}
response = requests.get(f"{self.base_url}/search", params=params)
data = response.json()
if data:
return data[0]["lat"], data[0]["lon"]
else:
return None, None
def reverse_geocode(self, latitude, longitude):
params = {
"lat": latitude,
"lon": longitude,
"format": "json",
"addressdetails": 1
}
response = requests.get(f"{self.base_url}/reverse", params=params)
data = response.json()
if "error" not in data:
return data["display_name"]
else:
return None
class NominatimApp:
def __init__(self, root):
self.api = NominatimAPI()
self.root = root
self.root.title("Nominatim API Application")
self.create_widgets()
def create_widgets(self):
# Address Geocoding
self.address_label = tk.Label(self.root, text="Enter address:")
self.address_label.grid(row=0, column=0, padx=10, pady=10)
self.address_entry = tk.Entry(self.root, width=50)
self.address_entry.grid(row=0, column=1, padx=10, pady=10)
self.geocode_button = tk.Button(self.root, text="Geocode", command=self.geocode)
self.geocode_button.grid(row=0, column=2, padx=10, pady=10)
self.geocode_result = tk.Label(self.root, text="")
self.geocode_result.grid(row=1, column=0, columnspan=3, padx=10, pady=10)
# Reverse Geocoding
self.lat_label = tk.Label(self.root, text="Enter latitude:")
self.lat_label.grid(row=2, column=0, padx=10, pady=10)
self.lat_entry = tk.Entry(self.root, width=25)
self.lat_entry.grid(row=2, column=1, padx=10, pady=10, sticky='w')
self.lon_label = tk.Label(self.root, text="Enter longitude:")
self.lon_label.grid(row=2, column=1, padx=10, pady=10, sticky='e')
self.lon_entry = tk.Entry(self.root, width=25)
self.lon_entry.grid(row=2, column=2, padx=10, pady=10, sticky='w')
self.reverse_geocode_button = tk.Button(self.root, text="Reverse Geocode", command=self.reverse_geocode)
self.reverse_geocode_button.grid(row=2, column=3, padx=10, pady=10)
self.reverse_geocode_result = tk.Label(self.root, text="")
self.reverse_geocode_result.grid(row=3, column=0, columnspan=4, padx=10, pady=10)
def geocode(self):
address = self.address_entry.get()
lat, lon = self.api.geocode(address)
if lat and lon:
self.geocode_result.config(text=f"Coordinates: {lat}, {lon}")
else:
messagebox.showerror("Error", "Address not found.")
def reverse_geocode(self):
try:
latitude = float(self.lat_entry.get())
longitude = float(self.lon_entry.get())
address = self.api.reverse_geocode(latitude, longitude)
if address:
self.reverse_geocode_result.config(text=f"Address: {address}")
else:
messagebox.showerror("Error", "Coordinates not found.")
except ValueError:
messagebox.showerror("Error", "Invalid coordinates.")
def main():
root = tk.Tk()
app = NominatimApp(root)
root.mainloop()
if __name__ == "__main__":
main()
NominatimAPI класс: Этот класс остаётся таким же, как и в предыдущем примере. Он инкапсулирует взаимодействие с Nominatim API для геокодирования и обратного геокодирования.
NominatimApp класс: Этот класс отвечает за создание графического интерфейса и обработку взаимодействий пользователя. Он использует tkinter
для создания окна приложения, текстовых полей ввода, кнопок и меток для отображения результатов.
create_widgets метод: Создаёт и располагает виджеты на окне приложения.
geocode метод: Обрабатывает нажатие кнопки “Geocode”, вызывает соответствующий метод API и отображает результат.
reverse_geocode метод: Обрабатывает нажатие кнопки “Reverse Geocode”, вызывает соответствующий метод API и отображает результат.
main функция: Создаёт главное окно приложения и запускает основной цикл обработки событий tkinter
.