Ejemplo n.º 1
0
def descargaPlantillasCabecera(browser=None, config=Namespace()):
    """
    Descarga los contenidos de las plantillas y los procesa. Servirá para alimentar las plantillas de TemporadaACB
    :param browser:
    :param config:
    :param jugId2nombre:
    :return:
    """
    result = dict()
    if browser is None:
        browser = creaBrowser(config)

    paginaRaiz = DescargaPagina(dest=URL_BASE, browser=browser, config=config)

    if paginaRaiz is None:
        raise Exception("Incapaz de descargar %s" % URL_BASE)

    raizData = paginaRaiz['data']
    divLogos = raizData.find('div', {'class': 'contenedor_logos_equipos'})

    for eqLink in divLogos.find_all('a', {'class': 'equipo_logo'}):
        urlLink = eqLink['href']
        urlFull = MergeURL(browser.get_url(), urlLink)

        idEq = getObjID(objURL=urlFull, clave='id')

        result[idEq] = descargaURLplantilla(urlFull)

    return result
Ejemplo n.º 2
0
def descargaURLficha(urlFicha, home=None, browser=None, config=Namespace()):
    if browser is None:
        browser = creaBrowser(config)
    try:
        result = dict()
        fichaJug = DescargaPagina(urlFicha, home=home, browser=browser, config=config)
        result['URL'] = browser.get_url()
        result['timestamp'] = gmtime()

        result['id'] = getObjID(urlFicha, 'ver')

        fichaData = fichaJug['data']

        cosasUtiles = fichaData.find(name='div', attrs={'class': 'datos'})

        result['urlFoto'] = cosasUtiles.find('div', attrs={'class': 'foto'}).find('img')['src']
        result['alias'] = cosasUtiles.find('h1').get_text().strip()

        for row in cosasUtiles.findAll('div', {'class': ['datos_basicos', 'datos_secundarios']}):

            valor = row.find("span", {'class': 'roboto_condensed_bold'}).get_text().strip()
            classDiv = row.attrs['class']

            if 'equipo' in classDiv:
                continue
            elif 'dorsal' in classDiv:
                continue
            elif 'posicion' in classDiv:
                result['posicion'] = valor
            elif 'altura' in classDiv:
                REaltura = r'^(\d)[,.](\d{2})\s*m$'
                reProc = re.match(REaltura, valor)
                if reProc:
                    result['altura'] = 100 * int(reProc.group(1)) + int(reProc.group(2))
                else:
                    print("ALTURA no casa RE", valor, REaltura)

            elif 'lugar_nacimiento' in classDiv:
                result['lugarNac'] = valor
            elif 'fecha_nacimiento' in classDiv:
                REfechaNac = r'^(?P<fechanac>\d{2}/\d{2}/\d{4})\s*.*'
                reProc = re.match(REfechaNac, valor)
                if reProc:
                    result['fechaNac'] = pd.to_datetime(reProc['fechanac'], format=PATRONFECHA)
                else:
                    print("FECHANAC no casa RE", valor, REfechaNac)
            elif 'nacionalidad' in classDiv:
                result['nacionalidad'] = valor
            elif 'licencia' in classDiv:
                result['licencia'] = valor
            else:
                if 'Nombre completo:' in row.get_text():
                    result['nombre'] = valor
                else:
                    print("Fila no casa categorías conocidas", row)
    except Exception as exc:
        print("descargaURLficha: problemas descargando '%s': %s" % (urlFicha, exc))
        raise exc

    return result
Ejemplo n.º 3
0
def procesaTablaBajas(tablaBajas: bs4.element,
                      traduccionesConocidas: dict) -> dict:
    auxTraducciones = traduccionesConocidas or dict()
    result = defaultdict(dict)

    for row in tablaBajas.find("tbody").find_all("tr"):
        tds = list(row.find_all("td"))

        data = dict()

        link = tds[1].find("a").attrs['href']
        data['URL'] = MergeURL(URL_BASE, link)
        data['id'] = getObjID(link, 'ver')
        data['activo'] = False

        data['nombre'] = set().union(auxTraducciones.get(data['id'], set()))
        data['dorsal'] = row.find("td", {"class": "dorsal"}).get_text().strip()
        nuevosNombres = {
            sp.get_text().strip()
            for sp in row.find("td", {
                "class": "jugador"
            }).find_all("span")
        }
        data['nombre'].update(nuevosNombres)

        posics = {tds[2].find("span").get_text().strip()}

        destClass = 'tecnicos' if "ENT" in posics else 'jugadores'
        result[destClass][data['id']] = data

    return result
