CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-сайтов на Golang

Парсинг веб-сайтов на Golang
просмотров
2 мин чтение
#Парсер
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"

    polatyener-dev/golang_scraping: Пример парсинга данных с выбранного веб-сайта на языке Go (github.com)