Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Panduan Bermula: Kuasai konsep asas pelaksanaan perangkak dalam bahasa Go

Panduan Bermula: Kuasai konsep asas pelaksanaan perangkak dalam bahasa Go

WBOY
WBOYasal
2024-01-30 08:07:05487semak imbas

Panduan Bermula: Kuasai konsep asas pelaksanaan perangkak dalam bahasa Go

Mulakan dengan pantas: Pelajari pengetahuan asas bahasa Go untuk melaksanakan perangkak, anda memerlukan contoh kod khusus

Ikhtisar
Dengan perkembangan pesat Internet, jumlah maklumat yang besar dan berkembang, cara mendapatkan maklumat yang berguna daripada data besar-besaran telah menjadi Misi kritikal. Sebagai alat pemerolehan data automatik, perangkak telah menarik banyak perhatian dan perhatian daripada pembangun. Sebagai bahasa dengan prestasi cemerlang, keupayaan selaras yang kukuh dan mudah dipelajari, bahasa Go digunakan secara meluas dalam pembangunan perangkak.

Artikel ini akan memperkenalkan pengetahuan asas pelaksanaan perangkak dalam bahasa Go, termasuk penghuraian URL, permintaan HTTP, penghuraian HTML, pemprosesan serentak, dll., digabungkan dengan contoh kod khusus untuk membantu pembaca bermula dengan cepat.

  1. URL parsing
    URL (Uniform Resource Locator) ialah alamat sumber Internet dan halaman web tertentu boleh didapati melalui URL. Dalam bahasa Go, kami boleh menggunakan pakej net/url untuk menghuraikan dan memproses URL.

Berikut ialah contoh mudah:

package main

import (
    "fmt"
    "net/url"
)

func main() {
    u, err := url.Parse("https://www.example.com/path?query=1#fragment")
    if err != nil {
        fmt.Println("parse error:", err)
        return
    }

    fmt.Println("Scheme:", u.Scheme)   // 输出:https
    fmt.Println("Host:", u.Host)       // 输出:www.example.com
    fmt.Println("Path:", u.Path)       // 输出:/path
    fmt.Println("RawQuery:", u.RawQuery) // 输出:query=1
    fmt.Println("Fragment:", u.Fragment) // 输出:fragment
}

Dengan memanggil fungsi url.Parse, kami menghuraikan URL ke dalam struktur url.URL dan boleh mengakses pelbagai komponennya, seperti Skim (protokol), nama Hos (hos) ), Laluan (laluan), RawQuery (parameter pertanyaan) dan Fragmen (serpihan).

  1. Permintaan HTTP
    Dalam perangkak, kami perlu menghantar permintaan HTTP berdasarkan URL dan mendapatkan data yang dikembalikan oleh pelayan. Dalam bahasa Go, anda boleh menggunakan pakej http untuk menghantar permintaan HTTP dan memproses respons pelayan.

Berikut adalah contoh:

package main

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

func main() {
    resp, err := http.Get("https://www.example.com")
    if err != nil {
        fmt.Println("request error:", err)
        return
    }

    defer resp.Body.Close()

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

    fmt.Println(string(body))
}

Dengan memanggil fungsi http.Get, kami boleh menghantar permintaan GET dan mendapatkan data yang dikembalikan oleh pelayan. Kandungan entiti respons boleh diperolehi melalui resp.Body, baca menggunakan fungsi ioutil.ReadAll dan ditukarkan kepada rentetan untuk output.

  1. Penghuraian HTML
    Dalam perangkak, kami biasanya mengekstrak data yang diperlukan daripada halaman HTML. Dalam bahasa Go, anda boleh menggunakan pakej goquery untuk menghuraikan HTML dan mengekstrak data.

Berikut ialah contoh:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    resp, err := http.Get("https://www.example.com")
    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    doc.Find("h1").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text())
    })
}

Dengan memanggil fungsi goquery.NewDocumentFromReader, kita boleh menghuraikan kandungan entiti respons HTTP ke dalam objek goquery.Document, dan kemudian gunakan kaedah Cari objek ini untuk mencari elemen HTML tertentu dan Ia menjalankan pemprosesan, seperti mengeluarkan kandungan teks.

  1. Pemprosesan serentak
    Dalam perangkak sebenar, kita selalunya perlu memproses berbilang URL pada masa yang sama untuk meningkatkan kecekapan rangkak, yang memerlukan penggunaan pemprosesan serentak. Dalam bahasa Go, anda boleh menggunakan goroutine dan saluran untuk mencapai keselarasan.

Berikut ialah contoh:

package main

import (
    "fmt"
    "log"
    "net/http"
    "sync"

    "github.com/PuerkitoBio/goquery"
)

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

    var wg sync.WaitGroup

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

            resp, err := http.Get(url)
            if err != nil {
                log.Fatal(err)
            }

            defer resp.Body.Close()

            doc, err := goquery.NewDocumentFromReader(resp.Body)
            if err != nil {
                log.Fatal(err)
            }

            doc.Find("h1").Each(func(i int, s *goquery.Selection) {
                fmt.Println(url, s.Text())
            })
        }(url)
    }

    wg.Wait()
}

Dengan menggunakan sync.WaitGroup dan goroutine, kami boleh memproses berbilang URL secara serentak dan menunggu mereka menyelesaikan pelaksanaannya. Dalam setiap goroutine, kami menghantar permintaan HTTP dan menghuraikan HTML, akhirnya mengeluarkan kandungan teks.

Kesimpulan
Artikel ini memperkenalkan pengetahuan asas pelaksanaan perangkak dalam bahasa Go, termasuk penghuraian URL, permintaan HTTP, penghuraian HTML dan pemprosesan serentak, dsb., dan menerangkannya dengan contoh kod khusus. Saya berharap selepas membaca artikel ini, pembaca boleh mula menggunakan bahasa Go dengan cepat untuk membangunkan program perangkak yang cekap.

Atas ialah kandungan terperinci Panduan Bermula: Kuasai konsep asas pelaksanaan perangkak dalam bahasa Go. 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