Un collecteur (ou crawler) est un logiciel qui explore automatiquement le Web. Souvent dans le but d'indexer les ressources qu'il trouve dans un moteur de recherche. Il peut être également intéressant de développer un crawler afin de vérifier qu'un site respecte des règles de contenu (style, règles éditoriales...) ou qu'il ne contienne pas d'erreurs (URL introuvable, parties manquantes, etc.). Dans cet article, nous verrons comment en développer ce type de vérificateur à l'aide de la bibliothèque tierce gocrawl.
Nous allons développer un vérificateur qui a pour but de valider un site avec les règles suivantes, pour toutes les pages web analysées :
Notre crawler sera lancé via la ligne de commande et indiquera les erreurs rencontrées au fil de son analyse.
La bibliothèque tierce gocrawl permet de créer le mécanisme de recherche récursive à partir d'une URL (le crawler), mais également des fonctions permettant d'examiner le contenu récupéré. Elle s'appuie pour cela sur les bibliothèques tierces suivantes :
Durant l'analyse du contenu, on pourrait aussi s'appuyer sur la bibliothèque go standard (tels que les paquets net/http, net/url ou regexp).
Le gestionnaire de paquet intégré à Go récupèrera toutes les dépendances à l'aide des commandes d'installation et de compilation suivantes :
go get github.com/PuerkitoBio/gocrawl go install github.com/PuerkitoBio/gocrawl
Voici le code complet de notre vérificateur de site :
package main import ( "github.com/PuerkitoBio/gocrawl" "github.com/PuerkitoBio/goquery" "net/http" "time" "fmt" ) type goCrawlExtender struct { gocrawl.DefaultExtender } func (this *goCrawlExtender) Visit(ctx *gocrawl.URLContext, res *http.Response, doc *goquery.Document) (interface{}, bool) { fmt.Printf("url : %s\n", ctx.URL().String()) if val, ok := doc.Find("meta[name='description']").Attr("content"); !ok { fmt.Println("Pas de description ") } else { if val == "" { fmt.Println("Balise META description présente, mais champ vide") } else { fmt.Printf("description : %s\n", val) } } if len(doc.Find("h1").Nodes) == 0 { fmt.Println("Pas de H1") } else { fmt.Println("Au moins un H1") } return nil, true } func main() { opts := gocrawl.NewOptions(new(goCrawlExtender)) opts.CrawlDelay = 1 * time.Second opts.LogFlags = gocrawl.LogAll opts.MaxVisits = 2 c := gocrawl.NewCrawlerWithOptions(opts) c.Run("http://localhost/ionize/") }
La fonction Visit est une surcharge appelée par la bibliothèque gocrawl à chaque fois qu'elle télécharge une page dans le cadre de son parcours récursif d'un site analysé. Ce qu'il y a de bien, c'est la bibliothèque goquery qui permet de faire des requêtes dans le document HTML téléchargé avec la même syntaxe que jQuery. Par exemple :
La bibliothèque gocrawl possède plusieurs options. On peut, par exemple, régler le stress infligé au site analysé avec l'option CrawlDelay. La fonction c.Run("http://localhost/ionize/") ne fait pas appel à une goroutine : elle parcourt toutes les pages du site (sauf que nous nous sommes limités dans cet exemple à un maximum de deux pages avec l'option MaxVisits), puis rend la main (après avoir exécuté la fonction End ou la fonction surchargée).
Les autres options et possibilités de surcharge sont résumées dans le paragraphe suivant.
La documentation complète se trouve sur la page du projet (en anglais). Les tableaux ci-dessous ne sont qu'une synthèse des possibilités.
Paramètre | Description |
---|---|
UserAgent | UserAgent utilisé pour récupérer la page (c.-à-d. ce qui apparaîtra dans les logs du serveur). Firefox 15 par défaut |
RobotUserAgent | UserAgent utilisé pour interroger le fichier robots. Voir les spécifications ici. Google bot par défaut. |
MaxVisits | Nombre maximal de pages à collecter |
EnqueueChanBuffer | Taille du buffer des pages supplémentaires à analyser |
HostBufferFactor | Facteur ou nombre de goroutine concurrentes collectant des pages. Par défaut, 10 fois le nombre d'hôtes différents. |
CrawlDelay | Délai entre deux récupérations de page et par hôte. 5 secondes par défaut. |
WorkerIdleTTL | Durée de vie de la connexion lorsque le collecteur est inactif. 10 secondes par défaut. |
SameHostOnly | Ne pas collecter les pages externes. Vrai par défaut. |
HeadBeforeGet | Demander des informations sur la ressource avant de demander la ressource elle-même. Faux par défaut. |
URLNormalizationFlags | Options à passer à la bibliothèque purell. |
LogFlags | Niveau de verbosité des logs. |
Extender | Interface permettant d'implémenter les callbacks de la bibliothèque gocrawl (voir le paragraphe suivant). |
Fonction | Description |
---|---|
Start | Appelée quand le collecteur démarre (par la fonction Run) |
End | Invoquée quand le collecteur s'arrête |
Error | Déclenchée à chaque erreur. Les erreurs ne stoppent pas le processus de collecte. |
Log | Déclenchée à chaque fois qu'un message de log est ajouté ; quel que soit le niveau de verbosité. |
ComputeDelay | Appelée juste avant la collecte (Fetch) d'une ressource. |
Fetch | Appelée après l'obtention des informations sur une ressource (cf. HeadBeforeGet). |
RequestGet | Permet de déterminer si le collecteur doit récupérer une ressource ou pas (en fonction du résultat du HEAD sur la ressource). |
RequestRobots | Permet de déterminer si le fichier robotos.txt doit être récupéré ou pas. |
FetchedRobots | Appelée lorsque le fichier robotos.txt a été récupéré. |
Filter | Filtre de visite. C'est par exemple dans cette fonction que l'on pourrait ne s'intéresser qu'à certains types d'extensions de fichier ou seulement aux ressources respectant une certaine structure d'URL. |
Enqueued | Déclenchée lorsqu'une ressource est insérée dans la file d'attente pour analyse. |
Visit | Invoquée après avoir téléchargé une ressource, afin de l'analyse. |
Visited | Appelée après avoir visité une ressource. |
Disallowed | Déclenchée lorsqu'une URL ne peut être atteinte à cause d'une règle dans le fichier robots.txt. |
Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go. Lire »
Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif Lire »
Traduction d'une partie des spécifications officielles du langage Go, cet article explique comment développer en Go. Lire »
Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover Lire »
Traduction d'une partie des spécifications officielles du langage go, cet article explique comment go gère la mémoire. Lire »
Soyez le premier à commenter cet article
Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.