gocolly:如何防止重复抓取,限制为唯一的 url 抓取一次

我正在用下面的代码试验 go-colly,它似乎多次爬取相同的 url,我如何限制一次爬取?

我怀疑 'Parallellsim:2' 导致了重复,但是,一些爬网消息 url 每个重复超过 10 次。

可在不同网站上重现。

gocolly 又瘦又好。

http://img2.mukewang.com/629726db00018fc813320463.jpg

func main() {

    c := colly.NewCollector(

        colly.AllowedDomains( "www.coursera.org"),

        colly.Async(true),

    )


    c.Limit(&colly.LimitRule{

        DomainGlob: "*",

         Parallelism: 2,

    })


    c.OnHTML("a[href]", func(e *colly.HTMLElement) {

        link := e.Attr("href")

        e.Request.Visit(link)

    })

    pageCount :=0

    c.OnRequest(func(r *colly.Request) {

        r.Ctx.Put("url", r.URL.String())

    })


    // Set error handler

    c.OnError(func(r *colly.Response, err error) {

        log.Println("Request URL:", r.Request.URL, "failed with response:", r, "\nError:", err)

    })


    // Print the response

    c.OnResponse(func(r *colly.Response) {

        pageCount++

        urlVisited := r.Ctx.Get("url")

        log.Println(fmt.Sprintf("%d  DONE Visiting : %s", pageCount, urlVisited))

    })


    baseUrl := "https://www.coursera.org"

    c.Visit(baseUrl)

    c.Wait()

}


眼眸繁星
浏览 171回答 1
1回答

小唯快跑啊

Ctx如果您使用 ,则在请求之间共享,e.Request.Visit(link)因此其他请求可能会覆盖数据。尝试c.Visit()在这些情况下使用。它为每个请求创建新的上下文。此外,您不需要将 URL 存储在上下文中,它始终可以在OnResponse回调中使用r.Request.URL.将您的日志消息更改为以下内容,以便能够看到真实的请求 url:log.Println(fmt.Sprintf("%d  DONE Visiting : %s", pageCount, r.Request.URL))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go