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.

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 le page_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.

Obtenez la certification en ChatGPT + UX conversationnelle + Dialogflow

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 fonction parse_star_count. La fonction renvoie le nombre d’étoiles analysé sous forme d’entier, qui est assigné à la variable stars.

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 de topic_url. Le contenu HTML analysé est assigné à la variable topic_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’ dans topic_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.

GitHubtopics.csv
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.

GitHubTopcis_CSV-Files

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.

3D.csv

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

Chatathon by Chatbot Conference

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

Modèles de langage pour la complétion de phrases

Les modèles de langage tels que GPT sont devenus très populaires récemment et sont utilisés pour diverses tâches de g...

AI

Grok L'IA Chatbot de xAI d'Elon Musk

Plongez dans Grok d'Elon Musk par xAI, un chatbot IA avec une récupération d'informations en temps réel, de l'humour ...

AI

LoRa, QLoRA et QA-LoRA adaptabilité efficace dans les grands modèles de langage grâce à la factorisation de matrices de bas rang

Les modèles de langage volumineux (LLM) ont creusé une niche unique, offrant des capacités inégalées en matière de co...

AI

LLMs en IA conversationnelle Construction de chatbots et d'assistants plus intelligents

Introduction Les modèles de langage occupent une place centrale dans le monde fascinant de l’IA conversationnel...

AI

Prendre les bonnes décisions conseils IA, aides à la prise de décision et promesse des LLMs

La démocratisation de l'IA a conduit à l'adoption de systèmes d'IA dans une variété de domaines. La récente vague de ...

AI

Le choix pour les entreprises entre les modèles open-source et propriétaires pour déployer l'IA génératrice

Le regain d'intérêt pour l'IA générative a donné naissance à plus de 350 entreprises dans le domaine d'ici mi-2023 [1...