2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Web Scraper est un outil qui extrait automatiquement les données des sites Web. Ils sont largement utilisés dans la collecte de données, l’optimisation des moteurs de recherche, les études de marché et d’autres domaines. Cet article présentera en détail comment utiliser Go 1.19 pour implémenter un outil d'exploration automatisé simplifié de modèles de site afin d'aider les développeurs à collecter efficacement des données.
Avant de commencer, assurez-vous que Go 1.19 est installé sur votre système. Vous pouvez vérifier la version Go avec la commande suivante :
go version
Si vous n'avez pas encore installé Go, vous pouvez le télécharger depuis Aller sur le site officiel Téléchargez et installez la dernière version.
Le flux de travail de base d'un robot d'exploration Web est le suivant :
Dans le langage Go, il existe plusieurs frameworks de robots d'exploration populaires, tels que :
Cet article utilisera principalement Colly et Goquery pour l'exploration du Web et l'analyse du contenu.
Nous allons concevoir un outil d'exploration automatisé et simplifié de modèles de sites. Le processus de base est le suivant :
Tout d’abord, créez un nouveau projet Go :
mkdir go_scraper
cd go_scraper
go mod init go_scraper
Ensuite, installez Colly et Goquery :
go get -u github.com/gocolly/colly
go get -u github.com/PuerkitoBio/goquery
Ensuite, écrivez un robot d'exploration simple pour explorer le contenu Web :
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
// 创建一个新的爬虫实例
c := colly.NewCollector()
// 设置请求时的回调函数
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
// 设置响应时的回调函数
c.OnResponse(func(r *colly.Response) {
fmt.Println("Visited", r.Request.URL)
fmt.Println("Response:", string(r.Body))
})
// 设置错误处理的回调函数
c.OnError(func(r *colly.Response, err error) {
fmt.Println("Error:", err)
})
// 设置HTML解析时的回调函数
c.OnHTML("title", func(e *colly.HTMLElement) {
fmt.Println("Title:", e.Text)
})
// 开始爬取
c.Visit("http://example.com")
}
L'exécution du code ci-dessus explorera le contenu de http://example.com et imprimera le titre de la page.
Afin d'extraire les données requises de la page Web, nous devons utiliser Goquery pour analyser le contenu HTML. L'exemple suivant montre comment utiliser Goquery pour extraire des liens et du texte d'une page Web :
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
)
func main() {
c := colly.NewCollector()
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
})
})
c.Visit("http://example.com")
}
Afin d'améliorer l'efficacité du robot, nous pouvons utiliser la fonction de concurrence de Colly :
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"time"
)
func main() {
c := colly.NewCollector(
colly.Async(true), // 启用异步模式
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2, // 设置并发数
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
})
c.Visit("http://example.com")
c.Wait() // 等待所有异步任务完成
}
Enregistrez les données capturées dans un fichier local ou une base de données. Voici un fichier CSV à titre d'exemple :
package main
import (
"encoding/csv"
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("data.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
c := colly.NewCollector(
colly.Async(true),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
writer.Write([]string{text, link})
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
})
c.Visit("http://example.com")
c.Wait()
}
Afin d'améliorer la stabilité du robot, nous devons gérer les erreurs de requête et implémenter un mécanisme de nouvelle tentative :
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("data.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
c := colly.NewCollector(
colly.Async(true),
colly.MaxDepth(1),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)
n", index, text, link)
writer.Write([]string{text, link})
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
// 重试机制
if r.StatusCode == 0 || r.StatusCode >= 500 {
r.Request.Retry()
}
})
c.Visit("http://example.com")
c.Wait()
}
L'exemple suivant montre comment récupérer les titres et les liens d'un site Web d'actualités et les enregistrer dans un fichier CSV :
package main
import (
"encoding/csv"
"fmt"
"github.com/gocolly/colly"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("news.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
writer.Write([]string{"Title", "Link"})
c := colly.NewCollector(
colly.Async(true),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 5,
Delay: 1 * time.Second,
})
c.OnHTML(".news-title", func(e *colly.HTMLElement) {
title := e.Text
link := e.ChildAttr("a", "href")
writer.Write([]string{title, e.Request.AbsoluteURL(link)})
fmt.Printf("Title: %snLink: %sn", title, e.Request.AbsoluteURL(link))
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
if r.StatusCode == 0 || r.StatusCode >= 500 {
r.Request.Retry()
}
})
c.Visit("http://example-news-site.com")
c.Wait()
}
Pour éviter d'être bloqué par le site cible, vous pouvez utiliser un proxy :
c.SetProxy("http://proxyserver:port")
Faites semblant d'être un navigateur différent en définissant l'agent utilisateur :
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
Vous pouvez utiliser la bibliothèque d'extensions Colly-Redis pour implémenter des robots d'exploration distribués :
import (
"github.com/gocolly/redisstorage"
)
func main() {
c := colly.NewCollector()
redisStorage := &redisstorage.Storage{
Address: "localhost:6379",
Password: "",
DB: 0,
Prefix: "colly",
}
c.SetStorage(redisStorage)
}
Pour les pages Web dynamiques, vous pouvez utiliser un navigateur sans interface tel que chromedp :
import (
"context"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var res string
err := chromedp.Run(ctx,
chromedp.Navigate("http://example.com"),
chromedp.WaitVisible(`#some-element`),
chromedp.InnerHTML(`#some-element`, &res),
)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
}
Grâce à l'introduction détaillée de cet article, nous avons appris à utiliser Go 1.19 pour implémenter un outil d'exploration automatisé et simplifié de modèles de sites. Nous sommes partis du processus de conception de base du robot d'exploration et avons progressivement abordé des aspects clés tels que l'analyse HTML, le traitement simultané, le stockage des données et la gestion des erreurs, et avons démontré comment explorer et traiter les données d'une page Web à l'aide d'exemples de code spécifiques.
Les puissantes capacités de traitement simultané du langage Go et ses riches bibliothèques tierces en font un choix idéal pour créer des robots d'exploration Web efficaces et stables. Grâce à une optimisation et une expansion continues, des fonctions d'exploration plus complexes et avancées peuvent être réalisées pour fournir des solutions à divers besoins de collecte de données.
J'espère que cet article pourra vous fournir une référence précieuse pour la mise en œuvre de robots d'exploration Web en langage Go et vous inciter à mener davantage d'exploration et d'innovation dans ce domaine.