Découvrez comment récupérer des tableaux HTML avec Golang
Andrei Ogiolan le 24 avril 2023

Introduction
Le web scraping est une technique d'extraction de données à partir de sites web et peut être un outil puissant pour collecter des informations sur Internet. Cet article explique comment récupérer des tableaux HTML avec Golang, un langage de programmation populaire connu pour sa simplicité, son support de la concurrence et sa bibliothèque standard robuste.
Qu'est-ce qu'un tableau HTML ?
HTML tables are a type of element in HTML (Hypertext Markup Language) that is used to represent tabular data on a web page. An HTML table consists of rows and columns of cells containing text, images, or other HTML elements. HTML tables are created using the table element, and are structured using the ‘<tr>’ (table row),‘<td>’ (table cell), ‘<th>’ (table header), ‘<caption>’, ‘<col>’, ‘<colgroup>’, ‘<tbody>’ (table body), ‘<thead>’ (table head) and ‘<tfoot>’ (table foot) elements. Now let’s go through each one and get into more detail:
- élément table : Définit le début et la fin d'un tableau HTML.
- L'élément tr (table row) : Définit une ligne dans un tableau HTML.
- Élément td (cellule de tableau) : Définit une cellule dans un tableau HTML.
- th (en-tête de tableau) : Définit une cellule d'en-tête dans un tableau HTML. Les cellules d'en-tête sont affichées en gras et centrées par défaut et sont utilisées pour étiqueter les lignes ou les colonnes du tableau.
- l'élément caption : Définit une légende ou un titre pour un tableau HTML. La légende est généralement affichée au-dessus ou au-dessous du tableau.
- Les éléments col et colgroup : Définissent les propriétés des colonnes d'un tableau HTML, telles que la largeur ou l'alignement.
- tbody, thead et tfoot : Définissent respectivement les sections "body", "head" et "foot" d'un tableau HTML. Ces éléments peuvent être utilisés pour regrouper des lignes et appliquer des styles ou des attributs à une section spécifique du tableau.
Pour mieux comprendre ce concept, voyons à quoi ressemble un tableau HTML :

À première vue, il semble s'agir d'un tableau normal et nous ne pouvons pas voir la structure avec les éléments décrits ci-dessus. Cela ne signifie pas qu'ils ne sont pas présents, mais que le navigateur les a déjà analysés pour nous. Pour pouvoir voir la structure HTML, il faut aller plus loin et utiliser les outils de développement. Vous pouvez le faire en faisant un clic droit sur la page, en cliquant sur inspect, en cliquant sur select element tool, et en cliquant sur l'élément (tableau dans ce cas) dont vous voulez voir la structure HTML. Après avoir suivi ces étapes, vous devriez voir quelque chose comme ceci :

