CoderCastrov logo
CoderCastrov
Парсер

Как сделать парсинг веб-страниц на языке Go с использованием фреймворка Colly?

Как сделать парсинг веб-страниц на языке Go с использованием фреймворка Colly?
просмотров
2 мин чтение
#Парсер

Сначала создаем проект, как указано в официальной документации Go.

Открываем наш любимый редактор кода и создаем файл main.go. Затем в терминале VS Code или в терминале операционной системы в директории проекта запускаем команду go get -u github.com/gocolly/colly/... для установки фреймворка Colly. Если у вас возникнут проблемы во время установки, вы можете посетить http://go-colly.org/ и https://github.com/gocolly/colly, чтобы получить дополнительную информацию.

В нашем приложении мы хотим только одно - получить таблицу результатов Суперлиги с сайта TFF. Для этого вам потребуется базовое понимание HTML-тегов. Если вы раньше использовали селекторы CSS, то это будет для вас игра детства. Теперь давайте начнем писать код.

Создаем новый коллектор с помощью команды _c := colly.NewCollector(colly.AllowedDomains()). В этом приложении нам достаточно одного коллектора, поэтому мы не будем добавлять дополнительные. Однако, если вам понадобится в вашем проекте, вы можете создать коллекторы c2, c3, c4 и т. д., как создаете экземпляры структурного типа.

При использовании фреймворка Colly вы обязательно столкнетесь с обратными вызовами (callbacks). Эта структура, похожая на жизненный цикл Android, лучше всего объясняется в официальной документации...

c.OnRequest(func(r *colly.Request) {
    fmt.Println("Visiting", r.URL)
})

c.OnError(func(_ *colly.Response, err error) {
    log.Println("Something went wrong:", err)
})

c.OnResponseHeaders(func(r *colly.Response) {
    fmt.Println("Visited", r.Request.URL)
})

c.OnResponse(func(r *colly.Response) {
    fmt.Println("Visited", r.Request.URL)
})

c.OnHTML("a[href]", func(e *colly.HTMLElement) {
    e.Request.Visit(e.Attr("href"))
})

c.OnHTML("tr td:nth-of-type(1)", func(e *colly.HTMLElement) {
    fmt.Println("First column of a table row:", e.Text)
})

c.OnXML("//h1", func(e *colly.XMLElement) {
    fmt.Println(e.Text)
})

c.OnScraped(func(r *colly.Response) {
    fmt.Println("Finished", r.Request.URL)
})

Порядок вызова обратных вызовов

1. OnRequest

Вызывается перед запросом

2. OnError

Вызывается, если произошла ошибка во время запроса

3. OnResponseHeaders

Вызывается после получения заголовков ответа

4. OnResponse

Вызывается после получения ответа

5. OnHTML

Вызывается сразу после OnResponse, если полученный контент является HTML

6. OnXML

Вызывается сразу после OnHTML, если полученный контент является HTML или XML

7. OnScraped

Вызывается после обратных вызовов OnXML