GitHub Topics Scraper | Scraping Web avec Python
GitHub Topics scraper using Python for web scraping.
Le web scraping est une technique utilisée pour extraire des données de sites web. Cela nous permet de recueillir des informations à partir de pages web et de les utiliser à diverses fins, telles que l’analyse de données, la recherche ou la création d’applications.
Dans cet article, nous allons explorer un projet Python appelé “GitHub Topics Scraper”, qui utilise le web scraping pour extraire des informations de la page des sujets GitHub et récupérer les noms et les détails des dépôts pour chaque sujet.
Introduction
GitHub est une plateforme très populaire pour l’hébergement et la collaboration sur des dépôts de code. Il offre une fonctionnalité appelée “sujets” qui permet aux utilisateurs de catégoriser les dépôts en fonction de sujets ou de thèmes spécifiques. Le projet GitHub Topics Scraper automatise le processus de récupération de ces sujets et de récupération des informations de dépôt pertinentes.
- Comment implémenter l’IA adaptative dans votre entreprise
- Vente Flash Libérez votre potentiel en IA dès aujourd’hui ! 🚀
- Dernière chance ! Les ateliers certifiés en intelligence artificielle commencent dans 24 heures ! Ne manquez pas ça !
Aperçu du projet
Le GitHub Topics Scraper est mis en œuvre en utilisant Python et utilise les bibliothèques suivantes:
requests
: utilisée pour effectuer des requêtes HTTP afin de récupérer le contenu HTML des pages web.BeautifulSoup
: une bibliothèque puissante pour l’analyse syntaxique HTML et l’extraction de données à partir de celle-ci.pandas
: une bibliothèque polyvalente pour la manipulation et l’analyse de données, utilisée pour organiser les données récupérées dans un format structuré.
Plongeons dans le code et comprenons comment fonctionne chaque composant du projet.
Script Python
import requestsfrom bs4 import BeautifulSoupimport pandas as pd
Le code ci-dessus importe trois bibliothèques: requests
, BeautifulSoup
et pandas
.
def topic_page_authentication(url): topics_url = url response = requests.get(topics_url) page_content = response.text doc = BeautifulSoup(page_content, 'html.parser') return doc
Définit une fonction appelée topic_page_authentication
qui prend une URL en argument.
Voici une répartition de ce que fait le code :
1. topics_url = url
: Cette ligne affecte l’URL fournie à la variable topics_url
. Cette URL représente la page web que nous voulons authentifier et récupérer son contenu.
2. response = requests.get(topics_url)
: Cette ligne utilise la fonction requests.get()
pour envoyer une requête HTTP GET à la topics_url
et stocke la réponse dans la variable response
. Cette requête est utilisée pour récupérer le contenu HTML de la page web.
3. page_content = response.text
: Cette ligne extrait le contenu HTML de l’objet de réponse et l’assigne à la variable page_content
. L’attribut response.text
récupère le contenu texte de la réponse.
- 4.
doc = BeautifulSoup(page_content, 'html.parser')
- Cette ligne crée un objet BeautifulSoup appelé
doc
en analysant lepage_content
à l’aide de l’analyseur'html.parser'
. Cela nous permet de naviguer et d’extraire des informations de la structure HTML de la page web.
5. return doc
: Cette ligne renvoie l’objet BeautifulSoup doc
de la fonction. Cela signifie que lorsque la fonction topic_page_authentication
est appelée, elle renverra le contenu HTML analysé en tant qu’objet BeautifulSoup.
Le but de cette fonction est d’authentifier et de récupérer le contenu HTML d’une page web spécifiée par l’URL fournie. Il utilise la bibliothèque requests
pour envoyer une requête HTTP, récupérer le contenu de la réponse, puis le parser en utilisant BeautifulSoup pour créer un objet navigable représentant la structure HTML.
Veuillez noter que le code fourni gère les étapes initiales d’authentification et de parsing de la page web, mais ne réalise pas de tâches spécifiques d’extraction de données.
def topicSraper(doc): # Extract title title_class = 'f3 lh-condensed mb-0 mt-1 Link--primary' topic_title_tags = doc.find_all('p', {'class':title_class}) # Extract description description_class = 'f5 color-fg-muted mb-0 mt-1' topic_desc_tags = doc.find_all('p', {'class':description_class}) # Extract link link_class = 'no-underline flex-1 d-flex flex-column' topic_link_tags = doc.find_all('a',{'class':link_class}) #Extract all the topic names topic_titles = [] for tag in topic_title_tags: topic_titles.append(tag.text) #Extract the descrition text of the particular topic topic_description = [] for tag in topic_desc_tags: topic_description.append(tag.text.strip()) #Extract the urls of the particular topics topic_urls = [] base_url = "https://github.com" for tags in topic_link_tags: topic_urls.append(base_url + tags['href']) topics_dict = { 'Title':topic_titles, 'Description':topic_description, 'URL':topic_urls } topics_df = pd.DataFrame(topics_dict) return topics_df
Définit une fonction appelée topicScraper
qui prend un objet BeautifulSoup ( doc
) en argument.