Les tableaux HTML sont couramment utilisés pour présenter des données dans un format structuré et tabulaire, par exemple pour compiler des résultats ou afficher le contenu d'une base de données. On les trouve sur un grand nombre de sites web et ils constituent un élément important à prendre en compte lors de l'extraction de données sur le web.
Mise en place
Avant de commencer le scraping, nous devons configurer notre environnement Golang et installer les dépendances nécessaires. Assurez-vous que Golang est installé et configuré sur votre système, puis créez un nouveau répertoire de projet et initialisez un fichier `go.mod`:
$ mkdir scraping-project
$ cd scraping-project
$ go mod init <NAME-OF-YOUR-PROJECT>
$ touch main.go
Ensuite, nous devons installer une bibliothèque pour faire des requêtes HTTP et analyser le HTML. Plusieurs options sont disponibles, mais pour cet article, nous utiliserons le paquet `net/http` de la bibliothèque standard et le paquet golang.org/x/net/html pour l'analyse du code HTML. Ces paquets peuvent être installés en exécutant la commande suivante :
$ go get -u net/http golang.org/x/net/html
Maintenant que notre environnement est configuré, nous sommes prêts à construire notre table scraper HTML en utilisant Golang.
Commençons à gratter
Maintenant que notre environnement est configuré, nous pouvons commencer à construire un scraper pour extraire des données d'un tableau HTML. La première étape est d'envoyer une requête HTTP à la page web qui contient la table HTML que nous voulons extraire. Nous pouvons utiliser la fonction `http.Get` du paquetage `net/http` pour envoyer une requête GET et récupérer le contenu HTML :
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
resp, err := http.Get("https://www.w3schools.com/html/html_tables.asp")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// Read the response body and convert it to a string
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
html := string(body)
fmt.Println(html)
}
Ensuite, nous pouvons utiliser la fonction `goquery.NewDocumentFromReader` du paquetage goquery pour analyser le contenu HTML et extraire les données dont nous avons besoin. Comme tout autre paquet Golang, vous devez d'abord l'installer comme suit :
$ go get github.com/PuerkitoBio/goquery
Ajoutez ensuite le code suivant qui analysera le code HTML de la page :
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
log.Fatal(err)
}
Maintenant que nous avons un analyseur et un extracteur d'éléments pour notre HTML, nous pouvons profiter de la fonctionnalité `doc.Find()` du paquet Goquery qui nous permet de trouver les éléments spécifiques que nous recherchons, dans ce cas, un tableau. Nous pouvons l'utiliser comme suit :
doc.Find("table").Each(func(i int, sel * goquery.Selection) {
// For sake of simplicity taking the first table of the page
if i == 0 {
// Looping through headers
headers: = sel.Find("th").Each(func(_ int, sel * goquery.Selection) {
if sel != nil {
fmt.Print(sel.Text())
fmt.Print(" ")
}
})
fmt.Println()
// Looping through cells
sel.Find("td").Each(func(index int, sel * goquery.Selection) {
if sel != nil {
fmt.Print(sel.Text())
fmt.Print(" ")
}
// Printing columns nicely
if (index + 1) % headers.Size() == 0 {
fmt.Println()
}
})
}
})
C'est tout, vous êtes maintenant en mesure de récupérer la table en utilisant Golang et vous devriez être en mesure de la voir à l'écran comme ceci :

Comme vous pouvez le constater, la structure peut être assez confuse et difficile à lire. La bonne nouvelle est que vous pouvez faire mieux que cela et afficher les données dans un format tabulaire facile à lire. C'est une tâche parfaite pour le paquetage tablewriter que vous pouvez installer comme suit :
$ go get github.com/olekukonko/tablewriter
Nous devons maintenant apporter quelques ajustements à notre code avant de transmettre nos informations à un tablewriter, notamment en définissant les en-têtes de table, les structures et en les stockant dans un tableau. Cela devrait ressembler à ceci :
package main
import (
"log"
"net/http"
"os"
"github.com/PuerkitoBio/goquery"
"github.com/olekukonko/tablewriter"
)
type Company struct {
Company string
Contact string
Country string
}
func main() {
resp, err := http.Get("https://www.w3schools.com/html/html_tables.asp")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// Read the response body and convert it to a string
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
log.Fatal(err)
}
var companies []Company
doc.Find("table").Each(func(i int, sel *goquery.Selection) {
if i == 0 {
e := Company{}
sel.Find("td").Each(func(index int, sel *goquery.Selection) {
if index%3 == 0 {
e.Company = sel.Text()
}
if index%3 == 1 {
e.Contact = sel.Text()
}
if index%3 == 2 {
e.Country = sel.Text()
}
// Add the element to our array
if index != 0 && (index+1)%3 == 0 {
companies = append(companies, e)
}
})
}
})
table := tablewriter.NewWriter(os.Stdout)
// Setting our headers
table.SetHeader([]string{"Company", "Contact", "Country"})
for _, Company := range companies {
s := []string{
Company.Company,
Company.Contact,
Company.Country,
}
table.Append(s)
}
table.Render()
}
Vous devriez maintenant être en mesure de voir les données affichées dans ce format :

