在Golang上解析电影院站点

大家好,在本文中,我们将看一个小的示例代码,该示例代码是使用流行的编程语言Go now从站点收集数据的。

对于那些听说过很多Go但还没有自己尝试过的人来说,这篇文章会特别有趣。

对于一个内部项目,我们需要收集有关正在租借的电影和放映时间表的数据,现在我们将考虑解析器的第一个(最简单的)版本,所有版本均从该版本开始。

对于那些懒于阅读文章代码的人,我立即提供了到资源库的链接

在第一个版本中,解析器只能收集以下信息:

  • 关于一个电影院中的会议,
  • 详细说明,
  • 标题,
  • 工作室,

并将其保存在JSON中。最初,您需要选择适当的库进行解析。

Google为查询“ golang web scraping”提供了很多选项,许多选项都反映在此列表中,我建议您熟悉一下它,我选择geziyor,因为它支持JS渲染(顺便说一下,我们不会在其中使用例如,此功能在解析站点时非常有用),并且使用起来非常简单。

因此,选择了该库,下一步是安装它并开始在代码中使用它。
安装库非常简单:

go get -u github.com/geziyor/geziyor

现在让我们继续编写代码。

在main函数的主体内部,我们调用解析器,为它提供页面的URL,我们将从该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上编程。

All Articles