Ejemplo n.º 4
0
    def procesaDivCabecera(self, divATratar):
        equipos = [(x.find("a")['href'], x.find("img")['title'].strip()) for x in
                   divATratar.find_all("div", {"class": "logo_equipo"})]
        puntos = [int(x.get_text()) for x in divATratar.find_all("div", {"class": "resultado"})]

        divParciales = divATratar.find("tbody")
        auxParciales = [[int(p.get_text()) for p in r.find_all("td", {"class": "parcial"})] for r in
                        divParciales.find_all("tr")]
        parciales = list(zip(*auxParciales))
        abrevs = [p.get_text() for p in divParciales.find_all("td", {"class": "equipo"})]

        for l, p in zip(LocalVisitante, puntos):
            self.Equipos[l]['Puntos'] = p
        self.ResultadosParciales = parciales
        self.VictoriaLocal = self.Equipos['Local']['Puntos'] > self.Equipos['Visitante']['Puntos']

        for l, e in zip(LocalVisitante, equipos):
            self.Equipos[l]['id'] = getObjID(e[0])
            self.Equipos[l]['Nombre'] = e[1]

        for l, a in zip(LocalVisitante, abrevs):
            self.Equipos[l]['abrev'] = a
Ejemplo n.º 5
0
    def procesaBloquePartido(self, datosJornada, divPartido):
        # TODO: incluir datos de competicion
        resultado = dict()
        resultado['pendiente'] = True
        resultado['fechaPartido'] = NEVER
        resultado['jornada'] = datosJornada['jornada']

        resultado['cod_competicion'] = self.competicion
        resultado['cod_edicion'] = self.edicion

        datosPartEqs = dict()

        for eqUbic, div in zip(
                ETIQubiq, divPartido.find_all("div",
                                              {"class": "logo_equipo"})):
            auxDatos = datosPartEqs.get(eqUbic.capitalize(), {})
            image = div.find("img")
            imageURL = MergeURL(self.urlbase, image['src'])
            imageALT = image['alt']
            auxDatos.update({'icono': imageURL, 'imageTit': imageALT})
            datosPartEqs[eqUbic.capitalize()] = auxDatos

        for eqUbic in ETIQubiq:
            auxDatos = datosPartEqs.get(eqUbic.capitalize(), {})
            divsEq = divPartido.find_all("div", {"class": eqUbic})
            infoEq = procesaDivsEquipo(divsEq)
            auxDatos.update(infoEq)
            self.nuevaTraduccionEquipo2Codigo(
                nombres=[infoEq['nomblargo'], infoEq['nombcorto']],
                abrev=infoEq['abrev'],
                id=None)
            datosPartEqs[eqUbic.capitalize()] = auxDatos

        resultado['equipos'] = datosPartEqs
        resultado['loc2abrev'] = {
            x: datosPartEqs[x]['abrev']
            for x in datosPartEqs
        }
        resultado['abrev2loc'] = {
            datosPartEqs[x]['abrev']: x
            for x in datosPartEqs
        }

        resultado['participantes'] = {
            datosPartEqs[x]['abrev']
            for x in datosPartEqs
        }

        if 'enlace' in datosPartEqs['Local']:
            resultado['pendiente'] = False
            linkGame = datosPartEqs['Local']['enlace']
            resultado['url'] = MergeURL(self.url, linkGame)
            resultado['resultado'] = {
                x: datosPartEqs[x]['puntos']
                for x in datosPartEqs
            }
            resultado['partido'] = getObjID(linkGame)

        else:
            divTiempo = divPartido.find('div', {"class": "info"})

            if divTiempo:
                auxFecha = divTiempo.find('span', {"class": "fecha"}).next
                auxHora = divTiempo.find('span', {"class": "hora"}).get_text()
                if isinstance(auxFecha, str) and auxFecha != '':
                    cadFecha = auxFecha.lower()
                    cadHora = auxHora.strip() if auxHora else None

                    resultado['fechaPartido'] = procesaFechaHoraPartido(
                        cadFecha.strip(), cadHora, datosJornada)

        return resultado
