Scraping consulta ruc python


import json

import requests

def llamarServicioRuc(ruc):

    dtRuc={}

    try:

        payload={

        "accion":"consPorRuc",

        "razSoc":"",

        "nroRuc": ruc,

        "nrodoc": "",

        "token": "123",

        "contexto": "ti-it",

        "modo": "1",

        "rbtnTipo": "1",

        "search1": ruc,

        "tipdoc":"1",

        "search2": "",

        "search3": "",

        "codigo": ""

        }


        url = "https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias"

        header={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36"}

   

        sesion=requests.Session()

        _req=sesion.post(url, data=payload, headers=header)

        data=""

        if _req.status_code==200:

            data=_req.text

       

        filas=data.split("<div class=\"list-group-item")


        n = len(filas)

        posClave = -1

        posValor = -1

        posMayor = -1

        posMenor = -1

        fila=None

        clave=None

        valor=None

        

        for i in range(n):

            fila = filas[i]

            posClave = fila.find("list-group-item-heading")

            if posClave > -1:

                posMayor = fila.find(">", posClave)

                if posMayor > -1:

                    posMenor = fila.find("<", posMayor)


                    clave = fila[posMayor + 1: posMenor ]

                    if i <= 1:

                        posClave = fila.find("list-group-item-heading", posMenor)

                    else:

                        posClave = fila.find("list-group-item-text", posMenor)

                    if posClave > -1:

                        posMayor = fila.find(">", posClave)

                        posMenor = fila.find("<", posMayor)

                        valor = fila[posMayor + 1: posMenor ]

                        clave = clave.replace(":", "").replace(" ", "_").replace("í", "i").replace("ó", "o").replace("ú", "u")

                        dtRuc[clave]= valor

                        posClave = fila.find("list-group-item-heading", posMenor)

                        if posClave > -1:

                            posMayor = fila.find(">", posClave)

                            if posMayor > -1:

                                posMenor = fila.find("<", posMayor)

                                clave = fila[posMayor + 1: posMenor]

                                posClave = fila.find("list-group-item-text", posMenor)

                                posMayor = fila.find(">", posClave)

                                posMenor = fila.find("<", posMayor)

                                valor = fila[posMayor + 1: posMenor ]

                                clave = clave.replace(":", "").replace(" ", "_").replace("í", "i").replace("ó", "o").replace("ú", "u")

                                dtRuc[clave]= valor.replace("    ","").strip()

                    else:

                        posClave = fila.find("tblResultado", posMenor)

                        if posClave > -1:

                            htmlTabla = fila[posClave: len(fila) ]

                            detalle=[]

                            trs = htmlTabla.split("<tr>")

                            ntr=len(trs)

                            postd = -1

                            postdd = -1

                            for j in range(ntr):

                                postd = trs[j].find("<td>")

                                if postd > -1:

                                    postdd = trs[j].find("<", postd + 1)

                                    detalle.append(trs[j][postd + 4: postdd ])

                            valor = ",".join(detalle)

                            clave = clave.replace(":", "").replace(" ", "_").replace("í", "i").replace("ó", "o").replace("ú", "u")

                            dtRuc[clave]= valor.replace("    ","").strip()

        

        if dtRuc["N&uacute;mero_de_RUC"] is not None:

            dtRuc["representante"]=consultarRepresentante(ruc,sesion)

            dtRuc["anexos"]=consultarAnexos(ruc,sesion)


                            


    except Exception as e:

        print("Error en el servicio "+str(e))

    

    return dtRuc


def consultarRepresentante(ruc,sesion):

    lstAnexos=[]

    try:

        payload="accion=getRepLeg&contexto=ti-it&modo=1&nroRuc="+ruc+"&desRuc="

        url = "https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias"

        header={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",

                "Referer":"https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias",

                "Host":"e-consultaruc.sunat.gob.pe",

                "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36"}

        ''' 

        objRequest=req.Request(url,data=payload.encode(),headers=header,method="POST")

        _req=req.urlopen(objRequest)

        data=_req.read()

 

        print(type(data))

        html=data.decode("utf-8",errors='ignore').replace("\t","").replace("\r\n","")

        '''

        payload={"accion":"getRepLeg","contexto":"ti-it","modo":"1","nroRuc":ruc,"desRuc":""}

        html=""

        _req=sesion.post(url, data=payload, headers=header)

        if _req.status_code==200:

            html=_req.text


        posTbody = html.find("<tbody>")

        posTbodyFin = html.find("</tbody>")


        if posTbody > -1 and posTbodyFin > -1:

            tabla = html[posTbody + 7:posTbodyFin]

            filas = tabla.split("<tr>")

            n=len(filas)

            postd = -1

            postdd = -1

            

            lstFila=[]

            for k in range(n):

                lstFila=[]

                postd = 0

                postdd = 0

                while True:

                    postd = filas[k].find(">", postdd)

                    if postd > -1:

                        postdd = filas[k].find("<", postd + 1)

                        if postdd > -1:

                            lstFila.append(filas[k][postd + 1:postdd].replace("  ", "").strip())

                            postdd = postdd + 5

                        else:

                            break

                    else:

                        break

                if len(lstFila)>0:

                    lstAnexos.append("|".join(lstFila))

    except Exception as e:

        print("No se encontro anexo" +str(e))

    return lstAnexos 


def consultarAnexos(ruc,sesion):

    lstAnexos=[]

    try:

        payload="accion=getLocAnex&contexto=ti-it&modo=1&nroRuc="+ruc+"&desRuc="

        url = "https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias"

        header={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",

                "Referer":"https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias",

                "Host":"e-consultaruc.sunat.gob.pe",

                "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36"}

        '''

        objRequest=req.Request(url,data=payload.encode(),headers=header,method="POST")

        _req=req.urlopen(objRequest)

        data=_req.read()

 

        print(type(data))

        html=data.decode("utf-8",errors='ignore').replace("\t","").replace("\r\n","")

        ''' 

        payload={"accion":"getLocAnex","contexto":"ti-it","modo":"1","nroRuc":ruc,"desRuc":""}

        html=""

        _req=sesion.post(url, data=payload, headers=header)

        if _req.status_code==200:

            html=_req.text


        posTbody = html.find("<tbody>")

        posTbodyFin = html.find("</tbody>")


        if posTbody > -1 and posTbodyFin > -1:

            tabla = html[posTbody + 7:posTbodyFin]

            filas = tabla.split("<tr>")

            n=len(filas)

            postd = -1

            postdd = -1

            

            lstFila=[]

            for k in range(n):

                lstFila=[]

                postd = 0

                postdd = 0

                while True:

                    postd = filas[k].find(">", postdd)

                    if postd > -1:

                        postdd = filas[k].find("<", postd + 1)

                        if postdd > -1:

                            lstFila.append(filas[k][postd + 1:postdd].replace("  ", "").strip())

                            postdd = postdd + 5

                        else:

                            break


                    else:

                        break

                if len(lstFila)>0:

                    lstAnexos.append("|".join(lstFila))


    

    except Exception as e:

        print("No se encontro anexo" +str(e))

    return lstAnexos   

def ConsultaRuc(ruc):


    objResponse={"Exito":False,"Mensaje":"","Data":None}


    if len(ruc)==11:

        dtRuc=llamarServicioRuc(ruc)

        if len(dtRuc)>0:

            acampos=dtRuc["N&uacute;mero_de_RUC"].split("-")

            obj={}

            obj["nombre"]=acampos[1].strip()

            obj["estadoContribuyente"]=dtRuc["Estado_del_Contribuyente"].replace(" ","").strip()

            obj["condicionContribuyente"]=dtRuc["Condici&oacute;n_del_Contribuyente"].replace(" ","").strip()

            obj["direccion"]=dtRuc["Domicilio_Fiscal"].replace("  ","").strip()

            obj["actividadEconomica"]=dtRuc["Actividad(es)_Econ&oacute;mica(s)"].split(",")

            obj["padrones"]=dtRuc["Padrones"]



            obj["representantes"]=[]

            obj["anexos"]=[]


            if len(dtRuc["representante"])>0:

                lstTemp=[]

                for campos in dtRuc["representante"]:

                    cmp=campos.split("|")

                    lstTemp.append({"tipoDocumento":cmp[0],

                                    "documento":cmp[1],

                                    "nombre":cmp[2],

                                    "cargo":cmp[3],

                                    "fecha":cmp[4]})

                obj["representantes"]=lstTemp


            if len(dtRuc["anexos"])>0:

                lstTemp=[]

                for campos in dtRuc["anexos"]:

                    cmp=campos.split("|")

                    lstTemp.append({"codigo":cmp[0],

                                    "tipoEstablecimiento":cmp[1],

                                    "direccion":cmp[2],

                                    "actividad":cmp[3]})

                obj["anexos"]=lstTemp


            objResponse["Exito"]=True

            objResponse["Data"]=obj

        else:

            objResponse["Mensaje"]="No se encontro información"


    else:

        objResponse["Mensaje"]="ruc inválido"


    

    return objResponse


if __name__ == "__main__":

    ConsultaRuc(xxxxxx)

Comentarios

Entradas populares de este blog

Web Scraping en Argentina: búsqueda de personas por DNI paso a paso

¡Mira Cómo Obtengo Datos de un Vehículo Solo con la Placa! (Web Scraping)

Bot whatsapp con whatsapp-web.js y nodejs