Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk menggunakan bahasa Go untuk pembangunan perangkak?

Bagaimana untuk menggunakan bahasa Go untuk pembangunan perangkak?

WBOY
Lepaskan: 2023-06-10 09:00:07
asal
1804 orang telah melayarinya

Dengan perkembangan Internet, teknologi crawler semakin digunakan, terutamanya dalam bidang pengumpulan data, analisis maklumat dan membuat keputusan perniagaan. Sebagai bahasa pengaturcaraan yang pantas, cekap dan mudah digunakan, bahasa Go juga digunakan secara meluas dalam pembangunan perangkak. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk membangunkan perangkak, memfokuskan pada teknologi teras dan kaedah pembangunan sebenar perangkak.

1 Pengenalan kepada bahasa Go

Bahasa Go, juga dikenali sebagai Golang, ialah bahasa pengaturcaraan yang cekap, boleh dipercayai dan mudah dibangunkan oleh Google. Ia mewarisi gaya tatabahasa bahasa C, tetapi mengalih keluar beberapa ciri kompleks, menjadikan kod penulisan lebih ringkas. Pada masa yang sama, bahasa Go mempunyai mod konkurensi yang cekap dan mekanisme pengumpulan sampah, serta mempunyai prestasi cemerlang dalam mengendalikan sistem berskala besar dan pengaturcaraan rangkaian. Oleh itu, bahasa Go digunakan secara meluas dalam aplikasi Internet, pengkomputeran teragih, pengkomputeran awan dan bidang lain.

2. Prinsip perangkak

Perangkak ialah program automatik yang boleh mensimulasikan tingkah laku penyemak imbas manusia untuk mendapatkan data pada halaman Internet. Perangkak terutamanya mempunyai dua bahagian teras: 1) Alat permintaan HTTP, digunakan untuk menghantar permintaan ke URL yang ditentukan dan menerima jawapan termasuk curl, wget, permintaan, dll. 2) Penghurai HTML, digunakan untuk menghuraikan halaman HTML dan mengekstrak semua maklumat data yang diperlukan. Penghurai HTML biasa termasuk BeautifulSoup, Jsoup, pyquery, dll.

Proses asas perangkak ialah: pilih tapak web sasaran yang sesuai mengikut keperluan -> Hantar permintaan HTTP untuk mendapatkan kandungan HTML halaman -> >

3. Pembangunan perangkak bahasa Go

Pakej net/http dalam pustaka standard bahasa Go menyediakan alat untuk menghantar permintaan HTTP Bahasa Go juga mempunyai goquery pustaka penghuraian HTML. Oleh itu, adalah lebih mudah untuk menggunakan bahasa Go untuk pembangunan perangkak. Berikut memperkenalkan langkah khusus pembangunan perangkak bahasa Go.

1 Pasang persekitaran pembangunan bahasa Go

Mula-mula anda perlu memasang persekitaran pembangunan bahasa Go, muat turun pakej pemasangan dari tapak web rasmi https://golang.org/dl/ dan memasangnya mengikut arahan. Selepas pemasangan selesai, anda boleh menyemak sama ada bahasa Go berjaya dipasang dengan melaksanakan arahan versi go.

2. Gunakan pakej net/http untuk menghantar permintaan HTTP

Dalam bahasa Go, anda boleh menggunakan fungsi Get, Post, Head dan lain-lain dalam pakej net/http untuk menghantar permintaan HTTP . Mereka mengembalikan objek Respons yang mengandungi maklumat respons HTTP. Berikut ialah contoh mudah:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    resp, err := http.Get("https://www.baidu.com")
    if err != nil {
        fmt.Println("get error:", err)
        return
    }
    defer resp.Body.Close()

    // 输出返回内容
    buf := make([]byte, 1024)
    for {
        n, err := resp.Body.Read(buf)
        if n == 0 || err != nil {
            break
        }
        fmt.Println(string(buf[:n]))
    }
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan fungsi http.Get untuk menghantar permintaan HTTP ke Baidu dan mengeluarkan kandungan yang dikembalikan. Perlu diingat bahawa selepas kita membaca semua kandungan dalam resp.Body, kita mesti memanggil fungsi defer resp.Body.Close() untuk menutup bacaan resp.Body.

