大家好,在本文中,我们将看一个小的示例代码,该示例代码是使用流行的编程语言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上编程。