Voici une description de ce que fait le code :
1. title_class = 'f3 lh-condensed mb-0 mt-1 Link--primary'
: Cette ligne définit le nom de la classe CSS ( title_class
) pour l’élément HTML qui contient les titres de sujets sur la page web.
2. topic_title_tags = doc.find_all('p', {'class':title_class})
: Cette ligne utilise la méthode find_all()
de l’objet BeautifulSoup pour trouver tous les éléments HTML ( <p>
) avec la classe CSS spécifiée ( title_class
). Elle récupère une liste d’objets de balise BeautifulSoup représentant les balises de titre de sujet.
3. description_class = 'f5 color-fg-muted mb-0 mt-1'
: Cette ligne définit le nom de la classe CSS ( description_class
) pour l’élément HTML qui contient les descriptions des sujets sur la page web.
4. topic_desc_tags = doc.find_all('p', {'class':description_class})
: Cette ligne utilise la méthode find_all()
pour trouver tous les éléments HTML ( <p>
) avec la classe CSS spécifiée ( description_class
). Elle récupère une liste d’objets de balise BeautifulSoup représentant les balises de description de sujets.
5. link_class = 'no-underline flex-1 d-flex flex-column'
: Cette ligne définit le nom de la classe CSS ( link_class
) pour l’élément HTML qui contient les liens de sujets sur la page web.
6. topic_link_tags = doc.find_all('a',{'class':link_class})
: Cette ligne utilise la méthode find_all()
pour trouver tous les éléments HTML ( <a>
) avec la classe CSS spécifiée ( link_class
). Elle récupère une liste d’objets de balise BeautifulSoup représentant les balises de lien de sujet.
7. topic_titles = []
: Cette ligne initialise une liste vide pour stocker les titres de sujets extraits.
8. for tag in topic_title_tags: ...
: Cette boucle itère sur la liste topic_title_tags
et ajoute le contenu textuel de chaque balise à la liste topic_titles
.
9. topic_description = []
: Cette ligne initialise une liste vide pour stocker les descriptions de sujets extraites.
10. for tag in topic_desc_tags: ...
: Cette boucle itère sur la liste topic_desc_tags
et ajoute le contenu textuel nettoyé de chaque balise à la liste topic_description
.
11. topic_urls = []
: Cette ligne initialise une liste vide pour stocker les URL de sujets extraites.
12. base_url = "https://github.com"
: Cette ligne définit l’URL de base du site web.
13. for tags in topic_link_tags: ...
: Cette boucle itère sur la liste topic_link_tags
et ajoute l’URL concaténée (URL de base + attribut href) de chaque balise à la liste topic_urls
.
14. topics_dict = {...}
: Ce bloc crée un dictionnaire ( topics_dict
) qui contient les données extraites : titres de sujets, descriptions et URL.
15. topics_df = pd.DataFrame(topics_dict)
: Cette ligne convertit le dictionnaire topics_dict
en un DataFrame pandas, où chaque clé devient une colonne dans le DataFrame.
16. return topics_df
: Cette ligne renvoie le DataFrame pandas contenant les données extraites.
Le but de cette fonction est de récupérer et d’extraire des informations à partir de l’objet BeautifulSoup fourni ( doc
). Elle récupère les titres des sujets, les descriptions et les URLs à partir d’éléments HTML spécifiques de la page web et les stocke dans un cadre de données pandas pour une analyse ou un traitement ultérieur.
def topic_url_extractor(dataframe): url_lst = [] for i in range(len(dataframe)): topic_url = dataframe['URL'][i] url_lst.append(topic_url) return url_lst
Définit une fonction appelée topic_url_extractor
qui prend un panda DataFrame ( dataframe
) comme argument.
Voici une ventilation de ce que fait le code :
1. url_lst = []
: Cette ligne initialise une liste vide ( url_lst
) pour stocker les URLs extraites.
2. for i in range(len(dataframe)): ...
: Cette boucle itère sur les indices des lignes du DataFrame.
3. topic_url = dataframe['URL'][i]
: Cette ligne récupère la valeur de la colonne ‘URL’ pour l’index de ligne actuel ( i
) dans le cadre de données.
4. url_lst.append(topic_url)
: Cette ligne ajoute l’URL récupérée à la liste url_lst
.
5. return url_lst
: Cette ligne renvoie la liste url_lst
contenant les URLs extraits.
Le but de cette fonction est d’extraire les URLs de la colonne ‘URL’ du DataFrame fourni.
Elle itère sur chaque ligne du DataFrame, récupère la valeur de l’URL pour chaque ligne, et l’ajoute à une liste. Finalement, la fonction renvoie la liste des URLs extraits.
Cette fonction peut être utile lorsque vous voulez extraire les URLs d’un DataFrame pour un traitement ou une analyse ultérieure, comme visiter chaque URL ou effectuer un web scraping supplémentaire sur les pages web individuelles.
def parse_star_count(stars_str): stars_str = stars_str.strip()[6:] if stars_str[-1] == 'k': stars_str = float(stars_str[:-1]) * 1000 return int(stars_str)
Définit une fonction appelée parse_star_count
qui prend une chaîne de caractères ( stars_str
) en argument.
Voici une ventilation de ce que fait le code :
1. stars_str = stars_str.strip()[6:]
: Cette ligne supprime les espaces vides initiaux et finaux de la chaîne stars_str
en utilisant la méthode strip()
. Elle découpe ensuite la chaîne en commençant par le 6ème caractère et assigne le résultat à nouveau à stars_str
. Le but de cette ligne est de supprimer les caractères ou espaces inutiles de la chaîne.
2. if stars_str[-1] == 'k': ...
: Cette ligne vérifie si le dernier caractère de stars_str
est ‘k’, indiquant que le nombre d’étoiles est en milliers.
3. stars_str = float(stars_str[:-1]) * 1000
: Cette ligne convertit la partie numérique de la chaîne (à l’exclusion de ‘k’) en float, puis la multiplie par 1000 pour la convertir en nombre d’étoiles réel.
4. return int(stars_str)
: Cette ligne convertit stars_str
en entier et le renvoie.
Le but de cette fonction est d’analyser et de convertir le nombre d’étoiles d’une représentation de chaîne en une valeur entière. Elle gère les cas où le nombre d’étoiles est en milliers (‘k’) en multipliant la partie numérique de la chaîne par 1000. La fonction renvoie le nombre d’étoiles analysé en tant qu’entier.
Cette fonction peut être utile lorsque vous avez des nombres d’étoiles représentés sous forme de chaînes, comme ‘1.2k’ pour 1 200 étoiles, et que vous devez les convertir en valeurs numériques pour une analyse ou un traitement ultérieur.
def get_repo_info(h3_tags, star_tag): base_url = 'https://github.com' a_tags = h3_tags.find_all('a') username = a_tags[0].text.strip() repo_name = a_tags[1].text.strip() repo_url = base_url + a_tags[1]['href'] stars = parse_star_count(star_tag.text.strip()) return username, repo_name, stars, repo_url
Définit une fonction appelée get_repo_info
qui prend deux arguments : h3_tags
et star_tag
.
Voici une explication de ce que fait le code :
1. base_url = 'https://github.com'
: Cette ligne définit l’URL de base du site Web GitHub.
2. a_tags = h3_tags.find_all('a')
: Cette ligne utilise la méthode find_all()
de l’objet h3_tags
pour trouver tous les éléments HTML ( <a>
) à l’intérieur de celui-ci. Il récupère une liste d’objets Tag de BeautifulSoup représentant les balises d’ancrage.
3. username = a_tags[0].text.strip()
: Cette ligne extrait le contenu textuel de la première balise d’ancrage ( a_tags[0]
) et l’assigne à la variable username
. Elle supprime également tout espace blanc en début ou en fin de chaîne à l’aide de la méthode strip()
.
4. repo_name = a_tags[1].text.strip()
: Cette ligne extrait le contenu textuel de la deuxième balise d’ancrage ( a_tags[1]
) et l’assigne à la variable repo_name
. Elle supprime également tout espace blanc en début ou en fin de chaîne à l’aide de la méthode strip()
.
5. repo_url = base_url + a_tags[1]['href']
: Cette ligne récupère la valeur de l’attribut ‘href’ de la deuxième balise d’ancrage ( a_tags[1]
) et la concatène avec base_url
pour former l’URL complète du dépôt. L’URL résultante est assignée à la variable repo_url
.
- 6.
stars = parse_star_count(star_tag.text.strip())
- Cette ligne extrait le contenu textuel de l’objet
star_tag
, supprime tout espace blanc en début ou en fin de chaîne et le passe en argument à la fonctionparse_star_count
. La fonction renvoie le nombre d’étoiles analysé sous forme d’entier, qui est assigné à la variablestars
.
7. return username, repo_name, stars, repo_url
: Cette ligne renvoie un tuple contenant les informations extraites : username
, repo_name
, stars
et repo_url
.
Le but de cette fonction est d’extraire des informations sur un dépôt GitHub à partir des objets h3_tags
et star_tag
fournis. Elle récupère le nom d’utilisateur, le nom du dépôt, le nombre d’étoiles et l’URL du dépôt en naviguant et en extrayant des éléments spécifiques de la structure HTML. La fonction renvoie ensuite ces informations sous forme de tuple.
Cette fonction peut être utile lorsque vous souhaitez extraire des informations sur un dépôt à partir d’une page Web contenant une liste de dépôts, par exemple lors du scraping de sujets GitHub.
def topic_information_scraper(topic_url): # authentification de la page topic_doc = topic_page_authentication(topic_url) # extraction du nom h3_class = 'f3 color-fg-muted text-normal lh-condensed' repo_tags = topic_doc.find_all('h3', {'class':h3_class}) # récupération de la balise d'étoiles star_class = 'tooltipped tooltipped-s btn-sm btn BtnGroup-item color-bg-default' star_tags = topic_doc.find_all('a',{'class':star_class}) # récupération des informations sur le sujet topic_repos_dict = { 'username': [], 'repo_name': [], 'stars': [], 'repo_url': [] } for i in range(len(repo_tags)): repo_info = get_repo_info(repo_tags[i], star_tags[i]) topic_repos_dict['username'].append(repo_info[0]) topic_repos_dict['repo_name'].append(repo_info[1]) topic_repos_dict['stars'].append(repo_info[2]) topic_repos_dict['repo_url'].append(repo_info[3]) return pd.DataFrame(topic_repos_dict)
Définit une fonction appelée topic_information_scraper
qui prend un argument topic_url
.
Voici une explication de ce que fait le code :
- 1.
topic_doc = topic_page_authentication(topic_url)
- Cette ligne appelle la fonction
topic_page_authentication
pour authentifier et récupérer le contenu HTML detopic_url
. Le contenu HTML analysé est assigné à la variabletopic_doc
.
2. h3_class = 'f3 color-fg-muted text-normal lh-condensed'
: Cette ligne définit le nom de la classe CSS (h3_class
) pour l’élément HTML qui contient les noms de dépôt dans la page de sujet.
3. repo_tags = topic_doc.find_all('h3', {'class':h3_class})
: Cette ligne utilise la méthode find_all()
de l’objet topic_doc
pour trouver tous les éléments HTML (<h3>
) avec la classe CSS spécifiée (h3_class
). Elle récupère une liste d’objets de balise BeautifulSoup représentant les balises de nom de dépôt.
4. star_class = 'tooltipped tooltipped-s btn-sm btn BtnGroup-item color-bg-default'
: Cette ligne définit le nom de la classe CSS (star_class
) pour l’élément HTML qui contient le nombre d’étoiles dans la page de sujet.
5. star_tags = topic_doc.find_all('a',{'class':star_class})
: Cette ligne utilise la méthode find_all()
pour trouver tous les éléments HTML (<a>
) avec la classe CSS spécifiée (star_class
). Elle récupère une liste d’objets de balise BeautifulSoup représentant les balises de nombre d’étoiles.
6. topic_repos_dict = {...}
: Ce bloc crée un dictionnaire (topic_repos_dict
) qui stockera les informations de dépôt extraites : nom d’utilisateur, nom de dépôt, nombre d’étoiles et URL de dépôt.
7. for i in range(len(repo_tags)): ...
: Cette boucle itère sur les indices de la liste repo_tags
, en supposant qu’elle a la même longueur que la liste star_tags
.
8. repo_info = get_repo_info(repo_tags[i], star_tags[i])
: Cette ligne appelle la fonction get_repo_info
pour extraire des informations sur un dépôt spécifique. Elle passe la balise de nom de dépôt actuelle (repo_tags[i]
) et la balise de nombre d’étoiles (star_tags[i]
) en tant qu’arguments. Les informations retournées sont assignées à la variable repo_info
.
9. topic_repos_dict['username'].append(repo_info[0])
: Cette ligne ajoute le nom d’utilisateur extrait de repo_info
à la liste ‘username’ dans topic_repos_dict
.
10. topic_repos_dict['repo_name'].append(repo_info[1])
: Cette ligne ajoute le nom de dépôt extrait de repo_info
à la liste ‘repo_name’ dans topic_repos_dict
.
- 11.
topic_repos_dict['stars'].append(repo_info[2])
- Cette ligne ajoute le nombre d’étoiles extrait de
repo_info
à la liste ‘stars’ danstopic_repos_dict
.
12. topic_repos_dict['repo_url'].append(repo_info[3])
: Cette ligne ajoute l’URL de dépôt extraite de repo_info
à la liste ‘repo_url’ dans topic_repos_dict
.
13. return pd.DataFrame(topic_repos_dict)
: Cette ligne convertit le dictionnaire topic_repos_dict
en un DataFrame pandas, où chaque clé devient une colonne dans le DataFrame. Le DataFrame résultant contient les informations de dépôt extraites.
Le but de cette fonction est de scraper et d’extraire des informations sur les dépôts dans un sujet spécifique sur GitHub. Elle authentifie et récupère le contenu HTML de la page de sujet, puis extrait les noms de dépôt et les nombres d’étoiles en utilisant des noms de classe CSS spécifiques.
Elle appelle la fonction get_repo_info
pour chaque dépôt afin d’obtenir le nom d’utilisateur, le nom de dépôt, le nombre d’étoiles et l’URL de dépôt.
Les informations extraites sont stockées dans un dictionnaire puis converties en un DataFrame pandas, qui est retourné par la fonction.
if __name__ == "__main__": url = 'https://github.com/topics' topic_dataframe = topicSraper(topic_page_authentication(url)) topic_dataframe.to_csv('GitHubtopics.csv', index=None) # Créer d'autres fichiers CSV en fonction des sujets url = topic_url_extractor(topic_dataframe) name = topic_dataframe['Title'] for i in range(len(topic_dataframe)): new_df = topic_information_scraper(url[i]) new_df.to_csv(f'GitHubTopic_CSV-Files/{name[i]}.csv', index=None)
Le code de l’exemple ci-dessous montre le flux d’exécution principal du script.
Voici une ventilation de ce que fait le code :
1. if __name__ == "__main__":
: Cette déclaration conditionnelle vérifie si le script est exécuté directement (pas importé en tant que module).
2. url = 'https://github.com/topics'
: Cette ligne définit l’URL de la page des sujets GitHub.
3. topic_dataframe = topicSraper(topic_page_authentication(url))
: Cette ligne récupère le contenu HTML de la page des sujets en utilisant topic_page_authentication
, puis transmet le HTML analysé (doc
) à la fonction topicSraper
. Elle affecte le cadre de données résultant (topic_dataframe
) à une variable.
4. topic_dataframe.to_csv('GitHubtopics.csv', index=None)
: Cette ligne exporte le cadre de données topic_dataframe
vers un fichier CSV nommé ‘GitHubtopics.csv’. L’argument index=None
garantit que les indices de ligne ne sont pas inclus dans le fichier CSV.
5. url = topic_url_extractor(topic_dataframe)
: Cette ligne appelle la fonction topic_url_extractor
, en passant topic_dataframe
en argument. Elle récupère une liste d’URL ( url
) extraits du cadre de données.
6. name = topic_dataframe['Title']
: Cette ligne récupère la colonne ‘Title’ du topic_dataframe
et l’affecte à la variable name
.
7. for i in range(len(topic_dataframe)): ...
: Cette boucle itère sur les indices du cadre de données topic_dataframe
.
8. new_df = topic_information_scraper(url[i])
: Cette ligne appelle la fonction topic_information_scraper
, en passant l’URL ( url[i]
) en argument. Elle récupère les informations du référentiel pour l’URL de sujet spécifique et les affecte au cadre de données new_df
.
9. new_df.to_csv(f'GitHubTopic_CSV-Files/{name[i]}.csv', index=None)
: Cette ligne exporte le cadre de données new_df
vers un fichier CSV. Le nom de fichier est généré dynamiquement à l’aide d’une chaîne formatée en incorporant le nom du sujet ( name[i]
). L’argument index=None
garantit que les indices de ligne ne sont pas inclus dans le fichier CSV.
Le but de ce script est de scraper et extraire des informations de la page des sujets GitHub et de créer des fichiers CSV contenant les données extraites. Il scrape d’abord la page principale des sujets, enregistre les informations extraites dans « GitHubtopics.csv », puis procède au scraping des pages de sujet individuelles en utilisant les URL extraites.
Pour chaque sujet, il crée un nouveau fichier CSV nommé d’après le sujet et enregistre les informations de référentiel en elle.
Ce script peut être exécuté directement pour effectuer le scraping et générer les fichiers CSV souhaités.
Sortie finale
url = 'https://github.com/topics'topic_dataframe = topicSraper(topic_page_authentication(url))topic_dataframe.to_csv('GitHubtopics.csv', index=None)
Une fois que ce code est exécuté, il générera un fichier CSV nommé « GitHubtopics.csv », qui ressemble à ceci, et ce csv couvre tous les noms de sujet, leur description et leurs URL.

