Le guide ultime sur la façon de commencer à faire du Web Scraping avec Go

Sorin-Gabriel Marica le 14 octobre 2022

Le web scraping avec Go est un excellent moyen de créer un scraper rapide et puissant. En effet, GoLang est l'un des meilleurs langages de programmation pour la concurrence. Mais avant d'entrer dans le vif du sujet, je dois d'abord vous expliquer ce qu'est le web scraping et comment il peut vous aider.

Le web scraping est le processus d'extraction de données à partir de sites web. Ce processus peut être réalisé manuellement, mais cette approche n'est pas recommandée lorsqu'il s'agit de traiter un grand nombre de données. Dans cet article, nous allons voir comment vous pouvez créer votre propre scraper web automatisé à partir de zéro avec Go.

Si vous êtes novice en la matière, vous vous demandez peut-être quels sont les cas d'utilisation du Web Scraping. Voici une petite liste des cas les plus courants :

  1. Outils de comparaison de prix - Vous pouvez créer de nombreux outils à l'aide d'un scraper web. L'un des plus courants et des plus utiles est un outil de comparaison de prix. Ce type d'outil récupère les prix d'un produit auprès de plusieurs sources et affiche la meilleure offre possible.
  2. Apprentissage automatique - Si vous souhaitez construire un modèle à l'aide de l'apprentissage automatique, vous aurez besoin d'un ensemble de données d'entraînement. Bien que vous puissiez parfois trouver des ensembles de données existants que vous pouvez utiliser, vous devrez souvent faire un travail supplémentaire et obtenir les données dont vous avez besoin vous-même.
  3. Études de marché - Un troisième cas d'utilisation est la récupération d'informations sur l'internet pour découvrir qui sont vos concurrents et ce qu'ils font. Vous pouvez ainsi suivre ou devancer vos concurrents, en étant au courant de toute nouvelle fonctionnalité qu'ils pourraient avoir ajoutée.

De quoi avez-vous besoin pour récupérer des données avec go ?

Avant de commencer, vous devez être en mesure d'exécuter du code GoLang sur votre machine. Pour cela, il vous suffit d'installer Go, si ce n'est pas déjà fait. Vous pouvez trouver plus de détails sur la façon d'installer Go, et sur la façon de vérifier si vous l'avez installé ici.

L'autre chose dont vous aurez besoin est un IDE ou un éditeur de texte de votre choix pour écrire le code. Je préfère utiliser Visual Studio Code, mais n'hésitez pas à utiliser ce qui vous convient.

Et c'est tout. Plutôt simple, non ? Plongeons maintenant dans le sujet principal de cet article, le web scraping avec go.

Construire un scraper web en utilisant Go

Pour construire notre scraper, nous avons d'abord besoin d'un objectif, d'un ensemble de données que nous voulons collecter à partir d'une source spécifique. Ainsi, comme sujet pour notre scraper, j'ai choisi de récupérer les téléchargements hebdomadaires des premiers paquets de npmjs.com qui utilisent le mot-clé "framework". Vous pouvez les trouver sur cette page : https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal)

Inspectez le contenu de la page que vous souhaitez récupérer.

Pour faire du scraping correctement, avant de commencer à extraire les données, vous devez savoir où se trouvent les données. Je veux dire par là que vous devrez construire les sélecteurs HTML pour interroger les données, sur la base de la structure HTML de la page.

Pour voir la structure HTML de la page, vous pouvez utiliser les outils de développement disponibles dans la plupart des navigateurs modernes. Dans Chrome, vous pouvez le faire sur la page en faisant un clic droit sur l'élément que vous voulez extraire et en cliquant sur "Inspecter la page". Une fois que vous avez fait cela, vous verrez quelque chose comme ceci :

blog-image

