Comment récupérer des dépôts publics GitHub en utilisant Python?

Commentaires: 0

Dans cet article, nous allons analyser comment scraper les dépôts GitHub en utilisant Python. Nous passerons en revue des bibliothèques bien connues comme BeautifulSoup et Requests et nous donnerons une explication détaillée lors de la construction d'un script de scraping GitHub afin que vous puissiez suivre facilement.

Pourquoi utiliser les dépôts GitHub ?

Qu'est-ce que le scraping Github et à quoi sert-il ? Il existe de nombreuses raisons de l'utiliser, mais les plus fréquentes sont les suivantes:

  • Suivre les avancées technologiques. La surveillance des étoiles et des dépôts est un excellent moyen de suivre les tendances en matière de langages de programmation, de cadres et de bibliothèques. Ces informations peuvent être très importantes lorsqu'il s'agit de prendre des décisions relatives à la mise en œuvre de technologies, au développement de compétences ou à l'allocation de ressources.
  • Utiliser un référentiel de programmation. Une pléthore de projets, d'exemples et de solutions open-source peuvent être trouvés sur GitHub. Par conséquent, une quantité massive de connaissances et de techniques de programmation utiles à des fins éducatives, à l'amélioration des compétences de programmation et à la compréhension de la mise en œuvre de la technologie sont facilement disponibles sur la plateforme.

Non seulement GitHub propose l'hébergement de dépôts, mais il dispose d'une base d'utilisateurs massive et d'une excellente réputation, ce qui en fait une option fiable.

Les informations stockées sur GitHub sont utiles pour suivre les modèles de progression technologique et améliorer le développement des logiciels. Ces informations sont essentielles pour rester en phase avec les concurrents dans le monde des technologies de l'information.

Bibliothèques et outils essentiels pour le scraping de GitHub

Lorsqu'il s'agit de scraper une page web, le langage le plus facile à utiliser est Python, car ses bibliothèques et ses modules sont très nombreux. Pour utiliser Github scraping Python, les modules suivants doivent être ajoutés:

  • requêtes: lib client qui contient les requêtes et les réponses HTTP, et qui est le plus utilisé.
  • BeautifulSoup: sophistiqué lorsqu'il s'agit d'extraire des détails à partir de HTML, il est doté de fonctionnalités avancées en matière de navigation et d'extraction de données.
  • Selenium: lance un véritable navigateur et permet de cliquer et de taper sur des éléments de la page.

Cela peut se faire facilement à l'aide des outils de scraping de Github. Cependant, voyons comment procéder.

Construire un script de scraping du dépôt GitHub avec Beautiful Soup

Cette partie montrera comment gratter les dépôts Github. Les étapes importantes de la création du scraper sont les suivantes:

  1. Création de la base de données - ce qui implique le téléchargement de Python et des bibliothèques correspondantes.
  2. L'enregistrement du code HTML de la page GitHub.
  3. Examiner la présentation de la page afin d'identifier les éléments nécessaires.
  4. Collecte d'informations, ce qui implique d'obtenir les noms des comptes, les descriptions et le nombre d'étoiles obtenues, entre autres choses.
  5. Stockage des données selon les types de systèmes de fichiers.

A partir de maintenant, nous partagerons les détails de toutes ces étapes avec un script de scraping Github complètement formé.

Étape 1: Configuration de l'environnement du projet Python

Assurez-vous d'avoir Python sur votre machine. Ensuite, créez un nouvel environnement virtuel Python pour démarrer le processus de scraping de Github.


python -m venv github_scraper
source github_scraper/bin/activate  # Pour macOS et Linux
github_scraper\Scripts\activate     # Pour les fenêtres

Étape 2: Installation des bibliothèques Python requises

Comme nous l'avons dit précédemment, BeautifulSoup et Requests vous aideront à récupérer les dépôts GitHub. Dans l'environnement virtuel actuellement activé, exécutez cette commande pour les inclure dans les dépendances de votre projet:


pip install beautifulsoup4 requests

Étape 3: Accéder à la page GitHub cible et la télécharger

Sélectionnez n'importe quel dépôt à partir duquel vous souhaitez effectuer du scraping Github. Tout d'abord, définissez le lien dans une variable, puis faites une requête HTTP qui récupérera le code de la page.


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

Étape 4: Comprendre et analyser la structure HTML

Pour analyser votre HTML, vous l'introduisez dans BeautifulSoup.


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

Le constructeur BeautifulSoup() doit être doté de deux éléments.

  1. Une chaîne de caractères contenant le contenu HTML, stockée dans la variable page.text.
  2. L'analyseur que Beautiful Soup va utiliser: "html.parser" est le nom de l'analyseur HTML intégré à Python.

Le HTML sera analysé par BeautifulSoup et une structure arborescente sera générée. Plus précisément, la variable soup contient toutes les méthodes nécessaires pour sélectionner les éléments pertinents de l'arbre DOM, telles que:

  • find(): renvoie le premier élément HTML correspondant à la stratégie de sélection fournie.
  • find_all(): renvoie une liste d'éléments HTML correspondant à la stratégie du sélecteur d'entrée.
  • select_one(): renvoie le premier élément HTML qui correspond au sélecteur CSS saisi.
  • select(): renvoie une liste d'éléments HTML correspondant au sélecteur CSS fourni.

Étape 5: Analyse de la page cible pour y trouver des données pertinentes

Voici une autre étape importante: sélectionner des éléments HTML simples et en extraire les données Github. Cette étape précède l'écriture du script Python Github repositories.

Avant de scraper Github, familiarisez-vous avec la page web elle-même. Ensuite, ouvrez les outils de développement en cliquant sur F12. Maintenant que vous avez ouvert le code, vous remarquerez que de nombreux éléments de la page n'ont pas de classes ou d'attributs uniques qui permettraient de naviguer facilement vers l'élément approprié. Parcourez la page et préparez-vous à extraire des données.

Étape 6: Extraction des détails du référentiel

Nous sommes maintenant prêts à créer un script Python qui nous aidera à récupérer les dépôts GitHub. Ce script peut extraire des informations utiles stockées dans GitHub comme les étoiles, les descriptions, les derniers commits, etc. Pour cela, nous devons spécifier les caractéristiques requises et récupérer les valeurs textuelles correspondantes.

  • Nom du référentiel:
    
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    L'attribut itemprop="name" a une valeur d'attribut qui a une identité unique, nous le récupérons donc. Les champs de texte sur GitHub contiennent généralement des espaces et des caractères de retour à la ligne et peuvent être nettoyés en utilisant strip().

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

    Faites attention au fait qu'il n'y a pas de méthode plus simple pour sélectionner le composant HTML qui porte le titre de la branche principale. Que pouvez-vous faire ? Choisissez une classe unique et obtenez le texte.

  • Dernier engagement:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    Nous avons remarqué que la balise relative-time, où la dernière validation de l'utilisateur était stockée, était déjà sélectionnée, et que la date était sélectionnée par le biais de la balise datetime.

Rassemblez les informations qui se trouvent sur le côté gauche: description, étoiles, vues, fourches.

  • Description:
    
    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()
    
  • Étoiles:
    
    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(',', '')
    
  • Vues:
    
    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(',', '')
    
  • Fourchettes:
    
    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(',', '')
    

Étape 7: Collecte et analyse des fichiers Readme

Le fichier readme est très important. Il fournit des descriptions des dépôts et des instructions sur la manière d'implémenter le code. Si vous consultez le fichier readme.md, vous pouvez remarquer le lien qu'il contient:


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

Puisque nous avons , nous pouvons créer par programme l'URL à l'aide d'une chaîne f, l'utiliser et faire une requête HTTP pour obtenir le code du fichier.


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

N'oubliez pas de vérifier l'erreur 404 pour éviter de sauvegarder le contenu de la page web 404 de GitHub si le dépôt n'a pas de fichier readme.

Étape 8: Organiser et stocker efficacement les données récupérées

Toutes les informations seront stockées dans un seul dictionnaire afin que nous puissions facilement les écrire dans un fichier 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

Étape 9: Exportation des données scrapées au format JSON

Nous utiliserons la bibliothèque Python intégrée pour analyser les données et les stocker au format JSON, qui est parfait pour les structures imbriquées, comme dans notre cas où les articles ont des listes.


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

Étape 10: Intégrer toutes les étapes dans un script complet


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()

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

# dernier engagement
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# description
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()

# étoiles
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(',', '')

# observateurs
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(',', '')

# fourchettes
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)

Scraping Github: Conclusion

Nous avons examiné le processus de construction d'un script de scraping GitHub pour les dépôts à l'aide de BeautifulSoup et Requests. Vous savez maintenant comment accéder à des pages web, extraire des données pertinentes et les encoder de manière conviviale. De telles compétences seraient utiles pour analyser des projets bien connus, suivre les changements apportés au code ou générer des rapports.

Néanmoins, veillez à une utilisation judicieuse. La plupart du temps, une API est disponible sur GitHub, qui sera plus simple et plus pratique à utiliser. Si vous décidez de faire du web scraping, veillez à respecter les lignes directrices du site et à ne pas bombarder les serveurs avec trop de requêtes.

Commentaires:

0 Commentaires