Bagaimana untuk melaksanakan perangkak berbilang benang menggunakan fungsi serentak dalam bahasa Go?

王林
Lepaskan: 2023-08-02 11:53:31
asal
615 orang telah melayarinya

Bagaimana untuk melaksanakan perangkak berbilang benang menggunakan fungsi serentak dalam bahasa Go?

Dalam era Internet hari ini, teknologi perangkak digunakan secara meluas dalam pelbagai senario, seperti rangkak web enjin carian, analisis data dan perlombongan, dsb. Sebagai bahasa pengaturcaraan yang mudah dan cekap, ciri serentak bahasa Go menjadikannya pilihan yang ideal untuk pembangunan perangkak. Artikel ini akan memperkenalkan cara menggunakan fungsi concurrency dalam bahasa Go untuk melaksanakan perangkak berbilang benang yang ringkas dan melampirkan contoh kod yang sepadan.

Pertama, kita perlu mentakrifkan fungsi perangkak, yang digunakan untuk melaksanakan operasi rangkak tertentu. Berikut ialah contoh mudah untuk merangkak maklumat tajuk halaman web tertentu:

func crawl(url string, ch chan<- string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Println("Error: ", err)
        return
    }
    defer resp.Body.Close()
    
    doc, err := html.Parse(resp.Body)
    if err != nil {
        log.Println("Error: ", err)
        return
    }
    
    title, err := getTitle(doc)
    if err != nil {
        log.Println("Error: ", err)
        return
    }
    
    ch <- "Title: " + title
}
Salin selepas log masuk

Dalam kod di atas, fungsi crawl menerima parameter URL dan saluran ch< untuk menyampaikan hasil. /code>. Mula-mula, ia menggunakan fungsi <code>http.Get untuk mendapatkan kandungan URL yang ditentukan, dan kemudian menggunakan fungsi html.Parse untuk menghuraikan dokumen HTML. Seterusnya, kita boleh menyesuaikan fungsi getTitle untuk mengekstrak maklumat tajuk daripada dokumen yang dihuraikan. Akhir sekali, maklumat tajuk yang diekstrak dihantar ke fungsi utama melalui saluran. crawl函数接受一个URL参数和一个用于传递结果的通道ch。首先,它使用http.Get函数获取指定URL的内容,然后使用html.Parse函数解析HTML文档。接下来,我们可以自定义一个getTitle函数,用于从解析后的文档中提取出标题信息。最后,将提取到的标题信息通过通道传递给主函数。

接着,在主函数中,我们可以使用多个goroutine来并发地执行爬虫任务。以下是一个简单的示例:

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

    ch := make(chan string)
    for _, url := range urls {
        go crawl(url, ch)
    }

    for i := 0; i < len(urls); i++ {
        fmt.Println(<-ch)
    }
}
Salin selepas log masuk

在主函数中,我们首先定义了要爬取的URL列表urls,然后创建了一个通道ch用于接收爬取结果。接着,我们使用go关键字并发地调用crawl函数。最后,通过使用range

Seterusnya, dalam fungsi utama, kita boleh menggunakan berbilang gorout untuk melaksanakan tugas crawler secara serentak. Berikut ialah contoh mudah:

rrreee

Dalam fungsi utama, kami mula-mula mentakrifkan senarai URL untuk merangkak url dan kemudian mencipta saluran ch untuk menerima hasil Crawling . Seterusnya, kami menggunakan kata kunci go untuk memanggil fungsi crawl secara serentak. Akhir sekali, dengan menggunakan kata kunci julat untuk melintasi saluran, kami boleh memperoleh setiap hasil merangkak secara bergilir-gilir dan mencetaknya.

Melalui contoh kod di atas, kita dapat melihat bahawa penggunaan fungsi serentak dalam bahasa Go adalah lebih mudah daripada bahasa pengaturcaraan lain. Menggunakan gabungan goroutine dan saluran, kami boleh melaksanakan perangkak berbilang benang dengan mudah dan meningkatkan kecekapan merangkak.

Sudah tentu, sebenarnya, sistem perangkak sebenar perlu mempertimbangkan banyak faktor lain, seperti kawalan konkurensi, pengendalian ralat, mekanisme deduplikasi, dll. Walau bagaimanapun, tujuan artikel ini adalah untuk menunjukkan penggunaan fungsi serentak, jadi ciri tambahan ini tidak dilindungi. 🎜🎜Ringkasnya, bahasa Go menyediakan satu siri fungsi serentak yang berkuasa, membolehkan pembangun melaksanakan perangkak berbilang benang dengan mudah. Dengan menggunakan fungsi ini secara rasional, kami boleh menangkap sejumlah besar data dengan cara yang cekap untuk memenuhi keperluan pelbagai senario aplikasi. Saya harap artikel ini akan membantu anda dalam melaksanakan perangkak berbilang benang menggunakan bahasa Go. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan perangkak berbilang benang menggunakan fungsi serentak dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!