我正在用下面的代碼試驗 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 關注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消