Sur la base du code HTML que vous pouvez voir à droite (la fenêtre d'inspection), nous pouvons maintenant construire les sélecteurs que nous utiliserons. À partir de cette page, nous n'avons besoin que des URL de chacun des paquets.

By looking over the HTML, we can see that the css classes used by the website are code generated. This makes them not reliable for scraping so we will use the html tags instead. On the page we can see that the packages are  in <section> tags and that the link to the package is in the first div from the first div of the section.

Knowing this we can build the following selector to extract the links of all the packages: section > div:first-child > div:first-child a. Before trying it in code, we can test the selector from the developer tools of the browser. To do this go to the console tab and run document.querySelectorAll("{{ SELECTOR }}"):

blog-image

En survolant chacun des éléments de la liste de nœuds renvoyés, nous pouvons voir qu'ils sont exactement ceux que nous recherchions, et nous pouvons donc utiliser ce sélecteur.

Scraping d'une page avec Go

Nous commençons enfin à construire le scraper ! Pour ce faire, vous devez d'abord créer un dossier dans lequel nous mettrons tout notre code. Ensuite, vous devez ouvrir une fenêtre de terminal, soit à partir de votre IDE, soit à partir de votre système d'exploitation et aller dans notre dossier.

Pour ouvrir un terminal dans le dossier, en utilisant Visual Studio Code, vous pouvez cliquer sur Terminal -> New Terminal (dans la barre supérieure).

blog-image

Maintenant que notre terminal est ouvert, il est temps d'initialiser le projet. Vous pouvez le faire en lançant la commande :

go mod init webscrapingapi.com/my-go-scraper

Cela créera dans votre dossier un fichier appelé go.mod avec le contenu suivant :

module webscrapingapi.com/my-go-scraper
go 1.19

Pour faire la requête à la page et extraire les sélecteurs du HTML, nous allons utiliser Colly, un paquetage GoLang(voir la documentation de Colly pour plus d'informations). Pour installer ce paquetage, vous devez exécuter

aller chercher github.com/gocolly/colly

Maintenant que tout est prêt, il ne nous reste plus qu'à créer notre fichier main.go et à écrire du code. Le code pour extraire tous les liens de la première page des frameworks npmjs est le suivant :

package main

import (
"fmt"
"github.com/gocolly/colly"
)

func scrape() {
c := colly.NewCollector()

// Find and print all links
c.OnHTML("section > div:first-child > div:first-child a", func(e *colly.HTMLElement) {
fmt.Println(e.Attr("href"))
})
c.Visit("https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal")
}

func main() {
scrape()
}

Si cela vous semble difficile à lire au premier abord, ne vous inquiétez pas, nous allons le décomposer dans les paragraphes suivants et l'expliquer. 

Chaque fichier golang doit commencer par le nom du paquetage et les importations que Go va utiliser. Dans ce cas, les deux paquets que nous utilisons sont "fmt" pour imprimer les liens que nous scrappons, et "Colly" (pour le scrappage proprement dit).

Dans la partie suivante, nous avons créé la fonction scrape() qui se charge de récupérer les liens dont nous avons besoin. Pour ce faire, la fonction visite la première page et attend de trouver le sélecteur que nous avons choisi. Lorsqu'un élément de ce sélecteur apparaît, elle imprime l'attribut href de cet élément.

La dernière partie est la fonction main qui est la fonction qui est appelée à chaque fois que nous lançons un script golang. Pour exécuter le code précédent, lancez le fichier main.go depuis votre terminal, et vous devriez obtenir la sortie suivante :

blog-image

Comme vous pouvez le voir, l'attribut href a des chemins relatifs vers les liens, nous devrons donc le préfixer avec l'url de npmjs.

Utiliser la concurrence de GoLang pour plus d'efficacité

Les GoRoutines constituent l'une des fonctionnalités les plus intéressantes de GoLang. Les GoRoutines sont de simples threads légers gérés par le runtime Go. Ce qui est génial, c'est que Go peut nous aider à scraper plusieurs urls en même temps à une vitesse fulgurante.

Auparavant, nous avons extrait les liens pour les 20 premiers paquets sous le mot-clé "framework" sur npmjs.com. Maintenant, nous allons essayer de récupérer tous ces liens en même temps et d'extraire les téléchargements hebdomadaires pour chacun d'entre eux. Pour ce faire, nous allons utiliser GoRoutines et WaitGroups.

Voici le code final pour extraire les téléchargements hebdomadaires en utilisant les goroutines :

package main

import (
"fmt"
"github.com/gocolly/colly"
"sync"
)

func scrapeWeeklyDownloads(url string, wg *sync.WaitGroup) {
defer wg.Done()

c := colly.NewCollector()

// Find and print the weekly downloads value
c.OnHTML("main > div > div:last-child > div:not([class]) p", func(e *colly.HTMLElement) {
fmt.Println(fmt.Sprintf("%s - %s", url, e.Text))
})
c.Visit(url)
}

func scrape() {
c := colly.NewCollector()

var wg sync.WaitGroup

// Find and print all links
c.OnHTML("section > div:first-child > div:first-child a", func(e *colly.HTMLElement) {
wg.Add(1)
go scrapeWeeklyDownloads(fmt.Sprintf("%s%s", "https://www.npmjs.com", e.Attr("href")), &wg)
})
c.Visit("https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal")

wg.Wait()
}

func main() {
scrape()
}

Voyons maintenant ce qui a été ajouté à notre code précédent. Tout d'abord, vous remarquerez que nous avons importé un nouveau paquetage appelé "sync". Cela nous aidera à utiliser les routines golang et à attendre que les threads se terminent, avant d'arrêter l'exécution du programme.

La prochaine chose ajoutée est la nouvelle fonction appelée "scrapeWeeklyDownloads". Cette fonction accepte deux paramètres : l'url du lien que nous allons récupérer et un pointeur WaitGroup. Cette fonction visite l'url donnée et extrait les téléchargements hebdomadaires (en utilisant le sélecteur main > div > div:last-child > div:not([class]) p).

Les derniers changements que vous remarquerez sont dans la fonction scrape où nous avons créé un WaitGroup en utilisant var wg sync.WaitGroup. Ici, pour chaque lien de la page des paquets, nous avons utilisé wg.Add(1) puis créé une GoRoutine qui appelle la fonction scrapeWeeklyDownloads. À la fin de la fonction, l'instruction wg.Wait() fait attendre le code jusqu'à ce que toutes les GoRoutines aient fini de s'exécuter. 

Pour plus d'informations sur les WaitGroups, veuillez consulter cet exemple de golang

Pourquoi les GoRoutines et les WaitGroups ?

En utilisant la concurrence dans golang avec GoRoutines et WaitGroups, nous pouvons créer un scraper très rapide. L'exécution de l'exemple de code précédent renverra la page et les téléchargements hebdomadaires de chaque paquet. Mais, parce que nous utilisons le multi threading, l'ordre dans lequel ces informations seront affichées est inconnu (car les threads s'exécutent à des vitesses différentes).

Si vous exécutez le code sous linux ou windows subsystem linux (wsl), vous pouvez utiliser time go run main.go pour voir le temps d'exécution de l'ensemble du script. Pour moi, le temps d'exécution est d'environ 5 à 6 secondes. C'est très rapide, étant donné que nous scrappons 21 pages (d'abord la page avec les paquets et ensuite les pages de chacun des paquets).

