Page Fetching and Link Extraction
Sahifani olish va havolalarni ajratish
Crawler'ning birinchi ikkita qismi: berilgan URL uchun HTML mazmunini olish (fetch), va o'sha mazmun ichidan havolalarni ajratish (extract). Bizning soxta "veb"imizda olish — oddiy map'dan o'qish, Composite Types kursidagi ikki qiymatli andaza bilan:
func FetchPage(pages map[string]string, url string) (string, error) {
html, ok := pages[url]
if !ok {
return "", fmt.Errorf("page not found: %s", url)
}
return html, nil
}Havolalarni ajratish uchun `regexp` paketidan foydalanamiz — HTML'dagi href="..." qismlarini topadigan naqsh (pattern):
var linkPattern = regexp.MustCompile(`href="([^"]+)"`)
func ExtractLinks(html string) []string {
matches := linkPattern.FindAllStringSubmatch(html, -1)
links := make([]string, 0, len(matches))
for _, m := range matches {
links = append(links, m[1])
}
return links
}regexp.MustCompile naqshni bir marta, dastur boshida tayyorlaydi (Must prefiksi — Errors Are Values kursidagi "bu yerda xato bo'lishi mumkin emas, bo'lsa panic qiling" andazasi: agar naqshning o'zi noto'g'ri yozilgan bo'lsa, bu dasturchining xatosi, ishga tushirish vaqtidagi muammo emas). FindAllStringSubmatch(html, -1) barcha mos kelishlarni topadi (-1 — cheksiz son), har biri ikkita elementli slice: to'liq moslik va qavs ichidagi guruh (([^"]+) — qo'shtirnoq ichidagi URL'ning o'zi).
>_ Exercise
FetchPage(pages map[string]string, url string) (string, error) funksiyasini yozing — berilgan pages map'idan URL'ning HTML mazmunini qaytaradi, topilmasa xato beradi. ExtractLinks(html string) []string funksiyasini yozing — berilgan linkPattern yordamida barcha href havolalarini topib qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Fetcher va link extractor — crawler'ning ikkita eng asosiy qismi: biri ma'lumotni oladi, ikkinchisi undan navbatdagi qadamlarni (havolalarni) chiqarib oladi. regexp paketi HTML kabi yarim-strukturaviy matndan naqsh bo'yicha ma'lumot ajratib olishning standart vositasi.
NEXT UP
Tracking Visited URLs
$ go run main.go
Kodingizni ishga tushiring