forked from UOC-Escola-de-Programacio/python-c1-tema1
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathej1c1.py
More file actions
119 lines (95 loc) · 3.88 KB
/
Copy pathej1c1.py
File metadata and controls
119 lines (95 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
Enunciado:
Desarrolla un cliente HTTP básico utilizando la biblioteca requests de Python.
El cliente debe realizar peticiones a la API pública del sistema de bicicletas compartidas de Barcelona
que sigue el estándar General Bikeshare Feed Specification (GBFS).
Tareas:
1. Realizar una petición GET a la API de GBFS para obtener la lista de feeds disponibles
2. Procesar la respuesta JSON para extraer información relevante sobre los endpoints
3. Manejar posibles errores en las peticiones
Esta es una introducción a las peticiones HTTP en Python utilizando la biblioteca requests
para entender cómo interactuar con APIs web.
Tu tarea es completar la implementación de las funciones indicadas.
"""
import requests
def get_gbfs_feeds():
"""
Realiza una petición GET a la API de GBFS de Barcelona para obtener
la lista de feeds (endpoints) disponibles.
Returns:
dict: Datos de la respuesta si se obtiene correctamente
None: Si ocurre un error en la petición
"""
# La URL base de la API de GBFS de Barcelona
# Se ha corregido el espacio al final de la URL
base_url = "https://barcelona-sp.publicbikesystem.net/customer/gbfs/v2/gbfs.json"
try:
# Realizar petición GET a la URL
response = requests.get(base_url)
# Comprobar si la petición fue exitosa (código 200)
if response.status_code == 200:
# Devolver los datos en formato JSON
return response.json()
else:
# Si el código de estado no es 200, imprimir un mensaje de error
print(f"Error: La petición no fue exitosa. Código de estado: {response.status_code}")
return None
except requests.exceptions.RequestException as e:
# Capturar cualquier error que pueda ocurrir durante la petición
print(f"Error al realizar la petición: {e}")
return None
def extract_feeds_info(feeds_data):
"""
Extrae la información de los feeds disponibles a partir de los datos recibidos.
Args:
feeds_data (dict): Datos de los feeds obtenidos de la API
Returns:
list: Lista de diccionarios con los campos 'name' y 'url' de cada feed
None: Si los datos de entrada son None o no tienen el formato esperado
"""
# Verificar si feeds_data es None
if feeds_data is None:
return None
try:
# Extraer la lista de feeds para el idioma inglés (en)
# Se asume el idioma 'en' como en el ejemplo original
feeds = feeds_data["data"]["en"]["feeds"]
# Crear una lista con la información relevante de cada feed
feeds_info = []
for feed in feeds:
feeds_info.append({
"name": feed["name"],
"url": feed["url"]
})
return feeds_info
except (KeyError, TypeError) as e:
# Manejar el caso en que los datos no tienen la estructura esperada
print(f"Error al extraer la información de los feeds: {e}")
return None
def print_feeds_summary(feeds_info):
"""
Imprime un resumen formateado de los feeds disponibles.
Args:
feeds_info (list): Lista de feeds con los campos 'name' y 'url'
"""
if feeds_info is None:
print("Error: No feeds information available")
return
# Imprimir título y cantidad de feeds
print("=" * 50)
print("Barcelona Bike-Sharing System - GBFS Feeds")
print("=" * 50)
print(f"Available Feeds: {len(feeds_info)}")
print("-" * 50)
# Imprimir información de cada feed
for feed in feeds_info:
print(f"Name: {feed['name']}")
print(f"URL: {feed['url']}")
print("-" * 50)
if __name__ == '__main__':
# Obtener los datos de los feeds disponibles
feeds_data = get_gbfs_feeds()
# Extraer la información relevante
feeds_info = extract_feeds_info(feeds_data)
# Imprimir el resumen
print_feeds_summary(feeds_info)