登录
首页 >  Golang >  Go问答

gocolly:如何防止重复爬行,限制唯一的url爬行一次

来源:stackoverflow

时间:2024-04-13 14:48:35 238浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《gocolly:如何防止重复爬行,限制唯一的url爬行一次》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

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

我怀疑“parallellsim:2”导致了重复,但是,某些抓取消息 url 每个重复超过 10 次。

可在不同网站上重现。

gocolly 很精简而且很棒。

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()
}

解决方案


如果您使用 e.request.visit(link),则 ctx 在请求之间共享,因此其他请求可能会覆盖数据。在这些情况下尝试使用 c.visit()。它为每个请求创建新的上下文。

此外,您不需要在上下文中存储 url,它始终可以在使用 r.request.urlonresponse 回调中使用。

将日志消息更改为以下内容,以便能够看到真实的请求网址:

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

理论要掌握,实操不能落!以上关于《gocolly:如何防止重复爬行,限制唯一的url爬行一次》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>