url = topic_url_extractor(topic_dataframe) name = topic_dataframe['Title']for i in range(len(topic_dataframe)): new_df = topic_information_scraper(url[i]) new_df.to_csv(f'GitHubTopic_CSV-Files/{name[i]}.csv', index=None)
Ensuite, ce code sera exécuté pour créer les fichiers CSV spécifiques basés sur les sujets que nous avons enregistrés dans le fichier « GitHubtopics.csv » précédent. Ensuite, ces fichiers CSV sont enregistrés dans un répertoire appelé « GitHubTopic_CSV-Files » avec leurs propres noms de sujet spécifiques. Ces fichiers csv ressemblent à ceci.

Ces fichiers csv de Topic contiennent des informations sur le sujet, telles que leur nom d’utilisateur, le nom du dépôt, les étoiles du dépôt et l’URL du dépôt.

Remarque: les balises du site Web peuvent changer, donc avant d’exécuter ce script python, vérifiez les balises une fois selon le site Web.
Accès au script complet >> https://github.com/PrajjwalSule21/GitHub-Topic-Scraper/blob/main/RepoScraper.py

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Accélérez l’apprentissage automatique de graphes avec GraphStorm une nouvelle façon de résoudre les problèmes sur des graphes à grande échelle d’entreprise.
- AWS Inferentia2 s’appuie sur AWS Inferentia1 en offrant un débit 4 fois supérieur et une latence 10 fois inférieure.
- Editeur d’images et EditBench Avancer et évaluer l’imagerie de restauration guidée par le texte.
- Sunak cherche le soutien de Biden sur l’IA après que le Royaume-Uni a été exclu de discussions clés.