Maison  >  Article  >  développement back-end  >  Comment écrire un robot d'exploration Golang

Comment écrire un robot d'exploration Golang

王林
王林original
2023-05-10 11:12:07624parcourir

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.

  1. Installer 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.

  1. Utilisez Go Modules pour gérer les dépendances

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.

  1. Créer un client HTTP

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.

  1. Analyser HTML

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.

  1. Utilisation d'expressions régulières

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.

  1. Code complet

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!

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
Article précédent:fonctions et méthodes golangArticle suivant:fonctions et méthodes golang