Bagaimana untuk menghentikan crawler di golang

PHPz
Lepaskan: 2023-04-25 18:32:20
asal
704 orang telah melayarinya

Dengan perkembangan Internet, teknologi crawler secara beransur-ansur menjadi salah satu alat penting untuk mendapatkan maklumat rangkaian. Orang ramai boleh menggunakan teknologi perangkak untuk mendapatkan sejumlah besar data daripada tapak web untuk membuat analisis dan ramalan yang lebih tepat. Walau bagaimanapun, crawler juga menghadapi banyak kesukaran dan batasan Terutama dalam pengaturcaraan Golang, menghentikan crawler masih menjadi masalah biasa.

Golang ialah bahasa pengaturcaraan yang agak baharu, dan kemunculannya telah menarik perhatian meluas. Berbanding dengan bahasa lain, bahasa Go mempunyai kelebihan kecekapan, kesederhanaan, konkurensi, dll., jadi ia telah digunakan secara meluas dalam pengaturcaraan rangkaian, pengaturcaraan sistem, pengkomputeran awan dan bidang lain. Walau bagaimanapun, apabila menggunakan Golang dalam pengaturcaraan perangkak, kita juga perlu memberi perhatian kepada beberapa isu.

Secara umumnya, penulisan crawler melibatkan dua operasi asas, iaitu meminta halaman web dan menghuraikan halaman web. Pustaka standard Golang menyediakan dua pakej, "net/http" dan "goquery", yang digunakan untuk menghantar permintaan dan menghuraikan dokumen HTML masing-masing. Kami boleh menggunakan alatan ini untuk melaksanakan program perangkak yang lengkap Kodnya adalah seperti berikut:

package main

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

func main() {
    // Step 1: 发送请求
    url := "https://www.example.com"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    // Step 2: 解析网页
    doc, _ := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("a").Each(func(i int, s *goquery.Selection) {
        href, _ := s.Attr("href")
        fmt.Println(href)
    })
}
Salin selepas log masuk

Dalam kod ini, kami mula-mula menggunakan pakej "net/http" untuk menghantar permintaan HTTP, dan kemudian menggunakan " goquery "Pakej menghuraikan dokumen HTML untuk mendapatkan semua pautan dalam halaman web sasaran. Pada ketika ini, kita mungkin perlu mempertimbangkan cara untuk menghentikan pelaksanaan program perangkak.

Pendekatan biasa ialah menetapkan pembilang dan menghentikan perangkak apabila ia mencapai nilai tertentu. Dalam bahasa Go, anda boleh menggunakan penyataan "pilih" dan pembolehubah jenis "chan" untuk melaksanakan fungsi pemasa. Operasi khusus adalah seperti berikut:

package main

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

func main() {
    url := "https://www.example.com"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")

    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    doc, _ := goquery.NewDocumentFromReader(resp.Body)

    done := make(chan int)
    go func() {
        doc.Find("a").Each(func(i int, s *goquery.Selection) {
            href, _ := s.Attr("href")
            fmt.Println(href)
            if i == 10 { //停止条件
                done <- 1
            }
        })
    }()

    select {
    case <-done:
        fmt.Println("Done!")
    case <-time.After(time.Second * 10):
        fmt.Println("Time out!")
    }
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan pembolehubah "done" jenis "chan" untuk berkomunikasi Apabila kaunter mencapai nilai tertentu, mesej dihantar ke utama proses melalui pembolehubah "selesai" Ini menghentikan program perangkak daripada berjalan. Pada masa yang sama, kami juga menetapkan pemasa 10 saat Jika tugas merangkak tidak dapat diselesaikan dalam masa 10 saat, program akan berhenti secara automatik.

Untuk meringkaskan, dalam pengaturcaraan Golang, kita boleh menggunakan pakej "net/http" dan "goquery" dalam perpustakaan standard untuk menghantar permintaan dan menghuraikan dokumen HTML Pada masa yang sama, gunakan pernyataan "pilih". dan pembolehubah jenis "chan " untuk melaksanakan fungsi pemasa dan komunikasi. Alat ini boleh membantu kami menulis program perangkak yang cekap dan stabil, menghentikan pelaksanaan program tepat pada masanya apabila perlu dan mengelakkan pembaziran data yang tidak diperlukan dan penggunaan sumber pengkomputeran.

Atas ialah kandungan terperinci Bagaimana untuk menghentikan crawler di golang. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!