Documentación - Chavic12/ProyectoData GitHub Wiki
# Importa las bibliotecas necesarias
En esta sección, se importan las bibliotecas necesarias para el proceso de extracción de datos y manipulación de archivos CSV.
from bs4 import BeautifulSoup
import requests
import os
import csv
Esta función parse_carrera_links toma una URL como entrada y utiliza BeautifulSoup para analizar el contenido HTML de la página. Luego, encuentra los elementos
def parse_carrera_links(url):
# Realiza una solicitud HTTP para obtener la página
response = requests.get(url)
if response.status_code == 200:
# Analiza el contenido HTML usando BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')
# Encuentra los elementos div con la clase 'grado' para los enlaces de las carreras
div_grado_elements = soup.find_all('div', class_='grado')
carrera_links = [a['href'] for div in div_grado_elements for a in div.find_all('a')]
return carrera_links
else:
print("No se pudo acceder a la página web.")
return []
La función scrape_and_save_data recibe una URL y un objeto de escritura CSV. Realiza una solicitud HTTP para obtener el contenido de la página y luego utiliza BeautifulSoup para analizarlo. Luego, encuentra las secciones que contienen información sobre la universidad y extrae los datos relevantes, como el ciclo, el título, la duración, etc. Luego, crea una fila por cada materia y ciclo para cada modalidad y escribe los datos en el archivo CSV.
def scrape_and_save_data(url, writer):
# Realiza una solicitud HTTP para obtener el contenido HTML
response = requests.get(url)
if response.status_code == 200:
# Analiza el contenido HTML usando BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')
# Encuentra las secciones con la clase 'wrapper-semestre' que contienen información de la universidad
university_sections = soup.find_all('section', class_='wrapper-semestre')
for section in university_sections:
# Extrae el ciclo desde el div con la clase 'btn-semestre'
ciclo = section.find('div', class_='btn-semestre').text.strip()
# ... Resto de la extracción de datos ...
# Crea una fila por cada materia y ciclo para cada modalidad
for materia in materias:
for modalidad in modalidades:
extracted_data = {
'carrera': carrera,
'ciclo': ciclo,
'materia': materia,
# ... Resto de los campos de datos ...
}
writer.writerow(extracted_data)
else:
print("No se pudo acceder a la página web:", url)
La función main es donde se inicia el proceso. Define la URL de inicio, obtiene los enlaces de carreras, establece el nombre del archivo CSV y verifica si el archivo ya existe. Luego, abre el archivo CSV y configura el escritor CSV. Llama a la función scrape_and_save_data para obtener datos desde una página de ejemplo y guardarlos en el archivo CSV.
def main():
# URL de inicio
start_url = 'https://www.utpl.edu.ec'
# Obtiene los enlaces de carreras
carrera_links = parse_carrera_links(start_url)
# Nombre del archivo CSV
csv_file = 'datos_universidades.csv'
# Comprueba si el archivo ya existe
file_exists = os.path.exists(csv_file)
# Abre el archivo CSV para escritura
with open(csv_file, 'a', newline='', encoding='utf-8') as file:
# Define los campos para el encabezado
fieldnames = ['carrera', 'ciclo', 'facultad', 'materia', 'universidad', 'modalidad', 'descripcion', 'titulo', 'duracion']
# Crea un escritor CSV
writer = csv.DictWriter(file, fieldnames=fieldnames, delimiter=';')
# Si el archivo no existe, escribe el encabezado
if not file_exists:
writer.writeheader()
# Llama a la función para obtener datos desde una página de ejemplo
scrape_and_save_data('https://www.utpl.edu.ec/carreras/empresas', writer)
Este bloque asegura que la función principal main se ejecute solo si el script se ejecuta directamente (no si se importa como módulo). Es una práctica común en Python para mantener el código modular y reutilizable.
if __name__ == "__main__":
main()