Objectif du programme
Accédez aux pages web en même temps pour extraire le titre de chaque page et afficher ces titres dans le terminal. Cela se fait grâce à la concurrence dans Go, qui vous permet d'accéder à plusieurs pages simultanément, ce qui vous fait gagner du temps.
Explication du Code
Forfaits utilisés
import (
"fmt"
"net/http"
"sync"
"github.com/PuerkitoBio/goquery"
)
fonction fetchTitle
Ce rôle est responsable de :
- Accéder à une page Web (url)
- Extraire le titre de la page
- Evnier le résultat sur une chaîne
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) {
defer wg.Done() // Marca a goroutine como concluída no WaitGroup
Paramètres de fonction :
-
chaîne d'url : Représente l'adresse de la page web (url) à laquelle nous allons accéder pour obtenir le titre
-
wg *sync.WaitGroup : pointeur vers un WaitGroup, que nous utilisons pour synchroniser l'achèvement de toutes les tâches (goroutines) qui s'exécutent en même temps. Le * indique que nous transmettons une "adresse" à WaitGroup` et non une copie de celle-ci.
-
results chan<- string : Il s'agit d'un canal unidirectionnel qui vous permet d'envoyer des chaînes à une autre partie du programme. Il permet de transmettre des résultats (titres ou messages d'erreur) à la fonction principale
La ligne defer wg.Done() indique au programme de marquer cette tâche (goroutine) comme terminée lorsque la fonction fetchTitle se termine. Ceci est important pour que le principal sache quand toutes les tâches sont terminées.
Requête HTTP
req, err := http.Get(url)
si erreur != nul {
résultats <- fmt.Sprintf("Erreur d'accès à %s : %v", url, err)
revenir
>
différer req.Body.Close()
-
http.Get(url) : Cette ligne effectue une requête HTTP GET à l'URL. Cela signifie que nous accédons à la page et demandons au serveur son contenu.
-
err != nil : Ici, nous vérifions s'il y a eu une erreur lors de l'accès à la page (par exemple, si la page n'existe pas ou si le serveur ne répond pas). S'il y a une erreur, nous envoyons un message au canal de résultats et terminons la fonction avec return.
-
defer req.Body.Close() : Cela garantit qu'une fois que nous avons fini d'utiliser le contenu de la page, nous libérons la mémoire allouée pour le stocker.
Vérification de l'état
si req.StatusCode != 200 {
résultats <- fmt.Sprintf("Erreur d'accès à %s : statut %d %s", url, req.StatusCode, req.Status)
revenir
>
-
req.StatusCode != 200 : On vérifie si le serveur a répondu avec le code 200 OK (indique le succès). Si ce n’est pas 200, cela signifie que la page ne s’est pas chargée correctement. Nous envoyons ensuite un message d'erreur au canal de résultats et terminons la fonction.
Chargement et recherche de titre
doc, err := goquery.NewDocumentFromReader(req.Body)
si erreur != nul {
résultats <- fmt.Sprintf("Erreur lors du chargement du document à partir de %s : %v", url, err)
revenir
>
titre := doc.Find("titre").Text()
résultats <- fmt.Sprintf("Titre de %s : %s", url, titre)
>
-
goquery.NewDocumentFromReader(req.Body) : Nous chargeons le contenu HTML de la page (fourni par req.Body) dans goquery, ce qui vous permet de naviguer et de rechercher des parties spécifiques du HTML.
-
doc.Find("title").Text() : On recherche la balise dans le HTML de la page et récupérez le texte à l'intérieur (c'est-à-dire le titre).
-
results <- fmt.Sprintf("Título de %s: %s", url, title) : Nous envoyons le titre extrait au canal des résultats, où il sera lu plus tard.
fonction principale
La fonction principale est la fonction principale qui configure et contrôle le programme.
func main() {
URL := []chaîne{
"http://olos.novagne.com.br/Olos/login.aspx?logout=true",
"http://sistema.novagne.com.br/novagne/",
>
-
urls := []string{...} : Nous définissons une liste d'URL que nous souhaitons traiter. Chaque URL sera transmise à une goroutine qui extraira le titre de la page.
Configuration du groupe d'attente et des canaux
var wg sync.WaitGroup
results := make(chan string, len(urls)) // Canal pour stocker les résultats
-
var wg sync.WaitGroup : Nous créons une nouvelle instance de WaitGroup, qui contrôlera le nombre de goroutines et garantira qu'elles se terminent toutes avant la fin du programme.
-
results := make(chan string, len(urls)) : Nous créons un canal de résultats d'une capacité égale au nombre d'URL. Ce canal stockera les messages avec des titres ou des erreurs.
La maison des Goroutines
pour _, url := plage d'URL {
wg.Add(1)
allez chercherTitle(url, &wg, résultats)
>
-
pour _, url := plage d'urls : Ici, nous parcourons chaque URL de la liste.
-
wg.Add(1) : Pour chaque URL, nous incrémentons le compteur WaitGroup pour indiquer qu'une nouvelle tâche (goroutine) va être démarrée.
-
go fetchTitle(url, &wg, results) : Nous appelons fetchTitle comme une goroutine pour chaque URL, c'est-à-dire que nous la faisons fonctionner en parallèle avec les autres.
Attente et affichage des résultats
wg.Attendez()
fermer(résultats)
REPO : https://github.com/ionnss/Scrapper-GoRoutine
ions,
un autre jour de la terre
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