Autres obstacles

La plupart des scrapers comptent sur une simple requête HTTP pour obtenir le contenu dont ils ont besoin. Cette solution est bonne, mais il arrive que les sites web affichent leurs informations par le biais d'un rendu javascript. Cela signifie que le site web ne vous montrera d'abord qu'une partie de son contenu, le reste étant chargé dynamiquement par javascript.

Pour récupérer de telles pages, vous devrez utiliser chromedriver et contrôler un vrai navigateur chrome. Bien qu'il y ait quelques options pour faire cela dans Golang, vous aurez besoin de faire quelques recherches supplémentaires pour ce sujet.

Même si le rendu javascript est couvert, il reste encore quelques obstacles supplémentaires lors du scraping d'un site web. Certains sites web peuvent utiliser des détections anti-bots, des blocages d'adresses IP ou des captchas pour empêcher les bots de gratter leur contenu. Pour continuer à scraper ces sites web, vous pouvez essayer d'utiliser quelques trucs et astuces pour le web scraping, comme rendre votre scraper plus lent et agir de manière plus humaine.

Mais si vous voulez que votre scraper soit rapide et que vous puissiez surmonter ces obstacles de manière simple, vous pouvez utiliser WebScrapingAPI. WebScrapingAPI est une API conçue pour vous aider à scraper en faisant tourner votre IP et en évitant les détections d'antibots. De cette façon, vous pouvez continuer à utiliser la vitesse fulgurante que GoLang fournit et scraper vos données en un rien de temps.

Conclusion sur le Web Scraping avec Go

Le Web Scraping est un moyen simple et rapide d'extraire des données d'Internet, et il peut être utilisé pour de nombreux cas d'utilisation différents. Vous pouvez choisir d'extraire des données pour votre modèle d'apprentissage automatique ou de construire une application à partir de zéro en utilisant les données que vous avez récupérées.

GoLang est l'une des meilleures solutions en matière de concurrence. En utilisant GoLang et Colly, vous pouvez construire un scraper rapide qui vous apportera vos données en un rien de temps. Cela rend le web scraping avec Go très facile et efficace une fois que l'on s'est habitué à la syntaxe de Go.

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

vignette
Cas d'utilisationXPath et les sélecteurs CSS

Les sélecteurs XPath sont-ils meilleurs que les sélecteurs CSS pour le web scraping ? Découvrez les points forts et les limites de chaque méthode et faites le bon choix pour votre projet !

Mihai Maxim
avatar de l'auteur
Mihai Maxim
8 minutes de lecture
vignette
GuidesDécouvrez comment récupérer des tableaux HTML avec Golang

Apprenez à scraper des tableaux HTML avec Golang pour une extraction de données puissante. Explorez la structure des tableaux HTML et construisez un scraper web en utilisant la simplicité, la concurrence et la bibliothèque standard robuste de Golang.

Andrei Ogiolan
avatar de l'auteur
Andrei Ogiolan
8 minutes de lecture
vignette
GuidesComment utiliser un proxy avec Node Fetch et construire un scraper web

Apprenez à utiliser les proxys avec node-fetch, un client HTTP JavaScript populaire, pour construire des scrapeurs web. Comprendre comment les proxys fonctionnent dans le web scraping, intégrer les proxys avec node-fetch, et construire un web scraper avec le support des proxys.

Mihnea-Octavian Manolache
avatar de l'auteur
Mihnea-Octavian Manolache
8 minutes de lecture