2.3 Extraction de données web et collecte de données sur les réseaux sociaux
Objectifs d'apprentissage :
À la fin de cette section, vous devriez être en mesure de :
- 2.3.1 Discuter des utilisations de l'extraction de données web pour collecter et préparer des données en vue de leur analyse.
- 2.3.2 Appliquer des expressions régulières pour la manipulation de données et la recherche de correspondances de motifs.
- 2.3.3 Écrire du code Python pour extraire des données du Web.
- 2.3.4 Appliquer diverses méthodes pour analyser syntaxiquement, extraire, traiter et stocker des données.
L'extraction de données web et la collecte de données sur les réseaux sociaux sont deux approches utilisées pour recueillir des données sur Internet. L'extraction de données web (web scraping) consiste à récupérer des informations et des données à partir de sites web à l'aide d'un outil d'extraction de données web, souvent appelé robot d'extraction ou scraper. Un exemple serait une agence de voyages cherchant à rassembler des informations sur les prix et la disponibilité des hôtels à partir de différents sites de réservation. L'extraction de données web peut être utilisée pour recueillir automatiquement ces données sur les différents sites web et créer une liste complète que l'entreprise pourra utiliser dans sa stratégie commerciale, sans nécessiter de travail manuel.
La collecte de données sur les réseaux sociaux consiste à rassembler des informations provenant de diverses plateformes telles que Twitter et Instagram à l'aide d'interfaces de programmation d'application ou d'outils de surveillance. Une interface de programmation d'application (API) (application programming interface (API)) est un ensemble de protocoles, d'outils et de définitions permettant de créer des applications logicielles, facilitant la communication et l'interaction entre différents systèmes logiciels et permettant aux développeurs d'accéder aux données et aux services d'autres applications, systèmes d'exploitation ou plateformes. L'extraction de données web et la collecte de données sur les réseaux sociaux exigent toutes deux de déterminer les données à recueillir et de les analyser pour en vérifier l'exactitude et la pertinence.
Extraction de données web
Il existe plusieurs techniques et approches pour extraire des données à partir de sites web. Consultez le Tableau 2.2 pour découvrir certaines des techniques couramment utilisées. (Remarque : les techniques utilisées pour l'extraction de données web varient en fonction du site web et du type de données collectées. La combinaison de différentes techniques peut s'avérer nécessaire pour extraire efficacement des données d'un site web.)
| Technique d'extraction de données web | Détails |
|---|---|
| Exploration web (Web crawling) |
|
| XPath |
|
| Expressions régulières |
|
| Analyse syntaxique du HTML |
|
| Interfaces de programmation d'application (API) |
|
| Sous-ensemble d'API (XML) |
|
| Sous-ensemble d'API (JSON) |
|
Collecte de données sur les réseaux sociaux
La collecte de données sur les réseaux sociaux (social media data collection) peut être effectuée par diverses méthodes telles que l'intégration d'API, l'écoute des réseaux sociaux, les sondages sur les réseaux sociaux, l'analyse de réseaux et l'analyse d'images et de vidéos. Les API fournies par les plateformes de réseaux sociaux permettent aux scientifiques des données de collecter des données structurées sur les interactions et le contenu des utilisateurs. L'écoute des réseaux sociaux (social listening) consiste à surveiller les conversations en ligne afin de dégager des informations sur le comportement et les tendances des clients. Les enquêtes menées sur les réseaux sociaux peuvent fournir des informations sur les préférences et les opinions des clients. L'analyse de réseaux (network analysis), ou l'examen des relations et des connexions entre les utilisateurs, les données ou les entités au sein d'un réseau, peut révéler des utilisateurs et des communautés influents. Elle consiste à identifier et à analyser les individus ou les groupes influents ainsi qu'à comprendre les schémas et les tendances au sein du réseau. L'analyse d'images et de vidéos peut fournir des informations sur les tendances visuelles et le comportement des utilisateurs.
Un exemple de collecte de données sur les réseaux sociaux consiste à mener une enquête Twitter sur la satisfaction de la clientèle pour une entreprise de livraison de repas. Les scientifiques des données peuvent utiliser l'API de Twitter pour collecter des tweets contenant des hashtags spécifiques liés à l'entreprise et les analyser pour comprendre les opinions et les préférences des clients. Ils peuvent également utiliser l'écoute des réseaux sociaux pour surveiller les conversations et identifier les tendances dans le comportement des clients. De plus, la création d'un sondage sur Twitter peut fournir des indications plus ciblées sur la satisfaction et les préférences des clients. Ces données peuvent ensuite être analysées à l'aide de techniques de science des données afin de cerner les principaux points à améliorer et d'éclairer les décisions commerciales.
Utiliser Python pour extraire des données du Web
Comme indiqué précédemment, l'extraction de données web est une stratégie de collecte de données sur Internet au moyen de mécanismes ou de programmes automatisés. Python est l'un des langages de programmation les plus populaires pour l'extraction de données web en raison de ses nombreuses bibliothèques et de ses cadriciels qui facilitent la récupération et le traitement des données provenant de sites web.
Pour extraire des données telles qu'un tableau à partir d'un site web à l'aide de Python, nous suivons ces étapes :
- Importer la bibliothèque
pandas. La première étape consiste à importer la bibliothèque pandas, qui est une bibliothèque Python populaire pour l'analyse et la manipulation de données.
import pandas as pd
- Utiliser la fonction
read_html(). Cette fonction sert à lire les tableaux HTML d'une page web et à les convertir en une liste d'objets DataFrame. Rappelez-vous d'après Que sont les données et la science des données ? qu'un DataFrame est un type de données quepandasutilise pour stocker des données tabulaires à plusieurs colonnes.
df = pd.read_html("https://......
- Accéder aux données souhaitées. Si les données de la page web sont réparties dans différents tableaux, nous devons spécifier le tableau que nous souhaitons extraire. Nous utilisons l'indexation pour accéder au tableau souhaité (par exemple : l'indice 4) dans la liste d'objets DataFrame renvoyée par la fonction
read_html(). L'indice représente ici l'ordre du tableau dans la page web. - Stocker les données dans un DataFrame. Le résultat de la fonction
read_html()est une liste d'objets DataFrame, et chaque DataFrame représente un tableau de la page web. Nous pouvons stocker les données souhaitées dans une variable DataFrame en vue d'une analyse et d'une manipulation ultérieures. - Afficher le DataFrame. En accédant à la variable DataFrame, nous pouvons visualiser les données extraites sous un format tabulaire.
- Convertir les chaînes de caractères en nombres. Comme indiqué au chapitre 1, une chaîne de caractères est un type de données utilisé pour représenter une séquence de caractères, tels que des lettres, des chiffres et des symboles, entourée de guillemets simples (') ou doubles ("). Si les données du tableau sont au format chaîne de caractères et que nous souhaitons effectuer des opérations numériques sur celles-ci, nous devons convertir les données au format numérique. Nous pouvons utiliser la fonction
to_numeric()depandaspour convertir les chaînes en nombres, puis stocker le résultat dans une nouvelle colonne du DataFrame.
df['column_name'] = pd.to_numeric(df['column_name'])
Cela créera une nouvelle colonne dans le DataFrame avec les valeurs numériques converties, qui pourront ensuite être utilisées pour une analyse ou une visualisation plus poussée.
En programmation informatique, l'indexation (indexing) commence généralement à 0. En effet, la plupart des langages de programmation utilisent 0 comme indice initial pour les tableaux, les matrices ou d'autres structures de données. Cette convention a été adoptée pour simplifier l'implémentation de certains algorithmes et pour faciliter l'accès et la manipulation des données par les programmeurs. De plus, elle correspond à la façon dont les ordinateurs stockent les données et y accèdent en mémoire. Dans le contexte de l'analyse syntaxique de tableaux à partir de pages HTML, l'utilisation de 0 comme indice initial permet aux programmeurs d'accéder facilement aux données de différents tableaux d'une même page web et de les manipuler. Cela permet un traitement et une analyse efficaces des données, rendant la tâche plus gérable et rationalisée.
Exemple 2.4
Problème
Extrayez le tableau de données « Current Population Survey: Household Data: (Table A-13). Employed and unemployed persons by occupation, Not seasonally adjusted » à partir du site web de FRED (Federal Reserve Economic Data) via le lien (https://fred.stlouisfed.org/release/tables?rid=50&eid=3149#snid=4498) à l'aide de code Python. Les données de ce tableau fournissent une représentation de la situation globale de l'emploi et du chômage aux États-Unis. Le tableau est organisé en deux sections principales : les personnes en emploi et les personnes au chômage.
Solution
Code Python
# Import pandas
import pandas as pd
# Read data from the URL
df_list = pd.read_html(
"https://fred.stlouisfed.org/release/tables?rid=50&eid=3149#snid=4498")
# Since pd.read_html() returns a list of DataFrames, select the first DataFrame
df = df_list[0]
# Print the first 5 rows of the DataFrame
print(df.head(5))
La sortie obtenue ressemblera à ceci :
En Python, il existe plusieurs bibliothèques et méthodes permettant d'analyser syntaxiquement et d'extraire des données à partir de texte. Celles-ci comprennent notamment :
- Les expressions régulières (regex ou RE). Il s'agit d'une bibliothèque intégrée à Python qui permet la recherche de motifs et l'extraction de données à partir de chaînes de caractères. Elle utilise une syntaxe spécifique pour définir des motifs et des règles d'extraction de données.
- Beautiful Soup. Il s'agit d'une bibliothèque externe principalement utilisée pour extraire et analyser syntaxiquement du code HTML et XML. Elle peut être employée pour extraire des données spécifiques de pages ou de documents web.
- Natural Language Toolkit (NLTK). Il s'agit d'une bibliothèque puissante pour le traitement du langage naturel en Python. Elle fournit divers outils pour tokeniser, analyser syntaxiquement et extraire des données à partir de données textuelles. (La tokenisation (tokenizing) est le processus consistant à décomposer un texte ou une chaîne de caractères en unités plus petites appelées tokens, qui peuvent être des mots, des expressions, des symboles ou des caractères individuels.)
- TextBlob. Cette bibliothèque fournit une interface simple pour la plupart des tâches de traitement du langage naturel, telles que l'analyse des arguments et l'étiquetage morpho-syntaxique. Elle peut également être utilisée pour analyser syntaxiquement et extraire des données de textes.
- SpaCy. Il s'agit d'une bibliothèque open source populaire pour le traitement du langage naturel. Elle fournit des méthodes efficaces pour tokeniser, analyser syntaxiquement et extraire des données à partir de données textuelles.
Dans l'ensemble, la bibliothèque ou la méthode utilisée pour analyser et extraire des données dépendra de la tâche spécifique et du type de données analysées. Il est important de faire des recherches et de déterminer la meilleure approche pour un projet donné.
Expressions régulières en Python
Les expressions régulières (regular expressions), également appelées regex, sont un ensemble de symboles utilisés pour définir un motif de recherche dans des données textuelles. En Python, ces expressions sont prises en charge par le module (fonction) re, et leur syntaxe est similaire à celle d'autres langages de programmation. L'utilisation d'expressions régulières offre aux chercheurs une méthode robuste pour identifier et manipuler des motifs dans le texte. Grâce à cet outil puissant, des mots, des caractères ou des motifs de caractères spécifiques peuvent être recherchés et mis en correspondance. Les applications typiques comprennent l'analyse syntaxique de données, la validation des entrées et l'extraction d'informations ciblées à partir de sources textuelles plus volumineuses. En Python, les cas d'utilisation courants impliquent la détection de divers types de données, comme des dates, des adresses électroniques, des numéros de téléphone et des URL, au sein de fichiers texte volumineux. De plus, les expressions régulières sont précieuses pour des tâches comme le nettoyage de données et le traitement de texte. Malgré leur polyvalence, les expressions régulières peuvent être complexes, permettant des motifs de recherche avancés grâce à des métacaractères tels que *, ? et +. Cependant, travailler avec ces expressions peut présenter des défis, car elles exigent une compréhension approfondie et un débogage minutieux pour garantir une mise en œuvre réussie.
Utilisation des métacaractères dans les expressions régulières
- Le caractère
*est connu sous le nom d'« étoile » ou d'« astérisque » et est utilisé pour faire correspondre zéro ou plusieurs occurrences du caractère ou du groupe précédent dans une expression régulière. Par exemple, l'expression régulière"a*"correspondra à un"a"suivi de n'importe quel nombre (y compris zéro) de"a"supplémentaires, tels que"a","aa","aaa", etc. - Le caractère
?est appelé le « point d'interrogation » et sert à indiquer que le caractère ou le groupe précédent est facultatif. Il correspond à zéro ou une occurrence du caractère ou du groupe précédent. Par exemple, l'expression régulière"a?b"correspondra soit à"ab", soit à"b". - Le caractère
+est appelé le « signe plus » et sert à faire correspondre une ou plusieurs occurrences du caractère ou du groupe précédent. Par exemple, l'expression régulière"a+b"correspondra à un ou plusieurs"a"suivis d'un"b", tels que"ab","aab","aaab", etc. S'il n'y a aucun"a", la correspondance échouera. Cela diffère du caractère*, qui correspondrait à zéro ou plusieurs"a"suivis d'un"b", autorisant ainsi une correspondance possible sans aucun"a".
Exemple 2.5
Problème
Écrivez un code Python utilisant des expressions régulières pour rechercher un mot précis « Python » dans une chaîne donnée et afficher le nombre de fois où il apparaît.
Solution
Code Python
## import the regular expression module
import re
# create a string with story problem
story = "Samantha is a sixth-grade student who uses the popular coding language Python to collect and analyze weather data for science project. She creates a program that collects data from an online weather API and stores it in a CSV file for 10 days. With the help of her teacher, she uses Python to visualize the data and discovers patterns in temperature, humidity, and precipitation."
# create a regex pattern to match a selected word
pattern = "Python"
# use the "findall" to search for matching patterns in the data string
words = re.findall(pattern, story)
# print the number of repeated python
print ("The word 'python' is repeated", len(words), "times in the story.")
# print the matched patterns
print(words) # output: ['Python']
La sortie obtenue ressemblera à ceci :
The word 'python' is repeated 2 times in the story.
['Python', 'Python']
En Python, « len » est l'abréviation de « length » (longueur) et est utilisé pour déterminer le nombre d'éléments dans une collection. Il renvoie le nombre total d'éléments dans la collection, y compris les espaces et les signes de ponctuation dans une chaîne de caractères.
Analyse syntaxique et extraction de données
Le fractionnement et le découpage sont deux méthodes utilisées pour manipuler des chaînes de texte en programmation. Le fractionnement d'une chaîne (splitting a string) consiste à diviser une chaîne de texte en parties plus petites ou sous-chaînes sur la base d'un séparateur spécifié. Le séparateur peut être un caractère, une chaîne ou une expression régulière. Cela peut être utile pour séparer des mots, des expressions ou des valeurs de données au sein d'une chaîne plus grande. Par exemple, la chaîne "Data Science" peut être scindée en deux sous-chaînes "Data" et "Science" en utilisant une espace comme séparateur.
Le découpage d'une chaîne (slicing a string) désigne l'extraction d'une portion ou d'une section d'une chaîne sur la base d'une plage d'indices spécifiée. Un indice correspond à la position d'un caractère dans une chaîne, en commençant à 0 pour le premier caractère. La plage spécifie les indices de début et de fin de la tranche, et la sous-chaîne résultante comprend tous les caractères situés dans cette plage. Par exemple, la chaîne "Data Science" peut être découpée pour extraire "Data" en spécifiant la plage allant de l'indice 0 à 4, ce qui comprend les quatre premiers caractères. Le découpage peut également être utilisé pour manipuler des chaînes en remplaçant, en supprimant ou en insérant un nouveau contenu à des positions précises au sein de la chaîne.
L'analyse syntaxique et l'extraction de données impliquent l'analyse d'un jeu de données ou d'une chaîne donnée afin d'en extraire des éléments d'information spécifiques. Cela est accompli à l'aide de diverses techniques et fonctions, telles que le fractionnement et le découpage de chaînes, qui permettent une récupération structurée des données. Ce processus s'avère particulièrement précieux lors de l'utilisation de jeux de données volumineux et complexes, car il offre un moyen plus efficace de localiser les données recherchées que les méthodes de recherche traditionnelles. Notez que l'analyse syntaxique et l'extraction de données diffèrent de l'utilisation des expressions régulières, car ces dernières constituent un outil spécialisé pour la reconnaissance de motifs et la manipulation de texte. En revanche, l'analyse syntaxique et l'extraction de données offrent une approche globale pour identifier et extraire des données spécifiques au sein d'un jeu de données.
L'analyse syntaxique et l'extraction de données à l'aide de Python consistent à utiliser le langage de programmation pour localiser et extraire des informations spécifiques à partir d'un texte donné. Cela s'effectue en utilisant la bibliothèque re, qui permet d'utiliser des expressions régulières pour identifier et récupérer des données en fonction de motifs définis. Ce processus peut être illustré par l'exemple de l'extraction de données relatives à une personne achetant un iPhone dans un Apple Store.
Le code de l'encadré Python suivant utilise des expressions régulières (regex) pour faire correspondre et extraire des données spécifiques d'une chaîne de caractères. La chaîne est un paragraphe contenant des informations sur une personne achetant un nouveau téléphone dans un Apple Store. L'objectif est d'extraire le nom du produit, le modèle et le prix du téléphone. Tout d'abord, le code commence par importer la bibliothèque nécessaire à l'utilisation des expressions régulières. Ensuite, les données textuelles sont définies sous la forme d'une variable. Puis, les regex sont utilisées pour rechercher des motifs spécifiques dans la chaîne. Le premier motif recherche les mots "product: " et capture tout ce qui suit jusqu'à atteindre une virgule. Le résultat est ensuite stocké dans une variable nommée "product". De même, le deuxième motif recherche les mots "model: " et capture tout ce qui suit jusqu'à atteindre une virgule. Le résultat est enregistré dans une variable nommée "model". Enfin, le troisième motif recherche les mots "price: " et capture toute séquence de chiffres ou de symboles qui suit jusqu'à la fin de la chaîne. Le résultat est enregistré dans une variable nommée "price". Une fois toutes les données extraites, elles sont affichées à l'écran en utilisant la concaténation pour ajouter des étiquettes appropriées devant chaque variable.
Cette application de code Python démontre l'utilisation efficace des regex et de la bibliothèque re pour analyser syntaxiquement et extraire des données précises à partir de données fournies. Grâce à cette méthode, l'information souhaitée peut être facilement localisée et récupérée pour une analyse ou une utilisation ultérieure.
Code Python
## import necessary library
import re
# Define data to be parsed
data = "Samantha went to the Apple store to purchase a new phone. She was specifically looking for the latest and most expensive model available. As she looked at the different options, she came across the product: iPhone 12, the product name caught her attention, as it was the newest version on the market. She then noticed the model: A2172, which confirmed that this was indeed the latest and most expensive model she was looking for. The price made her hesitate for a moment, but she decided that it was worth it price: $799. She purchased the iPhone 12 and was excited to show off her new phone to her friends."
# Use regex to match and extract data based on specific pattern
product = re.search(r"product: (.+?),", data).group(1)
model = re.search(r"model: (.+?),", data).group(1)
price = re.search(r"price: (.+?.+?.+?.+?)", data).group(1)
# Print the extracted data
print("product: " + product)
print("model: " + model)
print("price: " + price)
La sortie obtenue ressemblera à ceci :
product: iPhone 12 model: A2172 price: $799
Traitement et stockage des données
Une fois les données collectées, elles doivent être traitées et stockées dans un format adapté à une analyse plus approfondie. C'est ici qu'interviennent le traitement et le stockage des données. Le traitement des données (data processing) prend d'abord en charge les données brutes en les nettoyant par la suppression des informations non pertinentes, puis en les transformant en un format structuré. Le processus de nettoyage comprend l'identification et la correction de l'ensemble des erreurs, incohérences et valeurs manquantes d'un jeu de données, et s'avère essentiel pour garantir que les données sont exactes, fiables et exploitables pour l'analyse ou à d'autres fins. Python est souvent employé pour le traitement des données en raison de sa flexibilité et de sa facilité d'utilisation, et il offre un large éventail d'outils et de bibliothèques spécialement conçus à cet effet. Une fois les données traitées, elles doivent être stockées pour une utilisation future. (Nous aborderons le stockage des données dans la section Nettoyage et prétraitement des données.) Python dispose de plusieurs bibliothèques qui permettent un stockage et une manipulation efficaces des données sous la forme de DataFrames.
Une méthode de stockage des données en Python consiste à utiliser la bibliothèque pandas pour créer un DataFrame, puis à utiliser la fonction to_csv() pour enregistrer le DataFrame sous la forme d'un fichier CSV (valeurs séparées par des virgules). Ce fichier peut ensuite être facilement ouvert et consulté en vue d'analyses ou de visualisations ultérieures. Par exemple, le code de l'encadré Python suivant est un script Python qui crée un dictionnaire contenant des données sur les présidents des États-Unis, comprenant leur numéro d'ordre et leur État de naissance. Un dictionnaire de données (data dictionary) est une structure de données qui stocke les données sous forme de paires clé-valeur, permettant une récupération efficace des données à l'aide de leur clé. Il utilise ensuite la bibliothèque CSV (CSV library) intégrée pour créer un fichier CSV et y écrire les données. Ce code est utilisé pour stocker les données sur les présidents américains dans un format structuré pour une utilisation, une analyse ou un affichage futurs.
Code Python
import csv
# Create a dictionary to store the data
presidents = {
"1": ["George Washington", "Virginia"],
"2": ["John Adams", "Massachusetts"],
"3": ["Thomas Jefferson", "Virginia"],
"4": ["James Madison", "Virginia"],
"5": ["James Monroe", "Virginia"],
"6": ["John Quincy Adams", "Massachusetts"],
"7": ["Andrew Jackson", "South Carolina"],
"8": ["Martin Van Buren", "New York"],
"9": ["William Henry Harrison", "Virginia"],
"10": ["John Tyler", "Virginia"],
"11": ["James K. Polk", "North Carolina"],
"12": ["Zachary Taylor", "Virginia"],
"13": ["Millard Fillmore", "New York"],
"14": ["Franklin Pierce", "New Hampshire"],
"15": ["James Buchanan", "Pennsylvania"],
"16": ["Abraham Lincoln", "Kentucky"],
"17": ["Andrew Johnson", "North Carolina"],
"18": ["Ulysses S. Grant", "Ohio"],
"19": ["Rutherford B. Hayes", "Ohio"],
"20": ["James A. Garfield", "Ohio"],
"21": ["Chester A. Arthur", "Vermont"],
"22": ["Grover Cleveland", "New Jersey"],
"23": ["Benjamin Harrison", "Ohio"],
"24": ["Grover Cleveland", "New Jersey"],
"25": ["William McKinley", "Ohio"],
"26": ["Theodore Roosevelt", "New York"],
"27": ["William Howard Taft", "Ohio"],
"28": ["Woodrow Wilson", "Virginia"],
"29": ["Warren G. Harding", "Ohio"],
"30": ["Calvin Coolidge", "Vermont"],
"31": ["Herbert Hoover", "Iowa"],
"32": ["Franklin D. Roosevelt", "New York"],
"33": ["Harry S. Truman", "Missouri"],
"34": ["Dwight D. Eisenhower", "Texas"],
"35": ["John F. Kennedy", "Massachusetts"],
"36": ["Lyndon B. Johnson", "Texas"],
"37": ["Richard Nixon", "California"],
"38": ["Gerald Ford", "Nebraska"],
"39": ["Jimmy Carter", "Georgia"],
"40": ["Ronald Reagan", "Illinois"],
"41": ["George H. W. Bush", "Massachusetts"],
"42": ["Bill Clinton", "Arkansas"],
"43": ["George W. Bush", "Connecticut"],
"44": ["Barack Obama", "Hawaii"],
"45": ["Donald Trump", "New York"],
"46": ["Joe Biden", "Pennsylvania"]
}
# Open a new CSV file in write mode
with open("presidents.csv", "w", newline='') as csv_file:
# Specify the fieldnames for the columns
fieldnames = ["Number", "Name", "State of Birth"]
# Create a writer object
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
# Write the header row
writer.writeheader()
# Loop through the presidents dictionary
for key, value in presidents.items():
# Write the data for each president to the CSV file
writer.writerow({
"Number": key,
"Name": value[0],
"State of Birth": value[1]
})
# Print a success message
print("Data successfully stored in CSV file.")
La sortie obtenue ressemblera à ceci :
Data successfully stored in CSV file.