3. Gunakan goquery untuk menghuraikan halaman HTML

Dalam bahasa Go, kami boleh menggunakan pustaka goquery untuk menghuraikan halaman HTML dan mengekstrak maklumat data. Pustaka ini menyediakan pemilih gaya jQuery, yang lebih mudah digunakan daripada perpustakaan penghuraian HTML yang lain.

Berikut ialah contoh kod:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    doc, err := goquery.NewDocument("https://news.ycombinator.com/")
    if err != nil {
        log.Fatal(err)
    }

    doc.Find(".title a").Each(func(i int, s *goquery.Selection) {
        fmt.Printf("%d: %s - %s
", i, s.Text(), s.Attr("href"))
    })
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan fungsi goquery.NewDocument untuk mendapatkan halaman HTML halaman utama laman web Hacker News, dan kemudian gunakan pemilih untuk pilih semua kelas sebagai tajuk teg, dan traverse untuk mengeluarkan kandungan dan pautan setiap teg. Perlu diingatkan bahawa kita perlu mengimport pakej goquery di kepala kod:

import (
    "github.com/PuerkitoBio/goquery"
)
Salin selepas log masuk

4 Gunakan goroutine dan saluran untuk mengendalikan permintaan serentak

Kerana terdapat sejumlah besar permintaan. yang perlu diproses dalam pembangunan crawler, jadi sangat perlu menggunakan goroutine dan saluran untuk pemprosesan serentak. Dalam bahasa Go, kita boleh menggunakan kata kunci go untuk mencipta goroutine dan menggunakan saluran untuk komunikasi. Berikut ialah contoh kod:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
    "net/http"
)

func main() {
    // 定义需要处理的 URL 列表
    urls := []string{"https://www.baidu.com", "https://www.google.com", "https://www.bing.com"}

    // 定义一个通道,用于传递返回结果
    results := make(chan string)

    // 启动多个 goroutine,进行并发请求
    for _, url := range urls {
        go func(url string) {
            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)
            }

            // 提取页面信息
            title := doc.Find("title").Text()

            // 将结果传递到通道中
            results <- fmt.Sprintf("%s: %s", url, title)
        }(url)
    }

    // 读取所有的通道结果
    for i := 0; i < len(urls); i++ {
        fmt.Println(<-results)
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula menentukan senarai URL yang perlu dirangkak, dan kemudian mencipta saluran untuk menyampaikan hasil yang dikembalikan oleh setiap permintaan. Seterusnya, kami memulakan berbilang goroutine dan menghantar keputusan setiap goroutine ke dalam saluran. Akhirnya, dalam program utama, kami membaca semua hasil daripada saluran melalui gelung dan mengeluarkannya ke konsol.

5. Ringkasan

Melalui pengenalan artikel ini, kita dapat melihat bahawa penggunaan bahasa Go adalah sangat mudah untuk pembangunan perangkak. Mod konkurensi yang cekap bagi bahasa Go dan goquery perpustakaan penghuraian HTML yang sangat baik menjadikan pembangunan perangkak lebih pantas, lebih cekap dan lebih mudah untuk digunakan. Pada masa yang sama, anda juga perlu memberi perhatian kepada beberapa isu biasa, seperti larangan IP, mekanisme anti-crawler, dsb. Ringkasnya, memilih strategi perangkak dan cara teknikal yang sesuai serta menggunakan bahasa Go untuk pembangunan perangkak boleh membantu kami menyelesaikan tugas pengumpulan data dan perlombongan maklumat dengan lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan bahasa Go untuk pembangunan perangkak?. 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