Cree Cricket Score API usando Web Scraping en Flask

El críquet es uno de los famosos deportes al aire libre que se juega en todo el mundo. Hay muy pocas API que proporcionen marcadores en vivo y ninguna de ellas es de uso gratuito. Usando cualquiera de los marcadores disponibles podemos crear API para nosotros mismos. Este método no solo funciona para Cricket Scoreboard sino también para cualquier información disponible en línea. El siguiente es el flujo en el que este blog guiaría para crear una API e implementarla. 

  • Configuración del directorio de aplicaciones
  • Datos de Web Scrape de NDTV Sports.
    • Se usaría Beautiful Soup en Python.
  • Crear una API.
    • Se utilizaría matraz.
  • Heroku se usaría para el despliegue,

Configuración del directorio de aplicaciones

Paso 1: Cree una carpeta (p. ej., CricGFG).

Paso 2: configurar el entorno virtual. Aquí creamos un entorno .env

python -m venv .env

Paso 3: Activa el entorno.

.env\Scripts\activate

Obtener los datos

Paso 1: en Python, tenemos Beautiful Soup, que es una biblioteca para extraer datos de archivos HTML. Para instalar Beautiful Soup, ejecute un comando simple;

pip install beautifulsoup4

Del mismo modo, instale el módulo de Requests de Python.

pip install requests

Usaríamos el NDTV Sports Cricket Scorecard para obtener los datos. 

Paso 3: Los siguientes son los pasos para extraer datos de la página web. Para obtener el texto HTML de la página web;

