Wie verwende ich die gleichzeitige Funktion in der Go-Sprache, um mehrere Webseiten parallel zu crawlen?

WBOY
Freigeben: 2023-07-29 19:13:12
Original
1250 Leute haben es durchsucht

Wie verwende ich die gleichzeitige Funktion in der Go-Sprache, um das parallele Crawlen mehrerer Webseiten zu erreichen?

In der modernen Webentwicklung ist es oft notwendig, Daten von mehreren Webseiten zu extrahieren. Der allgemeine Ansatz besteht darin, Netzwerkanfragen einzeln zu initiieren und auf Antworten zu warten, was weniger effizient ist. Die Go-Sprache bietet leistungsstarke Parallelitätsfunktionen, die die Effizienz durch das parallele Crawlen mehrerer Webseiten verbessern können. In diesem Artikel wird erläutert, wie Sie die gleichzeitige Funktion der Go-Sprache verwenden, um das parallele Crawlen mehrerer Webseiten zu erreichen, sowie einige Vorsichtsmaßnahmen.

Zuerst müssen wir das integrierte Schlüsselwort go der Go-Sprache verwenden, um gleichzeitige Aufgaben zu erstellen. Durch das Hinzufügen des Schlüsselworts go vor einem Funktionsaufruf bindet die Go-Sprache den Funktionsaufruf in eine gleichzeitige Aufgabe ein und gibt dann sofort die Kontrolle an das Hauptprogramm zurück, um mit der Ausführung des nachfolgenden Codes fortzufahren. Dadurch kann der Effekt erzielt werden, dass mehrere Webseiten parallel gecrawlt werden. go关键字创建并发任务。通过在函数调用前加上go关键字,Go语言会将该函数调用包装为一个并发任务,然后立即返回主程序的控制权,继续执行后续的代码。这样可以实现并行抓取多个网页的效果。

下面是一个简单的示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

// 并发抓取网页的函数
func fetch(url string, ch chan<- string) {
    resp, err := http.Get(url)
    if err != nil {
        ch <- fmt.Sprintf("fetch %s failed: %v", url, err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        ch <- fmt.Sprintf("read %s failed: %v", url, err)
        return
    }

    ch <- fmt.Sprintf("fetch %s success: %d bytes", url, len(body))
}

func main() {
    urls := []string{"http://www.example.com", "http://www.google.com", "http://www.microsoft.com"}

    ch := make(chan string)

    for _, url := range urls {
        go fetch(url, ch)
    }

    for range urls {
        fmt.Println(<-ch)
    }
}
Nach dem Login kopieren

在上述代码中,我们定义了一个fetch函数用于抓取单个网页。fetch函数通过http.Get发起网络请求,并将请求结果发送到一个chan类型的通道ch。主程序中,我们创建了一个通道ch和一个包含多个网页URL的切片urls。然后,通过for循环遍历urls切片,并对每个URL调用fetch函数。每次调用fetch函数时,都会使用go关键字创建一个并发任务,这样多个任务就可以同时执行。

最后,我们通过for循环遍历一次urls切片,从通道ch中接收抓取结果并打印输出。由于通道的读取操作会阻塞,所以程序会等待所有并发任务完成后再进行输出。

需要注意的是,并发任务的执行顺序是不确定的,所以最后输出的结果的顺序也是不确定的。如果需要保持结果的顺序,可以使用sync.WaitGroup

Das Folgende ist ein einfacher Beispielcode:

rrreee

Im obigen Code definieren wir eine fetch-Funktion, um eine einzelne Webseite abzurufen. Die Funktion fetch initiiert eine Netzwerkanfrage über http.Get und sendet das Anfrageergebnis an einen Kanal vom Typ chan ch . Im Hauptprogramm haben wir einen Kanal ch und einen Slice urls erstellt, der mehrere Webseiten-URLs enthält. Anschließend durchlaufen Sie den urls-Slice durch eine for-Schleife und rufen die Funktion fetch für jede URL auf. Bei jedem Aufruf der Funktion fetch wird mit dem Schlüsselwort go eine gleichzeitige Aufgabe erstellt, sodass mehrere Aufgaben gleichzeitig ausgeführt werden können.

Schließlich durchlaufen wir das urls-Slice einmal durch die for-Schleife, empfangen die Crawling-Ergebnisse vom Kanal ch und drucken die Ausgabe aus. Da der Lesevorgang des Kanals blockiert wird, wartet das Programm vor der Ausgabe, bis alle gleichzeitigen Aufgaben abgeschlossen sind. 🎜🎜Es ist zu beachten, dass die Ausführungsreihenfolge gleichzeitiger Aufgaben ungewiss ist, sodass auch die Reihenfolge der endgültigen Ausgabeergebnisse ungewiss ist. Wenn Sie die Reihenfolge der Ergebnisse beibehalten müssen, können Sie mit sync.WaitGroup auf den Abschluss gleichzeitiger Aufgaben warten und die Ergebnisse dann der Reihe nach verarbeiten. 🎜🎜Darüber hinaus ist zu beachten, dass das gleichzeitige Crawlen von Webseiten zu einem stärkeren Druck auf die Zielwebsite führen kann. Um eine Blockierung durch die Zielwebsite oder eine Beeinträchtigung der Servicequalität zu vermeiden, können Sie die Anzahl gleichzeitiger Aufgaben angemessen anpassen, das Crawling-Intervall erhöhen und andere Strategien anwenden. 🎜🎜Kurz gesagt: Durch die Nutzung der Parallelitätsfunktion der Go-Sprache können wir problemlos das parallele Crawlen mehrerer Webseiten erreichen. Dies kann nicht nur die Crawling-Effizienz verbessern, sondern auch den Bedarf an umfangreicher Datenerfassung besser bewältigen. Gleichzeitig können durch die Verwendung gleichzeitiger Aufgaben auch die Skalierbarkeit und die parallelen Rechenfähigkeiten des Programms verbessert werden. 🎜

Das obige ist der detaillierte Inhalt vonWie verwende ich die gleichzeitige Funktion in der Go-Sprache, um mehrere Webseiten parallel zu crawlen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage