Maison >développement back-end >Tutoriel Python >Web scraping et analyse de données en langues étrangères

Web scraping et analyse de données en langues étrangères

Susan Sarandon
Susan Sarandonoriginal
2024-12-24 11:40:14949parcourir

Récemment, j'ai décidé que j'aimerais réaliser un projet rapide de web scraping et d'analyse de données. Parce que mon cerveau aime proposer de grandes idées qui prendraient beaucoup de temps, j'ai décidé de me mettre au défi de trouver quelque chose de simple qui pourrait être réalisé de manière viable en quelques heures.

Voici ce que j'ai trouvé :

Comme mon diplôme de premier cycle était à l'origine en langues étrangères (français et espagnol), j'ai pensé que ce serait amusant de récupérer sur le Web certaines données liées aux langues. Je voulais utiliser la bibliothèque BeautifulSoup, qui peut analyser du HTML statique mais n'est pas capable de gérer des pages Web dynamiques qui ont besoin d'événements onclick pour révéler l'ensemble de données (c'est-à-dire en cliquant sur la page de données suivante si la page est paginée).

J'ai opté pour cette page Wikipédia des langues les plus parlées.

Web scraping and analysing foreign languages data

Je voulais faire ce qui suit :

  • Obtenir le code HTML de la page et le sortir dans un fichier .txt
  • Utilisez Beautiful Soup pour analyser le fichier HTML et extraire les données du tableau
  • Écrivez le tableau dans un fichier .csv
  • Proposez 10 questions auxquelles je voulais répondre pour cet ensemble de données en utilisant l'analyse des données
  • Répondez à ces questions en utilisant des pandas et un carnet Jupyter

J'ai décidé de diviser le projet en ces étapes pour séparer les préoccupations, mais je voulais aussi éviter de faire plusieurs requêtes inutiles pour obtenir le code HTML de Wikipédia en réexécutant le script. Enregistrer le fichier HTML, puis travailler avec lui dans un script séparé signifie que vous n'avez pas besoin de demander à nouveau les données, car vous les avez déjà.

Lien du projet

Le lien vers mon dépôt github pour ce projet est : https://github.com/gabrielrowan/Foreign-Languages-Analysis

Obtenir le HTML

Tout d’abord, j’ai récupéré et affiché le code HTML. Après avoir travaillé avec C# et C, c'est toujours une nouveauté pour moi de voir à quel point le code Python est court et concis ?

url = 'https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers'

response = requests.get(url)
html = response.text

with open("languages_html.txt", "w", encoding="utf-8") as file:
    file.write(html)

Analyser le HTML

Pour analyser le html avec Beautiful soup et sélectionner la table qui m'intéressait, j'ai fait :

with open("languages_html.txt", "r", encoding="utf-8") as file:
    soup = BeautifulSoup(file, 'html.parser')

# get table
top_languages_table = soup.select_one('.wikitable.sortable.static-row-numbers')


Ensuite, j'ai obtenu le texte d'en-tête du tableau pour obtenir les noms de colonnes de mon dataframe pandas :

# get column names
columns = top_languages_table.find_all("th")
column_titles = [column.text.strip() for column in columns]

Après cela, j'ai créé le dataframe, défini les noms des colonnes, récupéré chaque ligne du tableau et écrit chaque ligne dans le dataframe :

# get table rows
table_data = top_languages_table.find_all("tr")

# define dataframe
df = pd.DataFrame(columns=column_titles)

# get table data
for row in table_data[1:]:
    row_data = row.find_all('td')
    row_data_txt = [row.text.strip() for row in row_data]
    print(row_data_txt)
    df.loc[len(df)] = row_data_txt 


Remarque : sans utiliser strip(), il y avait n caractères dans le texte qui n'étaient pas nécessaires.

Enfin, j'ai écrit le dataframe dans un .csv.

Analyser les données

À l'avance, je me posais ces questions auxquelles je voulais répondre à partir des données :

  1. Quel est le nombre total de locuteurs natifs dans toutes les langues de l'ensemble de données ?
  2. Combien de types différents de familles linguistiques existe-t-il ?
  3. Quel est le nombre total de locuteurs natifs par famille linguistique ?
  4. Quelles sont les 3 familles de langues les plus courantes ?
  5. Créez un diagramme circulaire montrant les 3 familles de langues les plus courantes
  6. Quelle est la famille de langues - paire de branches la plus courante ?
  7. Quelles sont les langues sino-tibétaines dans le tableau ?
  8. Afficher un graphique à barres des locuteurs natifs de toutes les langues romanes et germaniques
  9. Quel pourcentage du total de locuteurs natifs est représenté par les 5 principales langues ?
  10. Quelle branche compte le plus de locuteurs natifs, et laquelle en compte le moins ?

Les résultats

Bien que je n'entrerai pas dans le code pour répondre à toutes ces questions, j'aborderai les 2 celles qui impliquaient des graphiques.

Afficher un graphique à barres des locuteurs natifs de toutes les langues romanes et germaniques

Tout d'abord, j'ai créé un dataframe qui n'incluait que les lignes où le nom de la branche était « Romance » ou « Germanic »

url = 'https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers'

response = requests.get(url)
html = response.text

with open("languages_html.txt", "w", encoding="utf-8") as file:
    file.write(html)

Ensuite j'ai précisé l'axe x, l'axe y et la couleur des barres que je voulais pour le graphique :

with open("languages_html.txt", "r", encoding="utf-8") as file:
    soup = BeautifulSoup(file, 'html.parser')

# get table
top_languages_table = soup.select_one('.wikitable.sortable.static-row-numbers')


Cela a créé :

Web scraping and analysing foreign languages data

Créez un diagramme circulaire montrant les 3 familles de langues les plus courantes

Pour créer le diagramme circulaire, j'ai récupéré les 3 familles de langues les plus courantes et les ai placées dans un dataframe.

Ce groupe de codes obtient la somme totale des locuteurs natifs par famille de langues, les trie par ordre décroissant et extrait les 3 premières entrées.

# get column names
columns = top_languages_table.find_all("th")
column_titles = [column.text.strip() for column in columns]

Ensuite, je place les données dans un graphique à secteurs, en spécifiant l'axe Y des « locuteurs natifs » et une légende, qui crée des étiquettes à code couleur pour chaque famille de langues affichée dans le graphique.

# get table rows
table_data = top_languages_table.find_all("tr")

# define dataframe
df = pd.DataFrame(columns=column_titles)

# get table data
for row in table_data[1:]:
    row_data = row.find_all('td')
    row_data_txt = [row.text.strip() for row in row_data]
    print(row_data_txt)
    df.loc[len(df)] = row_data_txt 


Web scraping and analysing foreign languages data

Le code et les réponses pour le reste des questions peuvent être trouvés ici. J'ai utilisé le markdown dans le cahier pour écrire les questions et leurs réponses.

La prochaine fois:

Pour ma prochaine itération d'un projet de web scraping et d'analyse de données, j'aimerais compliquer les choses avec :

  • Web scraping d'une page dynamique où plus de données sont révélées en cliquant/défilement
  • Analyser un ensemble de données beaucoup plus volumineux, qui nécessite potentiellement un travail de nettoyage des données avant l'analyse

Web scraping and analysing foreign languages data

Réflexions finales

Même si cela a été rapide, j'ai aimé réaliser ce projet. Cela m'a rappelé à quel point des projets courts et gérables peuvent être utiles pour attirer les représentants du cabinet ? De plus, extraire des données d'Internet et créer des graphiques à partir de celles-ci, même avec un petit ensemble de données, est-il amusant ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn