Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menulis crawler golang

Cara menulis crawler golang

王林
王林asal
2023-05-10 11:12:07573semak imbas

Golang ialah bahasa pengaturcaraan moden yang sesuai untuk menulis perangkak web yang cekap dan serentak. Ciri konkurensi tinggi Golang boleh mempercepatkan merangkak, dan sintaksnya ringkas serta mudah dipelajari dan difahami. Artikel ini akan memperkenalkan secara terperinci cara menulis perangkak web mudah menggunakan Golang.

  1. Pasang Golang

Mula-mula, anda perlu memasang Golang. Anda boleh memuat turun dan memasang fail binari sistem pengendalian yang sepadan dari tapak web rasmi (https://golang.org/dl/). Selepas pemasangan, anda perlu menetapkan pembolehubah persekitaran. Pada Linux dan Mac, anda boleh mengedit fail ~/.bashrc dan menambah yang berikut pada penghujung fail:

eksport GOPATH=$HOME/go
eksport PATH=$PATH:$GOPATH/ bin

Pada Windows, anda boleh mengedit pembolehubah persekitaran dan menambah GOPATH pada pembolehubah persekitaran dan menambah %GOPATH% ke PATH.

  1. Gunakan Modul Go untuk mengurus tanggungan

Dalam Golang 1.13 dan ke atas, Modul Go diiktiraf secara rasmi sebagai alat pengurusan pergantungan rasmi. Kami boleh menggunakannya untuk mengurus kebergantungan projek kami. Pergi ke direktori akar projek dan laksanakan arahan berikut:

go mod init spider

akan mencipta fail go.mod, yang mengandungi maklumat tentang projek spider.

  1. Membina klien HTTP

Menulis klien HTTP memerlukan penggunaan pakej net/http yang disertakan dengan Golang. Pakej ini melaksanakan semua butiran protokol HTTP, termasuk menghuraikan permintaan dan respons HTTP.

Pertama, kami mencipta klien HTTP baharu:

func newHTTPClient(timeout time.Duration) *http.Client {

return &http.Client{
    Timeout: timeout,
}

}

Kami boleh gunakan klien ini untuk menghantar permintaan HTTP GET:

func fetch(rentetan url) (rentetan, ralat) {

client := newHTTPClient(time.Second * 5)
resp, err := client.Get(url)
if err != nil {
    return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status)
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
return string(bodyBytes), nil

}

Fungsi fetch akan mengembalikan halaman web yang diminta kandungan dan sebarang kesilapan. Kami menggunakan kata kunci tangguh untuk memastikan badan respons ditutup apabila fungsi kembali.

  1. Menghuraikan HTML

Setelah kami berjaya mendapatkan kod sumber halaman web, kami perlu menghuraikan HTML untuk mendapatkan maklumat yang diperlukan. Kita boleh menggunakan pakej standard html/template bahasa Go (templat HTML) dan html/parse (penghuraikan HTML).

func parse(htmlContent string) {

doc, err := html.Parse(strings.NewReader(htmlContent))
if err != nil {
    log.Fatal(err)
}
// Do something with doc...

}

Kita boleh menggunakan fungsi html.Parse untuk menghuraikan kod sumber HTML dan mengembalikannya sebagai struktur pokok. Kita boleh mendapatkan maklumat yang diperlukan dengan melintasi struktur pokok ini secara rekursif.

  1. Gunakan ungkapan biasa

Kadangkala, kita perlu mengekstrak maklumat khusus daripada kod sumber HTML, seperti pautan URL atau sekeping teks. Dalam kes ini kita boleh menggunakan ungkapan biasa. Golang mempunyai sokongan yang sangat baik untuk ungkapan biasa, dan kami boleh menggunakan pakej regexp untuk melaksanakan ungkapan biasa.

Sebagai contoh, jika kita perlu mengekstrak pautan semua teg daripada kod sumber HTML, kita boleh menggunakan kod berikut:

func extractLinks(htmlContent string) []string {

linkRegex := regexp.MustCompile(`href="(.*?)"`)
matches := linkRegex.FindAllStringSubmatch(htmlContent, -1)
var links []string
for _, match := range matches {
    links = append(links, match[1])
}
return links

}

Ungkapan biasa href="(.*?)" sepadan dengan semua pautan dan mengembalikan tatasusunan rentetan.

  1. Kod lengkap

Berikut ialah kod perangkak lengkap, yang memperoleh semua pautan teg pada halaman tapak web:

utama pakej

import (

"fmt"
"log"
"net/http"
"regexp"
"strings"
"time"

"golang.org/x/net/html"

)

const (

url = "https://example.com"

)

func main() {

htmlContent, err := fetch(url)
if err != nil {
    log.Fatal(err)
}
links := extractLinks(htmlContent)
for _, link := range links {
    fmt.Println(link)
}

}

func newHTTPClient(masa tamat masa. Tempoh) *http.Client {

return &http.Client{
    Timeout: timeout,
}

}

func fetch(rentetan url) (rentetan, ralat) {

client := newHTTPClient(time.Second * 5)
resp, err := client.Get(url)
if err != nil {
    return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status)
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
return string(bodyBytes), nil

}

func extractLinks(htmlContent string) []rentetan {

linkRegex := regexp.MustCompile(`href="(.*?)"`)
matches := linkRegex.FindAllStringSubmatch(htmlContent, -1)
var links []string
for _, match := range matches {
    links = append(links, match[1])
}
return links

}

func parse(htmlContent string) {

doc, err := html.Parse(strings.NewReader(htmlContent))
if err != nil {
    log.Fatal(err)
}
// Do something with doc...

}

Ringkasan

Menggunakan Golang untuk menulis perangkak web boleh meningkatkan kelajuan rangkak dengan sangat baik dan menggunakan bahasa yang berkuasa seperti Golang untuk menulis kod perangkak boleh mencapai kebolehselenggaraan dan kebolehskalaan yang lebih tinggi. Artikel ini menerangkan cara menulis perangkak mudah menggunakan Golang. Saya harap artikel ini dapat membantu pembaca yang ingin mempelajari perangkak web dan pembangun yang menggunakan Golang.

Atas ialah kandungan terperinci Cara menulis crawler golang. 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
Artikel sebelumnya:fungsi dan kaedah golangArtikel seterusnya:fungsi dan kaedah golang