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.
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:
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.
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:
Cela peut se faire facilement à l'aide des outils de scraping de Github. Cependant, voyons comment procéder.
Cette partie montrera comment gratter les dépôts Github. Les étapes importantes de la création du scraper sont les suivantes:
A partir de maintenant, nous partagerons les détails de toutes ces étapes avec un script de scraping Github complètement formé.
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
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
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)
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.
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:
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.
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.
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().
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.
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.
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(',', '')
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.
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
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)
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0