html_text = requests.get(‘https://sports.ndtv.com/cricket/live-scores’).texto

Para representar el objeto analizado como un todo, usamos el objeto BeautifulSoup,

soup = BeautifulSoup(html_text, "html.parser")

Nota: Se recomienda ejecutar y verificar el código después de cada paso para conocer la diferencia y comprender a fondo los conceptos.

Ejemplo:

Python

from bs4 import BeautifulSoup
import requests
  
html_text = requests.get('https://sports.ndtv.com/cricket/live-scores').text
soup = BeautifulSoup(html_text, "html.parser")
print(soup)

Encontraremos además todos los divs requeridos y otras etiquetas con sus respectivas clases.

Python

from bs4 import BeautifulSoup
import requests
  
html_text = requests.get('https://sports.ndtv.com/cricket/live-scores').text
soup = BeautifulSoup(html_text, "html.parser")
sect = soup.find_all('div', class_='sp-scr_wrp')
section = sect[0]
description = section.find('span', class_='description').text
location = section.find('span', class_='location').text
current = section.find('div', class_='scr_dt-red').text
link = "https://sports.ndtv.com/" + \
    section.find('a', class_='scr_ful-sbr-txt').get('href')

La siguiente sección del código tiene nuestros datos que son nuestro resultado. Si por alguna de las razones ese código no está presente en el archivo HTML, se produciría un error, por lo que se incluye esa parte en un bloque de prueba y excepción.

Código completo:

Python3

from bs4 import BeautifulSoup
import requests
  
html_text = requests.get('https://sports.ndtv.com/cricket/live-scores').text
soup = BeautifulSoup(html_text, "html.parser")
sect = soup.find_all('div', class_='sp-scr_wrp ind-hig_crd vevent')
  
section = sect[0]
description = section.find('span', class_='description').text
location = section.find('span', class_='location').text
current = section.find('div', class_='scr_dt-red').text
link = "https://sports.ndtv.com/" + section.find(
    'a', class_='scr_ful-sbr-txt').get('href')
  
try:
    status = section.find_all('div', class_="scr_dt-red")[1].text
    block = section.find_all('div', class_='scr_tm-wrp')
    team1_block = block[0]
    team1_name = team1_block.find('div', class_='scr_tm-nm').text
    team1_score = team1_block.find('span', class_='scr_tm-run').text
    team2_block = block[1]
    team2_name = team2_block.find('div', class_='scr_tm-nm').text
    team2_score = team2_block.find('span', class_='scr_tm-run').text
    print(description)
    print(location)
    print(status)
    print(current)
    print(team1_name.strip())
    print(team1_score.strip())
    print(team2_name.strip())
    print(team2_score.strip())
    print(link)
except:
    print("Data not available")

Producción:

Marcador en vivo Inglaterra vs India 3ra Prueba, Trofeo Pataudi, 2021

Headingley, Leeds

Inglaterra lidera por 223 carreras

Día 2 | Sesión posterior al té

Inglaterra

301/3 (96,0)

India

78

https://sports.ndtv.com//cricket/live-scorecard/inglaterra-vs-india-3rd-test-leeds-enin08252021199051

Creando la API

Usaremos Flask  , que es un marco micro web escrito en Python. 

pip install Flask

El siguiente es el código de inicio para nuestra aplicación de matraz.

Python3

# We import the Flask Class, an instance of 
# this class will be our WSGI application.
from flask import Flask
  
# We create an instance of this class. The first
# argument is the name of the application’s module 
# or package. __name__ is a convenient shortcut for
# this that is appropriate for most cases.This is
# needed so that Flask knows where to look for resources
# such as templates and static files.
app = Flask(__name__)
  
# We use the route() decorator to tell Flask what URL 
# should trigger our function.
@app.route('/')
def cricgfg():
    return "Welcome to CricGFG!"
  
# main driver function
if __name__ == "__main__":
    
    # run() method of Flask class runs the 
    # application on the local development server.
    app.run(debug=True)

Producción:

Abra localhost en su navegador:

Ahora agregaríamos nuestro código de Web Scraping en este y algunos métodos auxiliares proporcionados por Flask para devolver correctamente los datos JSON.

Entendiendo Jsonify

jsonify es una función en Flask. Serializa datos en formato de notación de objetos de JavaScript (JSON). Considere el siguiente código:

Python3

from flask import Flask, jsonify
  
app = Flask(__name__)
  
@app.route('/')
def cricgfg():
    
    # Creating a dictionary with data to test jsonfiy.
    result = {
        "Description": "Live score England vs India 3rd Test,Pataudi \
        Trophy, 2021",
        "Location": "Headingley, Leeds",
        "Status": "England lead by 223 runs",
        "Current": "Day 2 | Post Tea Session",
        "Team A": "England",
        "Team A Score": "301/3 (96.0)",
        "Team B": "India",
        "Team B Score": "78",
        "Full Scoreboard": "https://sports.ndtv.com//cricket/live-scorecard\
        /england-vs-india-3rd-test-leeds-enin08252021199051",
        "Credits": "NDTV Sports"
    }
    return jsonify(result)
  
if __name__ == "__main__":
    app.run(debug=True)

Producción:

Ahora es el momento de fusionar todos nuestros códigos. ¡Empecemos!

Python3

import requests
from bs4 import BeautifulSoup
from flask import Flask, jsonify
  
app = Flask(__name__)
  
  
@app.route('/')
def cricgfg():
    html_text = requests.get('https://sports.ndtv.com/cricket/live-scores').text
    soup = BeautifulSoup(html_text, "html.parser")
    sect = soup.find_all('div', class_='sp-scr_wrp ind-hig_crd vevent')
  
    section = sect[0]
    description = section.find('span', class_='description').text
    location = section.find('span', class_='location').text
    current = section.find('div', class_='scr_dt-red').text
    link = "https://sports.ndtv.com/" + section.find(
    'a', class_='scr_ful-sbr-txt').get('href')
  
    try:
        status = section.find_all('div', class_="scr_dt-red")[1].text
        block = section.find_all('div', class_='scr_tm-wrp')
        team1_block = block[0]
        team1_name = team1_block.find('div', class_='scr_tm-nm').text
        team1_score = team1_block.find('span', class_='scr_tm-run').text
        team2_block = block[1]
        team2_name = team2_block.find('div', class_='scr_tm-nm').text
        team2_score = team2_block.find('span', class_='scr_tm-run').text
        result = {
            "Description": description,
            "Location": location,
            "Status": status,
            "Current": current,
            "Team A": team1_name,
            "Team A Score": team1_score,
            "Team B": team2_name,
            "Team B Score": team2_score,
            "Full Scoreboard": link,
            "Credits": "NDTV Sports"
        }
    except:
        pass
    return jsonify(result)
  
if __name__ == "__main__":
    app.run(debug=True)

Salida en el navegador:

Aquí hemos creado nuestra propia API de Cricket.

Implementación de API en Heroku

Paso 1: debe crear una cuenta en Heroku .

Paso 2: Instale Git en su máquina.

Paso 3: Instale Heroku en su máquina.

Paso 4: Inicie sesión en su cuenta de Heroku

heroku login

Paso 5: Instale gunicorn, que es un servidor HTTP de Python puro para aplicaciones WSGI. Le permite ejecutar cualquier aplicación de Python al mismo tiempo mediante la ejecución de varios procesos de Python.

pip install gunicorn

Paso 6: Necesitamos crear un perfil que es un archivo de texto en el directorio raíz de nuestra aplicación, para declarar explícitamente qué comando debe ejecutarse para iniciar nuestra aplicación.

web: gunicorn CricGFG:app

Paso 7: Además, creamos un archivo requirements.txt que incluye todos los módulos necesarios que necesita Heroku para ejecutar nuestra aplicación de matraz.

pip freeze >> requirements.txt

Paso 8: Cree una aplicación en Heroku, haga clic aquí .

Paso 9: ahora inicializamos un repositorio git y le agregamos nuestros archivos.

git init
git add .
git commit -m "Cricket API Completed"

Paso 10: Ahora dirigiremos a Heroku hacia nuestro repositorio git.

heroku git:remote -a cricgfg

Paso 11: ahora enviaremos nuestros archivos a Heroku.

git push heroku master

Finalmente, nuestra API ahora está disponible en https://cricgfg.herokuapp.com/

Publicación traducida automáticamente

Artículo escrito por kothawleprem y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *