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.
¿Qué es el Github scraping y para qué sirve? Existen numerosos propósitos para utilizarlo, pero los más frecuentes incluyen:
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.
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:
Esto se puede hacer fácilmente con el uso de herramientas de raspado de Github. Sin embargo, vamos a elaborar sobre cómo hacerlo.
Esta parte mostrará cómo raspar repositorios de Github. Pasos importantes para hacer el raspador consisten en:
A partir de ahora, compartiremos los detalles de todos estos pasos junto con un script Github de scraping completamente formado.
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
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
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)
Para analizar su HTML, introdúzcalo en BeautifulSoup.
soup = BeautifulSoup(page.text, 'html.parser')
El constructor de BeautifulSoup() necesita dos cosas.
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:
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.
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.
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().
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.
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.
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()
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(',', '')
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(',', '')
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(',', '')
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.
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
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)
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0