Heim  >  Artikel  >  Backend-Entwicklung  >  Erstellen Sie leistungsstarke gleichzeitige Crawler mit Go und Goroutinen

Erstellen Sie leistungsstarke gleichzeitige Crawler mit Go und Goroutinen

WBOY
WBOYOriginal
2023-07-21 20:03:29761Durchsuche

Verwenden Sie Go und Goroutinen, um leistungsstarke gleichzeitige Crawler zu erstellen

Im heutigen Internetzeitalter explodieren die Informationen explosionsartig und eine große Menge an Webinhalten steht uns zum Durchsuchen zur Verfügung. Für Entwickler ist die Beschaffung dieser Informationen und die Durchführung weiterer Analysen eine wichtige Aufgabe. Und Crawler sind die Werkzeuge, mit denen dieses Ziel erreicht wird. In diesem Artikel wird erläutert, wie Sie mithilfe der Go-Sprache und Goroutinen leistungsstarke gleichzeitige Crawler erstellen.

Go-Sprache ist eine von Google entwickelte Open-Source-Programmiersprache. Es ist bekannt für seine minimalistische Syntax und leistungsstarke Leistung. Goroutinen sind ein leichter Thread in der Go-Sprache, der zur Implementierung gleichzeitiger Vorgänge verwendet werden kann.

Bevor wir mit dem Schreiben des Crawlers beginnen, müssen wir zwei notwendige Bibliotheken vorbereiten: net/http und golang.org/x/net/html. Ersteres wird zum Senden von HTTP-Anfragen und Empfangen von HTTP-Antworten verwendet, und letzteres wird zum Parsen von HTML-Dokumenten verwendet. net/httpgolang.org/x/net/html。前者用于发送HTTP请求和接收HTTP响应,后者用于解析HTML文档。

下面是一个简单的示例,演示了如何使用Go和Goroutines来编写一个并发爬虫:

package main

import (
    "fmt"
    "net/http"
    "golang.org/x/net/html"
)

func main() {
    urls := []string{
        "https://www.example.com/page1",
        "https://www.example.com/page2",
        "https://www.example.com/page3",
    }

    results := make(chan string)

    for _, url := range urls {
        go func(url string) {
            body, err := fetch(url)
            if err != nil {
                fmt.Println(err)
                return
            }

            links := extractLinks(body)
            for _, link := range links {
                results <- link
            }
        }(url)
    }

    for i := 0; i < len(urls); i++ {
        fmt.Println(<-results)
    }
}

func fetch(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    return string(body), nil
}

func extractLinks(body string) []string {
    links := []string{}
    doc, err := html.Parse(strings.NewReader(body))
    if err != nil {
        return links
    }

    var extract func(*html.Node)
    extract = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "a" {
            for _, attr := range n.Attr {
                if attr.Key == "href" {
                    links = append(links, attr.Val)
                    break
                }
            }
        }

        for c := n.FirstChild; c != nil; c = c.NextSibling {
            extract(c)
        }
    }

    extract(doc)
    return links
}

在上面的代码中,我们首先定义了一个urls数组,其中包含了我们要爬取的网页URL。然后,我们创建了一个results通道,用于存放爬取结果。

接下来,我们使用for循环迭代urls数组中的每个URL。在每次循环中,我们都使用go关键字来创建一个Goroutine,去并发地爬取指定的URL。在Goroutine中,我们首先调用fetch函数来发送HTTP请求并获取响应的HTML内容。之后,我们根据HTML内容调用extractLinks函数,提取其中的链接,并将它们发送到results通道中。

最后,我们使用一个for循环来从results

Hier ist ein einfaches Beispiel, das zeigt, wie man mit Go und Goroutinen einen gleichzeitigen Crawler schreibt:

rrreee

Im obigen Code definieren wir zunächst ein urls-Array, das unsere Web-URL enthält Seite, die gecrawlt werden soll. Anschließend haben wir einen results-Kanal erstellt, um die Crawling-Ergebnisse zu speichern.

Als nächstes verwenden wir eine for-Schleife, um jede URL im urls-Array zu durchlaufen. In jeder Schleife verwenden wir das Schlüsselwort go, um eine Goroutine zum gleichzeitigen Crawlen der angegebenen URL zu erstellen. In Goroutine rufen wir zunächst die Funktion fetch auf, um eine HTTP-Anfrage zu senden und den HTML-Inhalt der Antwort abzurufen. Anschließend rufen wir die Funktion extractLinks basierend auf dem HTML-Inhalt auf, extrahieren die Links und senden sie an den Kanal results. 🎜🎜Schließlich verwenden wir eine for-Schleife, um die Crawl-Ergebnisse vom Kanal results zu empfangen und auszudrucken. 🎜🎜Durch die Verwendung von Goroutinen können wir mehrere HTTP-Anfragen gleichzeitig senden und so die Leistung des Crawlers verbessern. Darüber hinaus können IO-intensive Vorgänge wie HTTP-Anfragen und HTML-Parsing mithilfe von Goroutinen effizient abgewickelt werden. 🎜🎜Zusammenfassend stellt dieser Artikel vor, wie man die Go-Sprache und Goroutinen verwendet, um einen leistungsstarken gleichzeitigen Crawler zu erstellen. Durch die ordnungsgemäße Nutzung von Parallelitätsmechanismen können wir Informationen im Internet effizienter abrufen und analysieren. Ich hoffe, dass die Leser durch den Inhalt dieses Artikels verstehen und beherrschen können, wie man mit der Go-Sprache leistungsstarke gleichzeitige Crawler schreibt. 🎜

Das obige ist der detaillierte Inhalt vonErstellen Sie leistungsstarke gleichzeitige Crawler mit Go und Goroutinen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn