为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
眼眸繁星 2022-06-01 16:43:45
我正在用下面的代码试验 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()}
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号