GoDasturchi
Depth Limiting and Rate Limiting

Depth Limiting and Rate Limiting

Chuqurlik va tezlikni cheklash

Haqiqiy veb-saytlar millionlab sahifaga ega bo'lishi mumkin — cheklovsiz crawler abadiy ishlab, resurslarni tugatib qo'yishi mumkin. Ikkita muhim cheklov: chuqurlik (depth) — boshlang'ich sahifadan necha "qadam" uzoqlikkacha borish, va tezlik (rate) — bir vaqtda nechta sahifani qayta ishlash.

Chuqurlikni kuzatish uchun, navbatdagi har bir vazifaga uning chuqurligini ham qo'shib yuboramiz:

example.go
type job struct {
    url   string
    depth int
}

queue := []job{{start, 0}}

for len(queue) > 0 {
    current := queue[0]
    queue = queue[1:]
    // ... current.url ni qayta ishlash ...
    if current.depth < maxDepth {
        for _, link := range links {
            queue = append(queue, job{link, current.depth + 1})
        }
    }
}

Bu — Composite Types kursidagi struct'lar bilan bog'liq ma'lumotlarni birga saqlash g'oyasi: URL va uning chuqurligi endi bitta job sifatida birga sayohat qiladi. current.depth < maxDepth tekshiruvi — agar joriy sahifa allaqachon maksimal chuqurlikda bo'lsa, uning havolalarini navbatga qo'shmaymiz, shu bilan crawler'ning "qanchalik uzoqqa borishi"ni nazorat qilamiz. Sahifalar sonini cheklash uchun esa oddiygina yig'ilgan natijalar sonini kuzatib, yetarli bo'lganda to'xtaymiz.

>_ Exercise

job struct'ini (url string, depth int) ishlatib, CrawlWithLimits(pages map[string]string, start string, maxDepth, maxPages int) []string funksiyasini yozing. queuedan navbat bilan job oladi (ko'rilganlarni o'tkazib yuboradi), sahifani oladi, natijalarga qo'shadi, va agar current.depth < maxDepth bo'lsa, topilgan havolalarni navbatga (depth+1 bilan) qo'shadi. len(results) < maxPages bo'lguncha davom eting.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Har bir vazifaga uning chuqurligini biriktirib yuborish (job{url, depth}) crawler'ga "qanchalik uzoqqa borish kerak"ni bilish imkonini beradi. Natijalar sonini kuzatib, yetarli bo'lganda to'xtash esa umumiy ishlov hajmini nazorat qiladi — bu ikkalasi ham cheksiz yoki haddan tashqari katta crawl'larning oldini oladi.

NEXT UP

Crawl Results and Reporting

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Depth Limiting and Rate Limiting

Chuqurlik va tezlikni cheklash

Haqiqiy veb-saytlar millionlab sahifaga ega bo'lishi mumkin — cheklovsiz crawler abadiy ishlab, resurslarni tugatib qo'yishi mumkin. Ikkita muhim cheklov: chuqurlik (depth) — boshlang'ich sahifadan necha "qadam" uzoqlikkacha borish, va tezlik (rate) — bir vaqtda nechta sahifani qayta ishlash.

Chuqurlikni kuzatish uchun, navbatdagi har bir vazifaga uning chuqurligini ham qo'shib yuboramiz:

example.go
type job struct {
    url   string
    depth int
}

queue := []job{{start, 0}}

for len(queue) > 0 {
    current := queue[0]
    queue = queue[1:]
    // ... current.url ni qayta ishlash ...
    if current.depth < maxDepth {
        for _, link := range links {
            queue = append(queue, job{link, current.depth + 1})
        }
    }
}

Bu — Composite Types kursidagi struct'lar bilan bog'liq ma'lumotlarni birga saqlash g'oyasi: URL va uning chuqurligi endi bitta job sifatida birga sayohat qiladi. current.depth < maxDepth tekshiruvi — agar joriy sahifa allaqachon maksimal chuqurlikda bo'lsa, uning havolalarini navbatga qo'shmaymiz, shu bilan crawler'ning "qanchalik uzoqqa borishi"ni nazorat qilamiz. Sahifalar sonini cheklash uchun esa oddiygina yig'ilgan natijalar sonini kuzatib, yetarli bo'lganda to'xtaymiz.

>_ Exercise

job struct'ini (url string, depth int) ishlatib, CrawlWithLimits(pages map[string]string, start string, maxDepth, maxPages int) []string funksiyasini yozing. queuedan navbat bilan job oladi (ko'rilganlarni o'tkazib yuboradi), sahifani oladi, natijalarga qo'shadi, va agar current.depth < maxDepth bo'lsa, topilgan havolalarni navbatga (depth+1 bilan) qo'shadi. len(results) < maxPages bo'lguncha davom eting.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Har bir vazifaga uning chuqurligini biriktirib yuborish (job{url, depth}) crawler'ga "qanchalik uzoqqa borish kerak"ni bilish imkonini beradi. Natijalar sonini kuzatib, yetarli bo'lganda to'xtash esa umumiy ishlov hajmini nazorat qiladi — bu ikkalasi ham cheksiz yoki haddan tashqari katta crawl'larning oldini oladi.

NEXT UP

Crawl Results and Reporting