Rumah > Artikel > pembangunan bahagian belakang > Cara menulis crawler golang
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.
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.
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.
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.
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.
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.
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!