Всем привет, в этой статье мы рассмотрим небольшой пример кода, написанного для сбора данных с сайта на популярном сегодня языке программирования Go. Эта статья будет особенно интересна тем, кто много слышал о Го, но еще не пробовал его на себе.
Для одного из наших внутренних проектов нам нужно было собрать данные о фильмах, которые идут в кинотеатрах, и расписаниях показов.
Теперь рассмотрим первую (самую простую) версию парсера, с которой все и началось.
Для тех, кому лень читать код статьи, сразу дам ссылку на репозиторий .
В своей первой версии парсер мог собирать только следующую информацию:
- О показах в одном кинотеатре,
- Подробное описание,
- Имя,
- Студия,
Google возвращает большое количество вариантов по запросу `golang web Scraping`, многие из них отражены в этом список , советую с ним ознакомиться, я выбрал гезийор , так как он поддерживает JS Rendering (который, кстати, мы не будем использовать в этом примере, но эта возможность может оказаться очень полезной при парсинге сайтов) и достаточно прост в использовании.
Итак, библиотека выбрана, следующий шаг — ее установить и начать использовать в коде.
Установка библиотеки предельно проста:
Теперь перейдем к написанию кода.go get -u github.com/geziyor/geziyor
Внутри тела основной функции мы вызовем парсер, передадим ему URL страницы, с которой начнем собирать данные, и укажем, что хотим экспортировать результат в JSON-файл:
func main() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs: []string{" https://kinoteatr.ru/raspisanie-kinoteatrov/city/# "},
ParseFunc: parseMovies,
Exporters: []export.Exporter{&export.JSON{}},
}).
Start()
}
Начало положено, но логика сбора данных отсутствует; для этого вам нужно реализовать функцию parseMovies .
Логика сбора будет следующей:
- Найдите блок, содержащий информацию о фильме,
- Сбор информации обо всех сессиях внутри этого блока,
- Собирая название фильма и киностудии,
- Собираем ссылку на страницу с подробной информацией о фильме,
- Собираем описания с этой страницы
Перейдем к реализации этой функции
Здесь для дальнейшей обработки выбираются все блоки, содержащие информацию о фильме.
func parseMovies(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.shedule_movie").
Each(func(i int, s *goquery.Selection) {
Таким образом информация о сессиях собирается и сразу же преобразуется в удобную для человека форму (убираем лишние пробелы и отступы на новой строке).
var sessions = strings.Split(s.Find(".
shedule_session_time").
Text(), " \n ")
sessions = sessions[:len(sessions)-1]
for i := 0; i < len(sessions); i++ {
sessions[i] = strings.Trim(sessions[i], "\n ")
}
Этот блок кода отвечает за получение страницы с подробной информацией о фильме и получение его описания.
if href, ok := s.Find("a.gtm-ec-list-item-movie").
Attr("href"); ok { g.Get(r.JoinURL(href), func(_g *geziyor.Geziyor, _r *client.Response) { description = _r.HTMLDoc.Find("span.announce p.movie_card_description_inform").
Text()
description = strings.ReplaceAll(description, "\t", "")
description = strings.ReplaceAll(description, "\n", "")
description = strings.TrimSpace(description)
Вот как вызывается API для экспорта результатов в файл JSON.
g.Exports <- map[string]interface{}{
"title": strings.TrimSpace(s.Find("span.movie_card_header.title").
Text()), "subtitle": strings.TrimSpace(s.Find("span.sub_title.shedule_movie_text").
Text()),
"sessions": sessions,
"description": description,
}
Ура, все готово! Остается только объединить написанные блоки кода вместе и приступить к парсингу.
Так работает парсер, мы видим в терминале сообщения об успешном получении страниц, это удобно.
А вот как выглядит результат разбора.
Спасибо за прочтение статьи, люблю программирование на Go.
Теги: #Go #golang #парсинг
-
Спектроскопия
19 Oct, 24 -
Избыточность В Kubernetes: Она Существует
19 Oct, 24 -
Краткий Обзор Движков Таблиц Mysql
19 Oct, 24 -
Пишем Первого Робота Для Банка
19 Oct, 24