Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan fungsi konkurensi dalam bahasa Go untuk melaksanakan pengedaran pengedaran perangkak web?

Bagaimana untuk menggunakan fungsi konkurensi dalam bahasa Go untuk melaksanakan pengedaran pengedaran perangkak web?

WBOY
WBOYasal
2023-07-31 19:48:26982semak imbas

Bagaimana untuk menggunakan fungsi konkurensi dalam bahasa Go untuk melaksanakan penggunaan teragih perangkak web?

Dalam era Internet hari ini, sejumlah besar maklumat terkandung dalam pelbagai laman web, dan crawler telah menjadi alat penting. Untuk tugasan merangkak data berskala besar, penggunaan teragih boleh meningkatkan kelajuan dan kecekapan merangkak dengan lebih berkesan. Mekanisme penyelarasan bahasa Go boleh menyokong penggunaan perangkak web yang diedarkan. Di bawah ini kami akan memperkenalkan cara menggunakan fungsi penyelarasan dalam bahasa Go untuk melaksanakan penggunaan perangkak web yang diedarkan.

Pertama sekali, kita perlu menjelaskan fungsi asas dan proses tugas crawler. Program perangkak asas perlu mengekstrak maklumat daripada halaman web tertentu dan menyimpan maklumat yang diekstrak ke media storan tempatan atau lain. Proses tugasan perangkak boleh dibahagikan kepada langkah berikut:

  1. Mulakan permintaan HTTP untuk mendapatkan kod sumber HTML halaman web sasaran.
  2. Ekstrak maklumat sasaran daripada kod sumber HTML.
  3. Memproses dan menyimpan maklumat.

Dalam penggunaan yang diedarkan, kami boleh menetapkan tugasan kepada berbilang nod perangkak dan setiap nod merangkak secara berasingan sebahagian daripada halaman web dan mengekstrak maklumat. Mari perkenalkan secara terperinci cara menggunakan fungsi serentak bahasa Go untuk melaksanakan proses ini.

Pertama, kita perlu menentukan fungsi untuk merangkak halaman web. Berikut ialah contoh mudah:

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
}

Dalam kod di atas, kami menggunakan pakej http dalam pustaka standard bahasa Go untuk memulakan permintaan HTTP dan menggunakan pakej ioutil untuk membaca kandungan respons yang dikembalikan.

Seterusnya, kita perlu menentukan fungsi untuk mengekstrak maklumat sasaran daripada kod sumber HTML. Berikut ialah contoh mudah:

func extract(url string, body string) []string {
    var urls []string

    doc, err := goquery.NewDocumentFromReader(strings.NewReader(body))
    if err != nil {
        return urls
    }

    doc.Find("a").Each(func(i int, s *goquery.Selection) {
        href, exists := s.Attr("href")
        if exists {
            urls = append(urls, href)
        }
    })

    return urls
}

Dalam kod di atas, kami menggunakan goquery perpustakaan pihak ketiga untuk menghuraikan kod sumber HTML dan menggunakan sintaks pemilih CSS untuk memilih elemen sasaran dalam HTML.

Seterusnya, kita boleh menggunakan fungsi serentak untuk melaksanakan fungsi perangkak teragih. Berikut ialah contoh mudah:

func main() {
    urls := []string{"http://example1.com", "http://example2.com", "http://example3.com"}

    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()

            body, err := fetch(url)
            if err != nil {
                fmt.Println("Fetch error:", err)
                return
            }

            extractedUrls := extract(url, body)
            for _, u := range extractedUrls {
                wg.Add(1)
                go func(u string) {
                    defer wg.Done()

                    body, err := fetch(u)
                    if err != nil {
                        fmt.Println("Fetch error:", err)
                        return
                    }

                    extractedUrls := extract(u, body)
                    // 对提取到的信息进行处理和存储
                }(u)
            }
        }(url)
    }

    wg.Wait()
}

Dalam kod di atas, kami menggunakan WaitGroup dalam pakej penyegerakan untuk menunggu semua tugasan serentak selesai. Kami mula-mula melintasi senarai URL awal dan memulakan tugas untuk setiap URL. Dalam setiap tugasan, kami mula-mula menggunakan fungsi ambil untuk memulakan permintaan HTTP untuk mendapatkan kod sumber HTML. Kemudian gunakan fungsi ekstrak untuk mengekstrak URL yang diperlukan daripada kod sumber HTML, dan mulakan subtugas untuk setiap URL. Subtugas juga menggunakan fungsi ambil untuk mendapatkan kod sumber HTML, dan fungsi ekstrak untuk mengekstrak maklumat.

Dalam perangkak teragih sebenar, kami boleh mengoptimumkan lagi kecekapan dan prestasi rangkak dengan melaraskan strategi penjadualan, baris gilir tugas, dsb.

Untuk meringkaskan secara ringkas, penyebaran perangkak web boleh dicapai dengan mudah menggunakan fungsi serentak dalam bahasa Go. Kami mula-mula mentakrifkan fungsi untuk merangkak halaman web dan mengekstrak maklumat, dan kemudian menggunakan fungsi serentak untuk melaksanakan penjadualan tugas dan pelaksanaan perangkak yang diedarkan. Dengan mereka bentuk pengagihan tugas dengan betul dan bilangan konkurensi, kami boleh meningkatkan kelajuan dan kecekapan merangkak dengan berkesan.

Saya harap pengenalan di atas dapat membantu anda, dan saya doakan anda berjaya menggunakan fungsi serentak dalam bahasa Go untuk melaksanakan penyebaran perangkak web!

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

Kenyataan:
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