Skip to content

Commit

Permalink
New update to download zgz in 2 steps first ids and then all contract…
Browse files Browse the repository at this point in the history
…s from another endpoint
  • Loading branch information
CarlosGonzalezG committed Jun 28, 2024
1 parent fd75d45 commit fbea958
Show file tree
Hide file tree
Showing 4 changed files with 4,185 additions and 5,487 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,4 @@ notebooks
# folders
minors_madrid/
minors_zaragoza/
DESCARGAS/
14 changes: 8 additions & 6 deletions descarga_minors/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Script de Descarga de Datos de Contratación

Este script en Python facilita la descarga automatizada de datos de contratos menores desde los portales de transparencia de los Ayuntamientos de Zaragoza y Madrid, así como de la Generalitat de Catalunya. Además, ofrece la opción de descargar todos los conjuntos de datos de manera simultánea.
Este script en Python facilita la descarga automatizada de datos de contratos menores desde los portales de transparencia de los Ayuntamientos de Zaragoza y Madrid, así como de la Generalitat de Catalunya de manera independiente. Además, ofrece la opción de descargar todos los conjuntos de datos de manera simultánea.

## Requisitos

Expand All @@ -21,25 +21,27 @@ pip install requests beautifulsoup4 pandas sodapy

- **Zaragoza** - Descargar contratos menores y guardarlos en un archivo JSON:

python3 script.py zaragoza --file_path /ruta/a contratos_menores_zaragoza.json
python3 descarga_contratos_mad_zgz_gencat.py zaragoza --file_path /ruta/a contratos_menores_zaragoza.json

- **Madrid** - Descargar contratos menores desde el año 2018:

python3 script.py madrid --start_year 2018 --file_path /ruta/a/contratos_menores_madrid
python3 descarga_contratos_mad_zgz_gencat.py madrid --start_year 2018 --file_path /ruta/a/contratos_menores_madrid

- **Cataluña** - Descargar datos de contratación pública:

python3 script.py gencat --file_path /ruta/a/contratacion_publica_catalunya.csv
python3 descarga_contratos_mad_zgz_gencat.py gencat --file_path /ruta/a/contratacion_publica_catalunya.csv

El comando principal para ejecutar el script y descargar simultáneamente todos los datos es el siguiente:

python3 script.py all --file_path /ruta/a/destino/descargas
python3 descarga_contratos_mad_zgz_gencat.py all --file_path /ruta/a/destino/descargas

### Funcionamiento detallado

El script incluye funciones específicas para la descarga de datos:

- download_contracts_gencat: Descarga datos desde la Generalitat de Catalunya.
- download_contracts_zaragoza: Realiza solicitudes a la API de Zaragoza y almacena los resultados en formato JSON.
- get_contract_ids: Es una función auxiliar para recoger los id de la API de Zaragoza
- download_contracts_zaragoza: Realiza solicitudes a la API de Zaragoza y almacena los resultados en formato JSON en 2 pasos, una primera función que interactúa con la API para recoger todos los id cuyo procedimiento.id es 10 (indica contrato menor) con la función get_contract_ids y una segunda llamada a otro endpoint para obtener la información completa de los contratos.
- download_zaragoza_wrapper: Actúa como una función wrapper para hacer la descarga de zaragoza en 2 pasos.
- download_contracts_madrid: Descarga archivos directamente desde la página de transparencia de Madrid basados en el año de publicación.
- download_all_contracts: Coordina la descarga de todos los datos mencionados utilizando las funciones correspondientes.
75 changes: 58 additions & 17 deletions descarga_minors/descarga_contratos_mad_zgz_gencat.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,39 +49,66 @@ def download_contracts_gencat(domain, dataset_identifier, destination_directory,
file_path = os.path.join(destination_directory, file_name)
full_df.to_csv(file_path, index=False)
print(f"Datos descargados y guardados en {file_path}")

def download_contracts_zaragoza(base_url, params, file_path):

# Auxiliary function to get contract IDs from Zaragoza's API
def get_contract_ids(base_url, params):
# Initialize a list to store contract details and a counter for downloaded contracts.
contracts = []
contract_ids = []
total_downloaded = 0

# Continuously request data until all pages are processed.
while True:
response = requests.get(base_url, params=params)
# Check if the HTTP request was successful.
if response.status_code != 200:
print(f"Request error: {response.status_code}")
print(f"Error de solicitud: {response.status_code}")
break

# Parse JSON response and extend the contract list with new data.
data = response.json()
contracts.extend(data['result'])
contract_ids.extend([item['id'] for item in data['result']])
total_downloaded += len(data['result'])

# Print the progress of downloaded contracts.
print(f"Descargados {total_downloaded} de {data['totalCount']} contracts.")

# Check if there are more pages of data to request.
if params['start'] + params['rows'] < data['totalCount']:
params['start'] += params['rows']
else:
break

return contract_ids

def download_contracts_zaragoza(contract_ids, detail_url_template, file_path):
"""Descarga los detalles de cada contrato y los guarda en un archivo JSON."""
contracts = []
total_contracts = len(contract_ids)
processed_contracts = 0

for contract_id in contract_ids:
detail_url = f"{detail_url_template}/{contract_id}.json"
response = requests.get(detail_url)
if response.status_code == 200:
contracts.append(response.json())
else:
print(f"Error al obtener detalles del contrato {contract_id}: {response.status_code}")

processed_contracts += 1
print(f"Procesado {processed_contracts}/{total_contracts} contratos.")

# Guardar los resultados en un archivo JSON
with open(file_path, 'w', encoding='utf-8') as file:
json.dump(contracts, file, ensure_ascii=False, indent=4)
print(f"Datos descargados y guardados en {file_path}")

print(f"Detalles de los contratos descargados y guardados en {file_path}")

def download_zaragoza_wrapper(base_url, params, detail_base_url, file_path):
# Obtener los IDs de los contratos primero
contract_ids = get_contract_ids(base_url, params)
# Luego descargar los detalles de los contratos
download_contracts_zaragoza(contract_ids, detail_base_url, file_path)

def download_contracts_madrid(url, destination_directory, start_year,file_path):
# Ensure the destination directory exists, create if necessary.
if not os.path.exists(destination_directory):
Expand Down Expand Up @@ -126,11 +153,17 @@ def download_all_contracts(destination_directory):
}
},
{
"func": download_contracts_zaragoza,
"func": download_zaragoza_wrapper,
"params": {
"base_url": 'https://www.zaragoza.es/sede/servicio/contratacion-publica/contrato.json',
"params": {'contratoMenor': 'true', 'start': 0, 'rows': 50},
"file_path": os.path.join(destination_directory, "contratos_menores_zaragoza.json")
"params": {
'procedimiento.id': '10',
'fl': 'id',
'start': 0,
'rows': 50
},
"detail_base_url": "https://www.zaragoza.es/sede/servicio/contratacion-publica",
"file_path": os.path.join(destination_directory, "contratos_zaragoza_detalles.json")
}
},
{
Expand All @@ -142,8 +175,7 @@ def download_all_contracts(destination_directory):
"file_path": "DESCARGAS/"
}
}
]

]
# Descargar cada dataset
for dataset in datasets:
func = dataset["func"]
Expand All @@ -159,9 +191,18 @@ def main():
args = parser.parse_args()

if args.city == 'zaragoza':
# Configuraciones específicas para Zaragoza
base_url = 'https://www.zaragoza.es/sede/servicio/contratacion-publica/contrato.json'
if args.file_path:
download_contracts_zaragoza(base_url, 0, 50, os.path.join(args.file_path, "contratos_menores_zaragoza.json"))
params = {
'procedimiento.id': '10',
'fl': 'id',
'start': 0,
'rows': 50
}
detail_base_url = 'https://www.zaragoza.es/sede/servicio/contratacion-publica'
file_path = os.path.join(args.file_path, "contratos_menores_zaragoza.json")
download_zaragoza_wrapper(base_url, params, detail_base_url, file_path)

elif args.city == 'madrid':
start_url = 'https://transparencia.madrid.es/portales/transparencia/es/Economia-y-presupuestos/Contratacion/Contratacion-administrativa/Contratos-menores'
if args.file_path:
Expand Down
Loading

0 comments on commit fbea958

Please sign in to comment.