亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號