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ú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úmero_de_RUC"].split("-")
obj={}
obj["nombre"]=acampos[1].strip()
obj["estadoContribuyente"]=dtRuc["Estado_del_Contribuyente"].replace(" ","").strip()
obj["condicionContribuyente"]=dtRuc["Condición_del_Contribuyente"].replace(" ","").strip()
obj["direccion"]=dtRuc["Domicilio_Fiscal"].replace(" ","").strip()
obj["actividadEconomica"]=dtRuc["Actividad(es)_Econó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
Publicar un comentario