GitHub es donde los desarrolladores dan forma al futuro del software, juntos, contribuyen a la comunidad de código abierto, administran repositorios de Git, etc. Es una de las herramientas más utilizadas por un desarrollador y su perfil se comparte para mostrar o permitir que otros contribuyan a su proyectos Web Scraping usando python también es uno de los mejores métodos para obtener datos.
En este artículo, crearemos una API para obtener la imagen de perfil de un usuario y sus seguidores. El siguiente es el flujo en el que este blog guiaría para crear una API:
- Configuración del directorio de aplicaciones
- Datos de Web Scrape de GitHub.
- Se usaría Beautiful Soup en Python.
- Crear una API.
- Se utilizaría matraz.
Configuración del directorio de aplicaciones
Paso 1: crea una carpeta (p. ej., GitHubGFG).
Paso 2: configurar el entorno virtual. Aquí creamos un entorno .env
python -m venv .env
Paso 3: Activar el entorno.
.env\Scripts\activate
Raspado de 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
Paso 2: Instale el módulo de Requests de Python. Requests permite enviar requests HTTP/1.1 de forma extremadamente sencilla.
pip install requests
Crea un archivo python. (por ejemplo: github.py)
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;
github_html = requests.get(f'https://github.com/{username}').text
El {nombre de usuario} tendrá el nombre de usuario de GitHub del usuario requerido. Para representar el objeto analizado como un todo, usamos el objeto BeautifulSoup,
soup = BeautifulSoup(github_html, "html.parser")
Ejemplo:
Python3
from bs4 import BeautifulSoup import requests username = "kothawleprem" github_html = requests.get(f'https://github.com/{username}').text soup = BeautifulSoup(github_html, "html.parser") print(soup)
Producción:
Ahora busque la clase de avatar en el documento HTML, ya que tiene la URL requerida para la imagen de perfil.
find_all(): El método find_all() examina los descendientes de una etiqueta y recupera todos los descendientes que coinciden con los filtros. Aquí nuestro filtro es una etiqueta img con la clase como avatar.
Python3
avatar_block = soup.find_all('img',class_='avatar') print(avatar_block)
El siguiente es el resultado de avatar_block:
La URL de la imagen está en el atributo src, para obtener el texto de la URL, use .get():
Python3
img_url = avatar_block[4].get('src') print(img_url)
El siguiente es el resultado de img_url:
Busque la primera clase Counter en el documento HTML, ya que tiene los datos necesarios para la cantidad de repositorios.
find(): El método find() examina los descendientes de una etiqueta y recupera un único descendiente que coincida con los filtros. Aquí nuestro filtro es una etiqueta de intervalo con la clase como Contador.
repos = soup.find('span',class_="Counter").text
El código completo sería el siguiente:
Python3
from bs4 import BeautifulSoup import requests username = "kothawleprem" github_html = requests.get(f'https://github.com/{username}').text soup = BeautifulSoup(github_html, "html.parser") avatar_block = soup.find_all('img',class_='avatar') img_url = avatar_block[4].get('src') repos = soup.find('span',class_="Counter").text print(img_url) print(repos)
Producción:
https://avatars.githubusercontent.com/u/59017652?v=4 33
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 github(): return "Welcome to GitHubGFG!" # main driver function if __name__ == "__main__": # run() method of Flask class runs the # application on the local development server. app.run(debug=True)
Abra localhost en su navegador:
Obtener el nombre de usuario de GitHub de la URL:
Python3
from flask import Flask app = Flask(__name__) @app.route('/<username>') def github(username): return f"Username: {username}" if __name__ == "__main__": app.run(debug=True)
Producción:
Ahora agregaríamos nuestro código de Web Scrapping y algunos métodos de ayuda proporcionados por Flask para devolver correctamente los datos JSON. 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
import requests from bs4 import BeautifulSoup from flask import Flask app = Flask(__name__) @app.route('/<username>') def github(username): github_html = requests.get(f'https://github.com/{username}').text soup = BeautifulSoup(github_html, "html.parser") avatar_block = soup.find_all('img',class_='avatar') img_url = avatar_block[4].get('src') repos = soup.find('span',class_="Counter").text # Creating a dictionary for our data result = { 'imgUrl' : img_url, 'numRepos' : repos, } return result if __name__ == "__main__": app.run(debug=True)
Producción:
Si el nombre de usuario no es correcto o por cualquier otro motivo, debemos agregar nuestro código en el bloque de prueba y excepción para manejar las excepciones. El código final sería el siguiente:
Python3
import requests from bs4 import BeautifulSoup from flask import Flask app = Flask(__name__) @app.route('/<username>') def github(username): try: github_html = requests.get(f'https://github.com/{username}').text soup = BeautifulSoup(github_html, "html.parser") avatar_block = soup.find_all('img',class_='avatar') img_url = avatar_block[4].get('src') repos = soup.find('span',class_="Counter").text # Creating a dictionary for our data result = { 'imgUrl' : img_url, 'numRepos' : repos, } except: result = { "message": "Invalid Username!" }, 400 return result if __name__ == "__main__": app.run(debug=True)
Publicación traducida automáticamente
Artículo escrito por kothawleprem y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA