Парсер
Парсинг веб-сайтов на Golang
Table Of Content
В этой статье мы рассмотрим процесс парсинга или извлечения данных с веб-сайта на языке Go. Здесь мы также увидим, как создавать и читать файлы JSON, а также использовать оконные формы в Windows.
ПРИМЕЧАНИЕ: Для работы с оконными формами нам понадобится компилятор C (для доступа к графическому драйверу).
- Сначала импортируем следующие библиотеки:
"encoding/json" // Используется для операций чтения и записи JSON."io/ioutil" // Позволяет работать с файлами"log" // Используется для записи сообщений об ошибках"net/http" // Используется для выполнения операций веб-сервера"strings" // Позволяет работать со строковыми значениями"fyne.io/fyne/v2" "fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/widget""github.com/PuerkitoBio/goquery" // Предоставляет функции для обработки и запроса HTML-документов, включая цепочку синтаксиса, похожую на jQuery. Кроме того, библиотека fyne позволяет работать с оконными формами.
- Определяем структуру данных (struct), которая будет использоваться для создания JSON файла:
type Scrapings struct {Title string `json:"title"`}
- В функции main определяем действия, которые будут выполняться при запуске программы:
func main() {createJson() // Вызываем функцию для парсинга данных и создания JSON.
/** В следующем коде мы считываем данные из созданного нами JSON файла и сохраняем их в переменной jsonData.**/
var jsonData []Scrapingsjsondatafile, _ := ioutil.ReadFile("output.json")
json.Unmarshal(jsondatafile, &jsonData)/** Создаем новую оконную форму и задаем ее заголовок и размеры **/
ma := app.New()
mw := ma.NewWindow("List Data")
mw.Resize(fyne.NewSize(400, 400))
/** Определяем виджет списка и указываем, что количество элементов в списке будет равно количеству данных в переменной jsonData. Затем создаем новую метку и выводим значения данных через эту метку.**/
lst := widget.NewList(
func() int {
return len(jsonData)
},
func() fyne.CanvasObject {
return widget.NewLabel("")
},
func(lii widget.ListItemID, co fyne.CanvasObject) {
co.(*widget.Label).SetText(jsonData[lii].Title)
},
)
/** Указываем, что виджет списка будет содержимым формы и запускаем форму. **/
mw.SetContent(container.NewVScroll(lst))
mw.ShowAndRun()
}
- В следующей функции мы выполняем парсинг данных и создаем JSON файл:
func createJson() {
/** Указываем ссылку, с которой будем извлекать данные, и выводим возможные ошибки в лог.**/
res, err := http.Get("[http://yenerpolat.com/blog/](http://yenerpolat.com/blog/)")
if err != nil {
log.Fatal(err)
}defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("Код ошибки: %d %s", res.StatusCode, res.Status)
}
/** Преобразуем HTML-контент в документ goquery. **/
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
/** Ищем данные на странице с помощью указанных классов и извлекаем данные с тегом a в соответствии с определенной структурой данных в начале страницы.**/
var data []Scrapings
doc.Find(".article-content .entry-title").Each(
func(i int, s *goquery.Selection) {
title := Scrapings{Title: strings.TrimSpace(s.Find("a").Text())}
data = append(data, title)
},
)
/** Создаем файл output.json и записываем данные в файл. Здесь вы можете вернуть данные вместо создания файла и вывести их в main функции.**/
file, _ := json.MarshalIndent(data, "", " ")
_ = ioutil.WriteFile("output.json", file, 0644)
}
С помощью вышеуказанных кодов мы получаем данные с веб-сайта, записываем их в JSON файл, затем считываем файл и выводим полученные данные в виде списка на оконной форме.
И, наконец, чтобы при запуске формы не открывалось стандартное черное окно командной строки, вы можете использовать следующий код при сборке:
go build -ldflags="-H windowsgui"