Código fuente para sisedeinversiones.ssi.main_ssi

"""
*Clase ScrapingMainSSI*
=======================

Esta clase se encarga de extraer información de las secciones:

- Datos generales
- Ejecución financiera
- Contrataciones

"""

import time

import pandas as pd
import rpa as r

from ..utils.read_utils import ReadsFiles


[documentos] class ScrapingMainSSI(ReadsFiles): """_summary_ Args: file_read (str): Este atributo indica la dirección del archivo a leer. Para este caso un csv. num_range (str): Indicamos el rango de registros que se trabajara, el formato para indicar dicho rango es [num_inicio]_[num_final], es importante separarlos por un guin bajo. Sino se tendra problemas. path_export (str): Aqui indicamos la dirección de la carpeta donde se quiere exportar el archivo generado. file_type (str): Aqui indicamos el tipo de archivo que se quiere descargar. De momento solo se tiene habilitado el formato .xlsx para exportar la información. year (str): Indicamos el año de los registros que se estan trabajando. """ def __init__(self, file_read, num_range, path_export, file_type, year): ReadsFiles.__init__(self, file_read, num_range) self.path_export = path_export self.file_type = file_type self.year = year
[documentos] def read_file(self): return ReadsFiles(self.file_read, self.num_range).read_file_csv()
[documentos] def scrape_info(self): lista_cui = self.read_file() # ----------------------------------------------------------------------------------------- # ----------------------CREAMOS LAS LISTAS PARA ALMACENAR LA INFORMACIÓN------------------- # ----------------------------------------------------------------------------------------- # --------------------DATOS GENERALES---------------------- # 0.- información general ssi_cui = [] ssi_snip = [] ssi_fecha_registro = [] ssi_nombre_inversion = [] ssi_estado = [] ssi_tipo_inversion = [] ssi_programa_pmi = [] # 1.- institucionalidad ssi_opmi = [] ssi_uf = [] ssi_uei = [] # 2.- datos de la fase ejecucion ssi_situacion = [] ssi_decreto_emergencia = [] ssi_cadena_funcional = [] ssi_viabilidad_aprobacion = [] ssi_costo_aprobado = [] ssi_beneficiarios = [] ssi_inicio_ejecucion = [] ssi_fin_ejecucion = [] # 3.- datos de la fase ejecucion ssi_expediente_tecnico = [] ssi_reg_seguimiento = [] ssi_registro_cierre = [] # ssi_inicio_ejecucion = [] ssi_inversion_actualizado = [] ssi_sol_controversias = [] ssi_carta_fianza = [] ssi_inv_total = [] # --------------------EJECUCION FINANCIERA---------------------- ssi_cost_inversion = [] ssi_devengado_acumulado = [] ssi_avance_financiero_acum = [] ssi_saldo = [] ssi_fecha_primerdevengado = [] ssi_fecha_ultimodevengado = [] # --------------------CONTRATACIONES---------------------- ssi_seaceobra = [] ssi_seaceconsul = [] ssi_seacebien = [] ssi_seaceserv = [] # ssi_contrato = [] # ssi_contratista = [] # ssi_n_contrato = [] # ssi_fechasuscripcion = [] # ssi_monto_contrato = [] # ssi_monto_item = [] r.init() for one_cui in range(len(lista_cui)): r.url("https://ofi5.mef.gob.pe/ssi/ssi/Index") time.sleep(2) r.type('//*[@id="txt_cu"]', lista_cui[one_cui]) r.click( '//*[@id="divContainer"]/div[1]/div[1]/div/table/tbody/tr[3]/td[1]/ul/li[1]/div/span' ) time.sleep(3) if not r.present( '//*[@id="divVistaPreliminar"]/table[1]/tbody/tr[1]/td[1]' ): time.sleep(2) print( f"Se esta trabajando el registro {one_cui} con el CUI {lista_cui[one_cui]}" ) # --------------------DATOS GENERALES---------------------- cui = r.read('//*[@id="td_cu"]') snip = r.read('//*[@id="td_snip"]') fecha_registro = r.read('//*[@id="td_fecreg"]') nombre_inversion = r.read('//*[@id="td_nominv"]') estado = r.read('//*[@id="td_estcu"]') tipo_inversion = r.read('//*[@id="td_tipinv"]') programa_pmi = r.read('//*[@id="td_indpmi"]') # 1.- institucionalidad opmi = r.read('//*[@id="td_opmi"]') uf = r.read('//*[@id="td_uf"]') uei = r.read('//*[@id="td_uei"]') # 2.- datos de la fase ejecucion situacion = r.read('//*[@id="td_situinv"]') decreto_emergencia = r.read('//*[@id="td_emergds"]') cadena_funcional = r.read('//*[@id="td_cadfun"]') viabilidad_aprobacion = r.read('//*[@id="td_fecviab"]') costo_aprobado = r.read('//*[@id="td_mtoviab"]') beneficiarios = r.read('//*[@id="td_benif"]') # 3.- datos de la fase ejecucion expediente_tecnico = r.read('//*[@id="td_indet"]') reg_seguimiento = r.read('//*[@id="td_indseg"]') registro_cierre = r.read('//*[@id="td_f9"]') inicio_ejecucion = r.read('//*[@id="fec_iniejec"]') fin_ejecucion = r.read('//*[@id="fec_finejec"]') inversion_actualizado = r.read('//*[@id="val_cta"]') sol_controversias = r.read('//*[@id="td_laudo"]') carta_fianza = r.read('//*[@id="td_carfza"]') inv_total = r.read('//*[@id="td_mtototal"]') # 1.1.-ALMACENAMOS la información en las listas ssi_cui.append(cui) ssi_snip.append(snip) ssi_fecha_registro.append(fecha_registro) ssi_nombre_inversion.append(nombre_inversion) ssi_estado.append(estado) ssi_tipo_inversion.append(tipo_inversion) ssi_programa_pmi.append(programa_pmi) ssi_opmi.append(opmi) ssi_uf.append(uf) ssi_uei.append(uei) ssi_situacion.append(situacion) ssi_decreto_emergencia.append(decreto_emergencia) ssi_cadena_funcional.append(cadena_funcional) ssi_viabilidad_aprobacion.append(viabilidad_aprobacion) ssi_costo_aprobado.append(costo_aprobado) ssi_beneficiarios.append(beneficiarios) ssi_expediente_tecnico.append(expediente_tecnico) ssi_reg_seguimiento.append(reg_seguimiento) ssi_registro_cierre.append(registro_cierre) ssi_inicio_ejecucion.append(inicio_ejecucion) ssi_fin_ejecucion.append(fin_ejecucion) ssi_inversion_actualizado.append(inversion_actualizado) ssi_sol_controversias.append(sol_controversias) ssi_carta_fianza.append(carta_fianza) ssi_inv_total.append(inv_total) # --------------------EJECUCION FINANCIERA---------------------- # pasamos a la seccion ejecucion financiera r.click('//*[@id="img_financ"]') # scrapeamos la información cost_inversion = r.read('//*[@id="td_mtototal2"]') devengado_acumulado = r.read('//*[@id="val_efin"]') avance_financiero_acum = r.read('//*[@id="por_avanacum"]') saldo = r.read('//*[@id="sdo_ejecacum"]') fecha_primerdevengado = r.read('//*[@id="pridev"]') fecha_ultimodevengado = r.read('//*[@id="ultdev"]') # agregamos a las listas de información ssi_cost_inversion.append(cost_inversion) ssi_devengado_acumulado.append(devengado_acumulado) ssi_avance_financiero_acum.append(avance_financiero_acum) ssi_saldo.append(saldo) ssi_fecha_primerdevengado.append(fecha_primerdevengado) ssi_fecha_ultimodevengado.append(fecha_ultimodevengado) time.sleep(1) # --------------------CONTRATACIONES---------------------- # pasamos a la seccion de contrataciones r.click('//*[@id="btn_seace"]') # scraping de la información seaceobra = r.read('//*[@id="tb_seaceobra"]') seaceconsul = r.read('//*[@id="tb_seaceconsul"]') seacebien = r.read('//*[@id="tb_seacebien"]') seaceserv = r.read('//*[@id="tb_seaceserv"]') # contrato = r.read('//*[@id="tb_seaceserv"]/tr/td[2]') # contratista = r.read('//*[@id="tb_seaceserv"]/tr/td[3]') # n_contrato = r.read('//*[@id="tb_seaceserv"]/tr/td[4]') # fechasuscripcion = r.read('//*[@id="tb_seaceserv"]/tr/td[5]') # monto_contrato = r.read('//*[@id="tb_seaceserv"]/tr/td[6]') # monto_item = r.read('//*[@id="tb_seaceserv"]/tr/td[7]') # agregamos la informacion a las listas ssi_seaceobra.append(seaceobra) ssi_seaceconsul.append(seaceconsul) ssi_seacebien.append(seacebien) ssi_seaceserv.append(seaceserv) # ssi_contrato.append(contrato) # ssi_contratista.append(contratista) # ssi_n_contrato.append(n_contrato) # ssi_fechasuscripcion.append(fechasuscripcion) # ssi_monto_contrato.append(monto_contrato) # ssi_monto_item.append(monto_item) r.close() return ( # Datos generales ssi_cui, ssi_snip, ssi_fecha_registro, ssi_nombre_inversion, ssi_estado, ssi_tipo_inversion, ssi_programa_pmi, ssi_opmi, ssi_uf, ssi_uei, ssi_situacion, ssi_decreto_emergencia, ssi_cadena_funcional, ssi_viabilidad_aprobacion, ssi_costo_aprobado, ssi_beneficiarios, ssi_expediente_tecnico, ssi_reg_seguimiento, ssi_registro_cierre, ssi_inicio_ejecucion, ssi_fin_ejecucion, ssi_inversion_actualizado, ssi_sol_controversias, ssi_carta_fianza, ssi_inv_total, # Ejecución financiera ssi_cost_inversion, ssi_devengado_acumulado, ssi_avance_financiero_acum, ssi_saldo, ssi_fecha_primerdevengado, ssi_fecha_ultimodevengado, # Contrataciones ssi_seaceobra, ssi_seaceconsul, ssi_seacebien, ssi_seaceserv, )
[documentos] def download_data(self): ( # Datos generales ssi_cui, ssi_snip, ssi_fecha_registro, ssi_nombre_inversion, ssi_estado, ssi_tipo_inversion, ssi_programa_pmi, ssi_opmi, ssi_uf, ssi_uei, ssi_situacion, ssi_decreto_emergencia, ssi_cadena_funcional, ssi_viabilidad_aprobacion, ssi_costo_aprobado, ssi_beneficiarios, ssi_expediente_tecnico, ssi_reg_seguimiento, ssi_registro_cierre, ssi_inicio_ejecucion, ssi_fin_ejecucion, ssi_inversion_actualizado, ssi_sol_controversias, ssi_carta_fianza, ssi_inv_total, # Ejecución financiera ssi_cost_inversion, ssi_devengado_acumulado, ssi_avance_financiero_acum, ssi_saldo, ssi_fecha_primerdevengado, ssi_fecha_ultimodevengado, # Contrataciones ssi_seaceobra, ssi_seaceconsul, ssi_seacebien, ssi_seaceserv, ) = self.scrape_info() print( f"El total de CUIs scrapeados es: {len(ssi_cui)} y se esta exportando a Excel" ) ssi_mainssi = pd.DataFrame( { # Datos generales - dg "dg_cui": ssi_cui, "dg_codio_snip": ssi_snip, "dg_fecha_registro": ssi_fecha_registro, "dg_nombre_inversion": ssi_nombre_inversion, "dg_estado_inversion": ssi_estado, "dg_tipo_inversion": ssi_tipo_inversion, "dg_programado_pmi": ssi_programa_pmi, "dg_opmi": ssi_opmi, "dg_uf": ssi_uf, "dg_uei": ssi_uei, "dg_situcion": ssi_situacion, "dg_decreto_emergencia": ssi_decreto_emergencia, "dg_cadena_funcional": ssi_cadena_funcional, "dg_fecha_viabilidad": ssi_viabilidad_aprobacion, "dg_costo_inversion_aprobado": ssi_costo_aprobado, "dg_numero_beneficiarios": ssi_beneficiarios, "dg_expediente_tecnico": ssi_expediente_tecnico, "dg_registro_seguimiento": ssi_reg_seguimiento, "dg_registro_cierre": ssi_registro_cierre, "dg_inicio_ejecucion": ssi_inicio_ejecucion, "dg_fin_ejecucion": ssi_fin_ejecucion, "dg_inversion_actualizada": ssi_inversion_actualizado, "dg_costo_controversias": ssi_sol_controversias, "dg_monto_carta_fianza": ssi_carta_fianza, "dg_costo_total_actualizado": ssi_inv_total, # Ejecución financiera "fin_costo_total_actualizado": ssi_cost_inversion, "fin_devengado_acumulado": ssi_devengado_acumulado, "fin_avance_financiero_acumulado": ssi_avance_financiero_acum, "fin_saldo_por_ejecutar": ssi_saldo, "fin_fecha_primer_devengado": ssi_fecha_primerdevengado, "fin_fecha_ultimo_devengado": ssi_fecha_ultimodevengado, # Contrataciones "seaceobra": ssi_seaceobra, "seaceconsul": ssi_seaceconsul, "seacebien": ssi_seacebien, "seaceserv": ssi_seaceserv, } ) return ssi_mainssi.to_excel( f"{self.path_export}/ssi_SSI_{self.year}_regts_{self.num_range}{self.file_type}", index=False, header=True, )