Maison > Article > développement back-end > Comment écrire un robot d'exploration Golang
Golang est un langage de programmation moderne adapté à l'écriture de robots d'exploration Web efficaces et simultanés. La fonctionnalité de haute concurrence de Golang peut considérablement accélérer l'exploration, et sa syntaxe est concise et facile à apprendre et à comprendre. Cet article présentera en détail comment écrire un robot d'exploration Web simple à l'aide de Golang.
Tout d'abord, vous devez installer Golang. Vous pouvez télécharger et installer les fichiers binaires du système d'exploitation correspondant depuis le site officiel (https://golang.org/dl/). Après l'installation, vous devez définir des variables d'environnement. Sous Linux et Mac, vous pouvez modifier le fichier ~/.bashrc et ajouter ce qui suit à la fin du fichier :
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Sous Windows, vous pouvez modifier les variables d'environnement et ajouter GOPATH aux variables d'environnement, et ajouter %GOPATH% au PATH.
Dans Golang 1.13 et supérieur, Go Modules est officiellement reconnu comme l'outil officiel de gestion des dépendances. Nous pouvons l'utiliser pour gérer les dépendances de nos projets. Accédez au répertoire racine du projet et exécutez la commande suivante :
go mod init spider
créera un fichier go.mod, qui contient des informations sur le projet spider.
L'écriture d'un client HTTP nécessite l'utilisation du package net/http fourni avec Golang. Ce package implémente tous les détails du protocole HTTP, y compris l'analyse des requêtes et des réponses HTTP.
Tout d'abord, nous créons un nouveau client HTTP :
func newHTTPClient(timeout time.Duration) *http.Client {
return &http.Client{ Timeout: timeout, }
}
Nous pouvons utiliser ce client pour envoyer des requêtes HTTP GET :
func fetch( url string ) (chaîne, erreur) {
client := newHTTPClient(time.Second * 5) resp, err := client.Get(url) if err != nil { return "", err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status) } bodyBytes, _ := ioutil.ReadAll(resp.Body) return string(bodyBytes), nil
}
La fonction de récupération renverra le contenu de la page Web demandée et les éventuelles erreurs. Nous utilisons le mot-clé defer pour garantir que le corps de la réponse est fermé au retour de la fonction.
Une fois que nous avons réussi à obtenir le code source de la page Web, nous devons analyser le code HTML pour obtenir les informations requises. Nous pouvons utiliser les packages standards du langage Go html/template (modèle HTML) et html/parse (analyseur HTML).
func parse(htmlContent string) {
doc, err := html.Parse(strings.NewReader(htmlContent)) if err != nil { log.Fatal(err) } // Do something with doc...
}
Nous pouvons utiliser la fonction html.Parse pour analyser le code source HTML et le renvoyer sous forme d'arborescence. Nous pouvons obtenir les informations requises en parcourant récursivement cette structure arborescente.
Parfois, nous devons extraire des informations spécifiques du code source HTML, comme un lien URL ou un morceau de texte. Dans ce cas, nous pouvons utiliser des expressions régulières. Golang prend en charge très bien les expressions régulières et nous pouvons utiliser le package regexp pour implémenter les expressions régulières.
Par exemple, si nous devons extraire tous les liens d'une balise du code source HTML, nous pouvons utiliser le code suivant :
func extractLinks(htmlContent string) []string {
linkRegex := regexp.MustCompile(`href="(.*?)"`) matches := linkRegex.FindAllStringSubmatch(htmlContent, -1) var links []string for _, match := range matches { links = append(links, match[1]) } return links
}
regular expressionhref="(.*?)"
match all Liez et renvoyez un tableau de chaînes.
Ce qui suit est un code de robot d'exploration complet, qui obtient tous les liens de balise sur une page de site Web :
package main
import (
"fmt" "log" "net/http" "regexp" "strings" "time" "golang.org/x/net/html"
)
const (
url = "https://example.com"
)
func main() {
htmlContent, err := fetch(url) if err != nil { log.Fatal(err) } links := extractLinks(htmlContent) for _, link := range links { fmt.Println(link) }
}
func newHTTPClient(timeout time.Duration) *http.Client {
return &http.Client{ Timeout: timeout, }
}
func fetch(url string) (string, error) {
client := newHTTPClient(time.Second * 5) resp, err := client.Get(url) if err != nil { return "", err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status) } bodyBytes, _ := ioutil.ReadAll(resp.Body) return string(bodyBytes), nil
}
func extractLinks( htmlContent string) []string {
linkRegex := regexp.MustCompile(`href="(.*?)"`) matches := linkRegex.FindAllStringSubmatch(htmlContent, -1) var links []string for _, match := range matches { links = append(links, match[1]) } return links
}
func parse(htmlContent string) {
doc, err := html.Parse(strings.NewReader(htmlContent)) if err != nil { log.Fatal(err) } // Do something with doc...
}
Résumé
Utiliser Golang pour écrire des robots d'exploration Web peut grandement améliorer la vitesse d'exploration, et utiliser un langage puissant comme Golang To écrivez du code de robot d'exploration, vous pouvez obtenir une maintenabilité et une évolutivité plus élevées. Cet article décrit comment écrire un robot d'exploration simple à l'aide de Golang. J'espère que cet article pourra aider les lecteurs qui souhaitent apprendre les robots d'exploration Web, ainsi que les développeurs utilisant Golang.
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!