Tracking Visited URLs
Ko'rilgan URL'larni kuzatish
Page Fetching darsidagi namunaviy saytga qarang: laptops sahifasi Homega qaytadigan havolaga ega — bu sikl hosil qiladi (DNS Resolver kursidagi Cycle Detection darsini eslang). Agar crawler bu sikldan xabarsiz bo'lsa, u bir xil sahifalarni abadiy qayta-qayta kezaveradi.
Yechim — Go Generics kursidagi Uniquega o'xshash ko'rilgan URL'lar to'plami: har bir URL'ni bir marta qayta ishlaymiz, ikkinchi marta uchraganda esa o'tkazib yuboramiz.
type VisitedSet struct {
seen map[string]bool
}
func (v *VisitedSet) MarkVisited(url string) bool {
if v.seen[url] {
return false // allaqachon ko'rilgan
}
v.seen[url] = true
return true // yangi, endi ko'rildi
}MarkVisited ikkita ishni birdaniga qiladi: tekshiradi va belgilaydi, bitta metodda — bu Project: Rate Limiter kursidagi "tekshir-va-amalga oshir" naqshining aynan o'zi. Qaytadigan bool — "bu URL bilan davom etish kerakmi?" degan savolga to'g'ridan-to'g'ri javob.
>_ Exercise
seen map[string]bool maydonli VisitedSet struct'ini va NewVisitedSet() *VisitedSet konstruktorini yozing. MarkVisited(url string) bool metodini yozing — agar URL allaqachon ko'rilgan bo'lsa false qaytaradi; aks holda uni ko'rilgan deb belgilab true qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Ko'rilgan URL'lar to'plami crawler'ni cheksiz sikllardan (bir-biriga qaytadigan havolalar) himoya qiladi. MarkVisited tekshirish va belgilashni bitta atomik qadamga birlashtiradi — bu keyingi darsda concurrent crawler yozganda hal qiluvchi ahamiyatga ega bo'ladi.
NEXT UP
Concurrent Crawl with Worker Pool
$ go run main.go
Kodingizni ishga tushiring