Rumah > pembangunan bahagian belakang > Golang > Cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih

Cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih

PHPz
Lepaskan: 2023-10-27 19:34:52
asal
760 orang telah melayarinya

Cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih

Cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih

Pengenalan:
Dengan perkembangan pesat teknologi Internet, perangkak web semakin digunakan dalam bidang seperti perlombongan data, pengoptimuman enjin carian dan pengumpulan maklumat. Antaranya, perangkak teragih boleh menggunakan sepenuhnya sumber kluster dan meningkatkan kecekapan dan kestabilan rangkak. Artikel ini akan memperkenalkan cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih yang mudah, bertujuan untuk membantu pembaca memahami dan menggunakan teknologi yang berkaitan dengan lebih baik.

1. Persediaan
Sebelum memulakan contoh artikel ini, kita perlu melengkapkan persediaan berikut:

  1. Pasang persekitaran pembangunan bahasa Go: Sila pastikan komputer anda telah memasang persekitaran pembangunan bahasa Go dengan betul dan mengkonfigurasi persekitaran yang sepadan pembolehubah.
  2. Pasang Redis: Redis ialah pangkalan data dalam memori sumber terbuka yang boleh digunakan untuk menyimpan maklumat seperti baris gilir tugas dan hasil program perangkak. Sila pasang Redis mengikut jenis dan versi sistem pengendalian anda, dan mulakan perkhidmatan Redis.

2. Struktur projek dan contoh kod
Kami akan menggunakan bahasa Go untuk menulis program perangkak teragih yang mudah Berikut ialah struktur direktori asas projek:

  • crawler

    • worker. go
    • conn.go
main.go
    Buat fail bernama main.go dan tulis kod berikut:

  1. package main
    
    import (
        "fmt"
        "net/http"
        "strconv"
    )
    
    func main() {
        // 创建一个任务队列,用来存储待爬取的URL
        taskQueue := make(chan string)
        go func() {
            // 将待爬取的URL加入到任务队列中
            for i := 1; i <= 10; i++ {
                url := "http://example.com/page" + strconv.Itoa(i)
                taskQueue <- url
            }
            close(taskQueue)
        }()
    
        // 创建一定数量的爬虫协程,并从任务队列中获取URL进行爬取
        for i := 0; i < 5; i++ {
            go func() {
                for url := range taskQueue {
                    resp, err := http.Get(url)
                    if err != nil {
                        fmt.Println("Failed to crawl", url)
                    } else {
                        fmt.Println("Crawled", url)
                        // TODO: 解析和处理网页内容
                    }
                }
            }()
        }
    
        // 阻塞主进程
        select {}
    }
    Salin selepas log masuk
  2. Dalam main.go, kami mencipta baris gilir tugasan dan letakkannya dalam Tambah URL untuk dirangkak ke goroutine yang berasingan. Kemudian, kami mencipta beberapa coroutine perangkak (5 di sini) untuk merangkak dengan mendapatkan URL daripada baris gilir tugas.

worker.go
    Seterusnya, kami mencipta fail bernama worker.go dan menulis kod berikut:

  1. package main
    
    import (
        "fmt"
        "github.com/go-redis/redis"
    )
    
    func main() {
        // 连接Redis数据库
        client := redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "",
            DB:       0,
        })
    
        // 创建一个爬虫任务队列
        taskQueue := make(chan string)
    
        // 监听Redis的任务队列,并将任务URL加入到爬虫任务队列中
        go func() {
            for {
                task, err := client.BLPop(0, "task_queue").Result()
                if err == nil {
                    url := task[1]
                    taskQueue <- url
                }
            }
        }()
    
        // 创建一定数量的爬虫协程,并从爬虫任务队列中获取URL进行爬取
        for i := 0; i < 5; i++ {
            go func() {
                for url := range taskQueue {
                    fmt.Println("Crawling", url)
                    // TODO: 真正的爬虫逻辑
                    // 将爬取结果保存到Redis或其他存储介质中
                }
            }()
        }
    
        // 阻塞主进程
        select {}
    }
    Salin selepas log masuk
  2. Dalam worker.go, kami menyambung ke pangkalan data Redis dan mencipta baris gilir tugas crawler taskQueue. Kemudian, kami mendengar baris gilir tugas Redis dalam goroutine dan menambah URL tugasan pada baris gilir tugas perangkak. Akhir sekali, kami mencipta beberapa coroutine perangkak (5 di sini) untuk merangkak dengan mendapatkan URL daripada baris gilir tugas perangkak.

conn.go
    Buat fail bernama conn.go dan tulis kod berikut:

  1. package main
    
    import (
        "github.com/go-redis/redis"
    )
    
    // NewRedisClient 创建一个Redis客户端连接
    func NewRedisClient() *redis.Client {
        client := redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "",
            DB:       0,
        })
        return client
    }
    
    // AddTask 将任务URL加入到Redis的任务队列中
    func AddTask(client *redis.Client, url string) error {
        err := client.RPush("task_queue", url).Err()
        if err != nil {
            return err
        }
        return nil
    }
    Salin selepas log masuk
  2. Dalam conn.go, kami merangkum kaedah NewRedisClient() untuk menyambung ke pangkalan data Redis dan menambah URL tugasan ke Kaedah Redis AddTask() dalam baris gilir tugas.

3. Jalankan program

Setelah selesai menulis kod di atas, kita boleh menjalankan program. Mula-mula buka tetingkap terminal, masukkan direktori akar projek, dan laksanakan arahan berikut untuk memulakan coroutine perangkak:

go run main.go
Salin selepas log masuk

Kemudian buka tetingkap terminal baharu, masukkan juga direktori akar projek, dan laksanakan arahan berikut untuk memulakan coroutine yang berfungsi :

go run worker.go
Salin selepas log masuk

4. Ringkasan

Melalui contoh kod di atas, kami telah mempelajari cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih yang mudah. Langkah utama termasuk: membuat baris gilir tugas, mencipta beberapa coroutine perangkak, memantau baris gilir tugas, mendapatkan URL daripada baris gilir tugas untuk merangkak, dsb. Pada masa yang sama, kami juga mempelajari cara menggunakan Redis sebagai alat pelaksanaan baris gilir tugas dan mendapatkan tugas daripada baris gilir tugas melalui arahan BLPop Redis. Saya harap artikel ini dapat membantu pemahaman dan amalan anda tentang perangkak teragih.

Atas ialah kandungan terperinci Cara menggunakan bahasa Go dan Redis untuk membangunkan perangkak teragih. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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