Cómo raspar repositorios públicos de GitHub usando Python?

Comentarios: 0

En este artículo, analizaremos cómo scrapear repositorios de GitHub usando Python. Revisaremos librerías bien conocidas como BeautifulSoup y Requests y daremos una explicación detallada mientras construimos el script de scraping de GitHub para que puedas seguirlo fácilmente.

¿Por qué raspar los repositorios de GitHub?

¿Qué es el Github scraping y para qué sirve? Existen numerosos propósitos para utilizarlo, pero los más frecuentes incluyen:

  • Supervisar los avances tecnológicos. Monitorizar las estrellas y los repositorios es una buena forma de seguir las tendencias de los lenguajes de programación, los marcos de trabajo y las bibliotecas. Esta información puede ser muy importante a la hora de tomar decisiones relacionadas con la implantación de tecnologías, el desarrollo de habilidades o la asignación de recursos.
  • Utilizar un repositorio de programación. En GitHub se puede encontrar una plétora de proyectos, ejemplos y soluciones de código abierto. Por lo tanto, en la plataforma se puede acceder fácilmente a una enorme cantidad de conocimientos y técnicas de programación útiles para fines educativos, mejorar las habilidades de programación y comprender la implementación de la tecnología.

GitHub no sólo ofrece alojamiento para repositorios, sino que cuenta con una base de usuarios masiva y una gran reputación que lo convierten en una opción fiable.

La información almacenada en GitHub es útil para seguir las pautas de la progresión tecnológica, así como para mejorar el desarrollo de software. Esta información es fundamental para mantenerse a la altura de los competidores en el mundo de las tecnologías de la información.

Bibliotecas y herramientas esenciales para el scraping de GitHub

Cuando se trata de scrapear una página web, el lenguaje más fácil para trabajar es Python, ya que sus librerías y módulos son muchísimos. Para Github raspado Python, es necesario añadir los siguientes módulos:

  • requests: lib de cliente que contiene las peticiones y respuestas HTTP, y la más utilizada.
  • BeautifulSoup: sofisticado cuando se trata de extraer detalles de HTML, ya que viene con características avanzadas cuando se trata de navegar y recuperar datos.
  • Selenium: lanza un navegador real y permite hacer clic y escribir sobre los elementos de la página.

Esto se puede hacer fácilmente con el uso de herramientas de raspado de Github. Sin embargo, vamos a elaborar sobre cómo hacerlo.

Creación de un script de raspado de repositorios GitHub con Beautiful Soup

Esta parte mostrará cómo raspar repositorios de Github. Pasos importantes para hacer el raspador consisten en:

  1. Creación de la base de conjuntos, lo que implica la descarga de Python y las bibliotecas pertinentes.
  2. El guardado del código HTML de la página de GitHub.
  3. Examinar el diseño de la página para identificar los elementos necesarios.
  4. Recopilar información, lo que implica obtener los nombres de las cuentas, las descripciones y la cantidad de estrellas conseguidas, entre otras cosas.
  5. Almacenamiento de datos a tipos de sistema de archivos.

A partir de ahora, compartiremos los detalles de todos estos pasos junto con un script Github de scraping completamente formado.

Paso 1: Configuración del entorno del proyecto Python

Asegúrate de que tienes Python en tu máquina. A continuación, crea un nuevo entorno virtual Python para iniciar el proceso de scraping de Github.


python -m venv github_scraper
source github_scraper/bin/activate  # Para macOS y Linux
github_scraper\Scripts\activate     # Para Windows

Paso 2: Instalación de las bibliotecas Python necesarias

Como dijimos antes, BeautifulSoup y Requests te ayudarán para el scraping de repositorios GitHub. En el entorno virtual activado actualmente, ejecuta este comando para incluirlos en las dependencias de tu proyecto:


pip install beautifulsoup4 requests

Paso 3: Acceso y descarga de la página GitHub de destino

Selecciona cualquier repositorio desde el que quieras realizar el scraping Github. En primer lugar, definir el enlace en una variable, a continuación, hacer una petición HTTP que obtendrá el código de la página.


url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)

Paso 4: Comprender y analizar la estructura HTML

Para analizar su HTML, introdúzcalo en BeautifulSoup.


soup = BeautifulSoup(page.text, 'html.parser')

El constructor de BeautifulSoup() necesita dos cosas.

  1. Una cadena que contiene el contenido HTML, almacenado en la variable page.text.
  2. El parser que usará Beautiful Soup: "html.parser" es el nombre del analizador HTML incorporado en Python.

El HTML será analizado por BeautifulSoup y se generará una estructura de árbol. Más concretamente, la variable soup contiene todos los métodos necesarios para seleccionar los elementos relevantes del árbol DOM, como:

  • find(): devuelve el primer elemento HTML que corresponde a la estrategia de selección proporcionada.
  • find_all(): devuelve una lista de elementos HTML que coinciden con la estrategia del selector de entrada.
  • select_one(): devuelve el primer elemento HTML que coincida con el selector CSS introducido.
  • select(): devuelve una lista de elementos HTML correspondientes al selector CSS proporcionado.

