Parsing situs bioskop di Golang

Halo semuanya, dalam artikel ini kita akan melihat kode sampel kecil yang ditulis untuk mengumpulkan data dari sebuah situs dalam bahasa pemrograman populer Go today.

Artikel ini akan sangat menarik bagi mereka yang telah banyak mendengar tentang Go, tetapi belum mencobanya sendiri.

Untuk salah satu proyek internal, kami perlu mengumpulkan data tentang film-film yang disewa dan jadwal pertunjukan, sekarang kami akan mempertimbangkan versi parser pertama (paling sederhana), yang dengannya semuanya dimulai.

Bagi mereka yang terlalu malas membaca kode artikel, saya langsung memberikan tautan ke repositori .

Dalam versi pertamanya, parser hanya dapat mengumpulkan informasi berikut:

  • Tentang sesi dalam satu bioskop,
  • Detil Deskripsi,
  • Judul,
  • Studio,

Dan simpan di JSON. Awalnya, Anda harus memilih pustaka yang sesuai untuk diuraikan.

Google memberikan sejumlah besar opsi untuk permintaan `golang web scraping`, banyak dari mereka tercermin dalam daftar ini , saya menyarankan Anda untuk membacanya, saya memilih geziyor , karena mendukung JS Rendering (yang, omong-omong, kami tidak akan menggunakan ini dalam contohnya, fitur ini sangat berguna ketika mem-parsing situs) dan cukup mudah digunakan.

Jadi, perpustakaan dipilih, langkah selanjutnya adalah menginstalnya dan mulai menggunakannya dalam kode.
Menginstal perpustakaan sangat sederhana:

go get -u github.com/geziyor/geziyor

Sekarang mari kita beralih ke penulisan kode.

Di dalam tubuh fungsi utama, kami memanggil parser, berikan URL halaman tempat kami akan mulai mengumpulkan data dan menunjukkan bahwa kami ingin mengekspor hasilnya ke file JSON:


func main() { 
    geziyor.NewGeziyor(&geziyor.Options{ 
        StartURLs: []string{"https://kinoteatr.ru/raspisanie-kinoteatrov/city/#"}, 
        ParseFunc: parseMovies, 
        Exporters: []export.Exporter{&export.JSON{}}, 
    }).Start() 
}

Sebuah permulaan telah dibuat, tetapi tidak ada cukup logika untuk mengumpulkan data, untuk ini kita perlu mengimplementasikan fungsi parseMovies .

Logika koleksi adalah sebagai berikut:

  • Cari blok yang berisi informasi film,
  • Pengumpulan informasi tentang semua sesi di dalam blok ini,
  • Koleksi nama film dan studio film,
  • Mengumpulkan tautan ke halaman dengan informasi terperinci tentang film,
  • Kumpulan deskripsi dari halaman ini

Mari beralih ke implementasi fungsi ini.


Di sini, semua blok yang berisi informasi tentang film dipilih untuk diproses lebih lanjut.

func parseMovies(g *geziyor.Geziyor, r *client.Response) {
    r.HTMLDoc.Find("div.shedule_movie").Each(func(i int, s *goquery.Selection) { 

Dengan cara ini, informasi tentang sesi dikumpulkan, dan kemudian dibawa ke formulir yang nyaman bagi seseorang (kami menghapus ruang ekstra dan inden pada baris baru).


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 ") 
}

Blok kode ini bertanggung jawab untuk mendapatkan halaman dengan informasi terperinci tentang film dan memperoleh deskripsi.


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) 

Ini memanggil API untuk mengekspor hasilnya ke file 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, 
}

Hore, kamu sudah selesai! Tetap hanya untuk menggabungkan blok kode yang ditulis bersama dan mulai parsing.

Ini adalah cara kerja pengurai, kita melihat pesan pada penerimaan sukses halaman di terminal, ini nyaman.



Dan ini adalah bagaimana hasil parsing terlihat.



Terima kasih telah membaca artikel, suka pemrograman di Go.

All Articles