A ce stade, vous avez réussi à construire un scraper en Golang qui scrape une page web, et qui stocke et affiche les données de manière agréable. Vous pouvez également modifier le code pour récupérer un tableau sur un autre site web. Gardez à l'esprit que tous les sites web ne sont pas aussi faciles à pirater. Beaucoup d'entre eux ont mis en place des mesures de protection de haut niveau conçues pour empêcher le scraping, comme le CAPTCHA et le blocage des adresses IP, mais heureusement il existe des services tiers comme WebScrapingAPI qui offrent la rotation des adresses IP et le contournement du CAPTCHA, ce qui vous permet de scraper ces cibles.
Plongée en profondeur
Bien que la technique que nous avons décrite jusqu'à présent soit suffisante pour les tableaux HTML simples, elle peut être améliorée de plusieurs façons.
Un problème potentiel est que la structure du tableau HTML peut ne pas être cohérente sur toutes les pages web. Par exemple, le tableau peut avoir un nombre différent de colonnes ou les données peuvent être imbriquées dans différents éléments HTML. Pour traiter ces cas, vous pouvez utiliser des techniques plus avancées telles que les sélecteurs CSS ou les expressions XPath pour localiser les données que vous souhaitez extraire.
Un autre problème est que les pages web utilisent souvent AJAX ou d'autres technologies côté client pour charger des données supplémentaires dans la page après son chargement dans le navigateur. Cela signifie que le tableau HTML que vous récupérez peut ne pas contenir toutes les données dont vous avez besoin. Pour récupérer ce type de pages, vous devrez peut-être utiliser un outil tel qu'un navigateur sans tête, qui peut exécuter du JavaScript et rendre la page comme un navigateur web normal. Une bonne alternative à cela est d'utiliser notre scraper qui peut renvoyer les données après que JavaScript a été rendu sur la page. Pour en savoir plus, consultez notre documentation.
Enfin, il est important de tenir compte des performances et de l'évolutivité de votre scraper. Si vous scrapez de grandes tables ou plusieurs pages, vous devrez peut-être utiliser des techniques telles que la concurrence ou la limitation de débit pour vous assurer que votre scraper peut supporter la charge.
Résumé
J'espère que vous avez trouvé dans cette ressource un bon point de départ pour le scraping de tableaux HTML avec Golang. Nous avons parcouru le processus de récupération de données à partir d'un tableau HTML en utilisant le langage de programmation Go. Nous avons vu comment récupérer le contenu HTML d'une page web, l'imprimer sur l'écran et l'afficher dans un format tabulaire lisible à l'œil nu. Nous avons également abordé certains des défis que vous pouvez rencontrer lors de l'extraction de tableaux HTML, notamment les structures de tableau incohérentes, le chargement de données côté client et les problèmes de performance et d'évolutivité.
Bien qu'il soit possible de créer son propre scraper en utilisant les techniques décrites dans cet article, il est souvent plus efficace et plus fiable de faire appel à un service de scraping professionnel. Ces services disposent de l'infrastructure, de l'expertise et des mesures de sécurité nécessaires pour gérer de grands volumes de données et des tâches de scraping complexes, et peuvent souvent fournir des données dans un format plus structuré et plus pratique, tel que CSV ou JSON.
En résumé, le scraping de tableaux HTML peut être un moyen utile d'extraire des données du web, mais il est important d'examiner attentivement les compromis entre la construction de son propre scraper et l'utilisation d'un service professionnel.
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Apprenez à utiliser les proxys avec Axios et Node.js pour un web scraping efficace. Conseils, exemples de code et avantages de l'utilisation de WebScrapingAPI inclus.


Découvrez 3 façons de télécharger des fichiers avec Puppeteer et construisez un scraper web qui fait exactement cela.


Apprenez à récupérer des tables JavaScript en utilisant Python. Extraire des données de sites web, les stocker et les manipuler en utilisant Pandas. Améliorer l'efficacité et la fiabilité du processus de scraping.
