如何在深度为1和多个链接并行模式下运行go colly

cgfeq70w  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(313)

我有一个go colly项目,我用它来抓取多个链接,我从一个表中获取,如下所示:

func main() {
    //db, err := sql.Open("postgres", "postgresql://postgres:postgres@localhost:5432/db?sslmode=disable")
    dbutil.Init()
    defer dbutil.Close()

    db := dbutil.GetDB()

    rows, err := db.Query("SELECT id, link FROM cities_table") 
    for rows.Next() {
        
    for _, City := range cities {
            c := colly.NewCollector(
            colly.MaxDepth(1),
            colly.Async(true),
        )
        extensions.RandomUserAgent(c)
        c.Limit(&colly.LimitRule{DomainGlob: "*", Parallelism: 20})
        spider(c, db, City)
        baseURL := ThroughProxy(City)
        c.Visit(baseURL.String())
        c.Wait()
    }
}

在这个例子中,我设置了Parallelism: 20,但是因为我为每个记录创建了一个新的golly示例,并且因为maxDepth是1,所以它现在以并行模式工作。有没有什么方法可以并行运行这个爬虫程序并更快地得到结果?注意:如果我把这部分带出循环:

c := colly.NewCollector(
            colly.MaxDepth(1),
            colly.Async(true),
        )

我的最大深度不是每个网站1。1为所有网站。

jm81lzqq

jm81lzqq1#

看起来github.com/gocolly/colly/v2/queue是你需要的。
队列是一个请求队列,它使用收集器在多个线程中使用请求
下面的伪代码是从the official queue demo修改而来的:

package main

import (
    "fmt"

    "github.com/gocolly/colly/v2"
    "github.com/gocolly/colly/v2/queue"
)

func main() {
    c := colly.NewCollector(
        colly.MaxDepth(1),
    )

    // spider(c, db, city)
    // registers functions to be executed

    q, _ := queue.New(
        20,
        &queue.InMemoryQueueStorage{MaxSize: 10000},
    )

    // rows, err := db.Query("SELECT id, link FROM cities_table")
    cities := []string{}

    for _, city := range cities {
        // extensions.RandomUserAgent(c)
        // call q.AddRequest to add a request with User-Agent header if you need it.

        // baseURL := ThroughProxy(city)
        baseURL := city
        if err := q.AddURL(baseURL); err != nil {
            fmt.Printf("failed to add URL: %s\n%v", baseURL, err)
        }
    }

    err := q.Run(c)
    if err != nil {
        fmt.Printf("failed to run: %s", err)
    }
}

相关问题