Paso 5: Analizar la página de destino en busca de datos relevantes

Aquí hay otro paso importante: elegir elementos HTML simples y raspar los datos de Github a partir de ellos. Este paso precede a escribir el script Python de repositorios de Github.

Antes de escrapear Github, familiarízate con la propia página web. Después de esto, abre las herramientas para desarrolladores pulsando F12. Ahora que has abierto el código, te darás cuenta de que muchos elementos de la página no tienen clases o atributos únicos que faciliten la navegación hasta el elemento apropiado. Recorre la página y prepárate para extraer los datos.

Paso 6: Extracción de los detalles del repositorio

Ahora estamos listos para crear un script en Python que nos ayudará para el scraping de repositorios GitHub. Este script puede extraer información útil almacenada en GitHub como estrellas, descripciones, últimos commits, etc. Para ello, tenemos que especificar las características requeridas y recuperar los valores de texto correspondientes.

  • Nombre del repositorio:
    
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    El atributo itemprop="name" tiene un valor de atributo que posee una identidad única, por lo que lo recuperamos. Los campos de texto de GitHub suelen tener espacios y caracteres de nueva línea, por lo que pueden limpiarse con strip().

  • Rama actual:
    
    git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
    

    Preste atención al hecho de que no existe un método más sencillo para seleccionar el componente HTML que contiene el título de la rama principal. ¿Qué puede hacer? Elija una clase que sea única y obtenga el texto.

  • Último compromiso:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    Observamos que la etiqueta relative-time, donde se almacenaba la última confirmación del usuario, ya estaba seleccionada, y la fecha se seleccionaba a través de datetime.

Reúne la información que aparece a la izquierda: descripción, estrellas, vistas, bifurcaciones.

  • Descripción:
    
    bordergrid_html_element = soup.select_one('.BorderGrid')
    about_html_element = bordergrid_html_element.select_one('h2')
    description_html_element = about_html_element.find_next_sibling('p')
    description = description_html_element.get_text().strip()
    
  • Estrellas:
    
    star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
    stars_html_element = star_icon_html_element.find_next_sibling('strong')
    stars = stars_html_element.get_text().strip().replace(',', '')
    
  • Vistas:
    
    eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
    watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
    watchers = watchers_html_element.get_text().strip().replace(',', '')
    
  • Horquillas:
    
    fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
    forks_html_element = fork_icon_html_element.find_next_sibling('strong')
    forks = forks_html_element.get_text().strip().replace(',', '')
    

Paso 7: Recopilación y análisis de archivos Léame

El archivo Léame es muy importante. Proporciona descripciones de los repositorios e instrucciones sobre cómo implementar el código. En el caso de que revises el archivo readme.md, puedes notar qué enlace tiene:


https://raw.githubusercontent.com///readme.md

Como tenemos , podemos crear programáticamente la URL usando una cadena f, usarla y hacer una petición HTTP para obtener el código del archivo.


readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
    readme = readme_page.text

Recuerda comprobar el error 404 para evitar guardar el contenido de la página web 404 de GitHub si el repositorio no tiene un archivo readme.

Paso 8: Organizar y almacenar eficazmente los datos raspados

Toda la información se almacenará en un único diccionario para que podamos escribirla fácilmente en un archivo JSON.


repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

Paso 9: Exportación de datos raspados en formato JSON

Aprovecharemos la librería incorporada de Python para analizar los datos y almacenarlos en formato JSON, ya que es perfecto para estructuras anidadas como en nuestro caso cuando los artículos tienen listas.


with open('github_data.json', 'w', encoding='utf-8') as json_file:
  json.dump(repo, json_file, ensure_ascii=False, indent=4)

Paso 10: Integrar todos los pasos en un guión completo


import json
import requests
from bs4 import BeautifulSoup

url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")

repo_title = soup.select_one('[itemprop="name"]').text.strip()

# rama
main_branch = soup.select_one(
   '[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()

# último cometer
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# descripción
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()

# estrellas
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')

# observadores
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')

# horquilla
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')

# readme
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
   readme = readme_page.text

repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

with open('github_data.json', 'w', encoding='utf-8') as json_file:
   json.dump(repo, json_file, ensure_ascii=False, indent=4)

Raspado de Github: Conclusión

Hemos examinado el proceso de construcción de un script de scraping GitHub para repositorios con la ayuda de BeautifulSoup y Requests. Ahora ya sabes cómo acceder a páginas web, extraer datos relevantes y codificarlos de una manera fácil de usar. Estas habilidades serían útiles para analizar proyectos conocidos, rastrear cambios en el código o generar informes.

No obstante, hay que tener cuidado con su uso razonable. La mayoría de las veces, existe una API disponible para su uso en GitHub, con la que será más sencillo y práctico trabajar. Si tomas la decisión de realizar web scraping, asegúrate de cumplir las directrices del sitio y no bombardear los servidores con demasiadas peticiones.

Comentarios:

0 Comentarios