Automatiza Certificados de Inspecci贸n Vehicular con Python 馃 (Scraping + EasyOCR)
En este ejemplo hacemos scraping para consultar certificados de inspecci贸n vehicular en per煤
Las librerias utilizadas son:
Las librerias utilizadas son:
- Requests
-OpenCV
-EasyOCR
1. HTML
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'styles/general.css' %}" />
<style>
.cntpreview{
background: #000;
padding: 10px;
width: 50%;
min-height: 300px;
color: #fff
}
</style>
</head>
<body>
<div id="divLoading" class="wrap_loading hide">
<div class="lds-ring">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<div class="loading_text">Procesando ...</div>
</div>
<div class="titulo">Consulta Certificados de Inspecci贸n T茅cnica Vehicular</div>
<div class="fila">
<textarea style="width: 186px;height: 70px;" id="txtIdentificador" value="" ></textarea>
<button id="btnProcesar" class="boton">Procesar</button>
</div>
<div style="display: flex;justify-content: center;">
<pre id="txtPre" class="cntpreview"></pre>
</div>
<div>
{% csrf_token %}
</div>
<script src="{% static 'scripts/Demo70.js' %}" ></script>
</body>
</html>
2. JAVASCRIPT
window.onload=function(){
let btnProcesar=document.getElementById("btnProcesar");
btnProcesar.onclick=function(){
let txtIdentificador=document.getElementById("txtIdentificador").value;
let fd=new FormData();
fd.append("data",txtIdentificador);
servidor({url:"procesar",data:fd,responsetype:"json"}).then((data)=>{
document.getElementById("txtPre").innerHTML=JSON.stringify(data,null,2);
});
}
}
function servidor({ metodo = "post", url = null, data = null, responsetype = "text" } = {}) {
return new Promise((resolve, reject) => {
let divLoading=document.getElementById("divLoading");
if(divLoading){
divLoading.classList.remove("hide");
}
let xhr = new XMLHttpRequest();
xhr.open(metodo, url);
var csrftoken=document.getElementsByName("csrfmiddlewaretoken")[0].value;
xhr.setRequestHeader("X-CSRFToken", csrftoken);
xhr.responseType = responsetype;
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
divLoading.classList.add("hide");
resolve(xhr.response);
}
}
xhr.onerror = function (e) {
reject(e)
}
xhr.send(data);
});
}
3. PYTHON
from django.shortcuts import render
from django.http.response import HttpResponse,JsonResponse
from django.conf import settings
import requests
import io
from PIL import Image
import numpy as np
import easyocr
import cv2
import time
import json
import os
import base64
requests.packages.urllib3.disable_warnings()
reader = easyocr.Reader(['en'])
def index(request):
return render(request,"Demo70.html")
def procesar(request):
placas=request.POST.get("data")
rptaJson=[]
try:
aplacas=placas.split(",")
for placa in aplacas:
rpta=buscarVehiculo(placa)
rptaJson.append({placa: rpta if len(rpta)>0 else "no se encontro informaci贸n"})
except Exception as e:
print("Error "+ str(e))
return JsonResponse(rptaJson,safe=False)
def buscarVehiculo(placa):
rptaJson=[]
print("buscar placa "+placa)
try:
header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
}
sesion=requests.session()
req=sesion.get("https://rec.mtc.gob.pe/Citv/ArConsultaCitv",headers=header,verify=False)#
if req.status_code==200:
captcha=obtenerCaptcha(sesion)
if len(captcha)==6:
header["referer"]="https://rec.mtc.gob.pe/Citv/ArConsultaCitv"
header["content-type"]="application/json"
payload ="1|"+placa+"||"+captcha
req=sesion.get("https://rec.mtc.gob.pe/CITV/JrCITVConsultarFiltro?pArrParametros="+payload ,headers=header,verify=False)
if req.status_code==200:
rpta=req.json()
if "orStatus" in rpta and rpta["orStatus"] and len(rpta["orResult"])>1:
rptaJson=json.loads( rpta["orResult"][0])
if "orStatus" in rpta and not rpta["orStatus"] and rpta["orCodigo"]=="1":
rptaJson=buscarVehiculo(placa)
else:
rptaJson=buscarVehiculo(placa)
except Exception as e:
print("Error "+ str(e))
return rptaJson
def obtenerCaptcha(sesion):
global reader
headers2={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
"referer":"https://rec.mtc.gob.pe/Citv/ArConsultaCitv",
}
req=sesion.get("https://rec.mtc.gob.pe/CITV/refrescarCaptcha",headers=headers2,verify=False)
captcha=""
if req.status_code==200:
r=req.json()
if "orStatus" in r and r["orStatus"]:
imgbase64=r["orResult"]
captcha=""
imgByte=io.BytesIO( base64.b64decode(imgbase64))
img=Image.open(imgByte)
numpy_image = np.array(img)
gray=cv2.cvtColor(numpy_image,cv2.COLOR_RGB2GRAY)
thresholded = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv2.imwrite("captcha2.png",thresholded)
caracteres_permitidos = '0123456789'
result=reader.readtext(thresholded, detail = 0, paragraph=True,allowlist=caracteres_permitidos)#
print("capcha:",result)
if result is not None and len(result)>0:
captcha=result[0]
print(captcha)
if len(captcha)!=6:
captcha=obtenerCaptcha(sesion)
return captcha
Comentarios
Publicar un comentario