首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gocolly:如何防止重复抓取,仅限唯一url抓取一次

gocolly:如何防止重复抓取,仅限唯一url抓取一次
EN

Stack Overflow用户
提问于 2020-05-07 09:53:03
回答 1查看 703关注 0票数 0

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

我怀疑'Parallellsim:2‘导致了重复,然而,一些爬网消息urls每个重复了10次以上。

可在不同的网站上重现。

gocolly很瘦,也很棒。

代码语言:javascript
复制
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()
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-01 06:14:55

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

此外,您不需要将URL存储在上下文中,它总是在使用r.Request.URLOnResponse回调中可用。

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

代码语言:javascript
复制
log.Println(fmt.Sprintf("%d  DONE Visiting : %s", pageCount, r.Request.URL))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61648519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档