Ejemplo n.º 6
0
def procesaPlantillaDescargada(plantDesc, otrosNombres: dict = None):
    """
    Procesa el contenido de una página de plantilla

    :param plantDesc: bs4 contenido de la página de la plantilla
    :param otrosNombres: diccionario ID->set de nombres
    :return:
    """
    auxTraducciones = otrosNombres or dict()

    result = {'jugadores': dict(), 'tecnicos': dict()}

    result['club'] = extraeDatosClub(plantDesc)
    fichaData = plantDesc['data']

    cosasUtiles = fichaData.find(name='section',
                                 attrs={'class': 'contenido_central_equipo'})

    for bloqueDiv in cosasUtiles.find_all('div', {"class": "grid_plantilla"}):
        for jugArt in bloqueDiv.find_all("article"):
            data = dict()

            link = jugArt.find("a").attrs['href']
            data['id'] = getObjID(link, 'ver')

            # Carga con los nombres de una potencial traducción existente
            data['nombre'] = set().union(auxTraducciones.get(
                data['id'], set()))
            data['activo'] = True
            if {'caja_jugador_medio_cuerpo',
                    'caja_jugador_cara'}.intersection(jugArt.attrs['class']):
                destClass = 'jugadores'
                data['pos'] = jugArt.find("div", {
                    "class": "posicion"
                }).get_text().strip()
                data['nombre'].add(
                    jugArt.find("div", {
                        "class": "nombre"
                    }).get_text().strip())
            elif {'caja_entrenador_principal', 'caja_entrenador_asistente'
                  }.intersection(jugArt.attrs['class']):
                destClass = 'tecnicos'
                nuevosNombres = set()
                if 'caja_entrenador_principal' in jugArt.attrs['class']:
                    nuevosNombres.add(
                        jugArt.find("div", {
                            "class": "nombre"
                        }).get_text().strip())
                    nuevosNombres.add(jugArt.find("img").attrs['alt'].strip())
                else:
                    nuevosNombres = {
                        sp.get_text().strip()
                        for sp in jugArt.find("div", {
                            "class": "nombre"
                        }).find_all("span")
                    }
                data['nombre'].update(nuevosNombres)
            else:
                raise ValueError(
                    "procesaPlantillaDescargada: no sé cómo tratar entrada: %s"
                    % jugArt)

            data['dorsal'] = jugArt.find("div", {
                "class": "dorsal"
            }).get_text().strip()

            data['URL'] = MergeURL(URL_BASE, link)
            data['URLimg'] = jugArt.find("img").attrs['src']

            result[destClass][data['id']] = data

    tablaBajas = cosasUtiles.find("table", {"class": "plantilla_bajas"})

    if tablaBajas:
        datosBajas = procesaTablaBajas(tablaBajas, auxTraducciones)
        result = actualizaConBajas(result, datosBajas)

    return result
Ejemplo n.º 7
0
    def procesaLineaTablaEstadistica(self, fila, headers, estado):
        result = dict()
        result['competicion'] = self.competicion
        result['temporada'] = self.temporada
        result['jornada'] = self.jornada
        result['equipo'] = self.Equipos[estado]['Nombre']
        result['CODequipo'] = self.Equipos[estado]['abrev']
        result['IDequipo'] = self.Equipos[estado]['id']
        result['rival'] = self.Equipos[OtherLoc(estado)]['Nombre']
        result['CODrival'] = self.Equipos[OtherLoc(estado)]['abrev']
        result['IDrival'] = self.Equipos[OtherLoc(estado)]['id']
        result['url'] = self.url
        result['estado'] = estado
        result['esLocal'] = (estado == "Local")
        result['haGanado'] = self.ResultadoCalendario[estado] > self.ResultadoCalendario[OtherLoc(estado)]

        filaClass = fila.attrs.get('class', '')

        celdas = list(fila.find_all("td"))
        textos = [x.get_text().strip() for x in celdas]

        if (len(textos) == len(headers)):
            mergedTextos = dict(zip(headers[2:], textos[2:]))
            estads = self.procesaEstadisticas(mergedTextos)
            result['estads'] = estads

            if 'equipo' in filaClass or 'totales' in filaClass:
                result['esJugador'] = False
                result['entrenador'] = False
                result['noAsignado'] = 'equipo' in filaClass
                result['totalEquipo'] = 'totales' in filaClass

                if result['totalEquipo']:
                    result['prorrogas'] = int(((estads['Segs'] / (5 * 60)) - 40) // 5)

                    if estads['P'] != self.Equipos[estado]['Puntos']:
                        print(estads, self.Equipos[estado])
                        raise BaseException("ProcesaLineaTablaEstadistica: TOTAL '%s' puntos '%i' "
                                            "no casan con encabezado '%i' " % (estado, estads['P'],
                                                                               self.Equipos[estado]['Puntos']))
            else:  # Jugadores
                result['esJugador'] = True
                result['entrenador'] = False
                result['haJugado'] = mergedTextos['Min'] != ""

                mergedCells = dict(zip(headers, celdas))

                textoDorsal = mergedCells['D'].get_text()
                PATdorsal = r'(?P<titular>\*)?(?P<dorsal>\d+)'
                REdorsal = re.match(PATdorsal, textoDorsal)

                if REdorsal:
                    result['dorsal'] = REdorsal['dorsal']
                    result['esTitular'] = REdorsal['titular'] == '*'
                else:
                    raise ValueError("Texto dorsal '%s' no casa RE '%s'" % (textoDorsal, PATdorsal))

                celNombre = mergedCells['Nombre']
                result['nombre'] = celNombre.get_text()
                linkdata = (celdas[1].find("a"))['href']
                result['linkPersona'] = linkdata
                result['codigo'] = getObjID(linkdata, 'ver', None)
        else:
            textoC0 = celdas[0].get_text()
            if textoC0 == 'E':
                result['esJugador'] = False
                result['entrenador'] = True
                result['dorsal'] = textoC0

                celNombre = celdas[1]
                result['nombre'] = celNombre.get_text()
                linkdata = (celdas[1].find("a"))['href']
                result['linkPersona'] = linkdata
                result['codigo'] = getObjID(linkdata, 'ver', None)
            else:  # 5f lista de 5 faltas
                return None

        return result