我正在用下面的代码试验 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))
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消