背景
上一篇文章Go 每日一库之 bubbletea我们介绍了炫酷的 TUI 程序框架 — bubbletea
。最后实现了一个拉取 GitHub Trending 仓库,并显示在控制台的程序。由于 GitHub 没有提供官方的 Trending API,我们用goquery
自己实现了一个。上篇文章由于篇幅关系,没有介绍如何实现。本文我整理了一下代码,并以单独的代码库形式开放出来。
先观察
首先,我们来观察一下 GitHub Trending 的结构:
左上角可以切换仓库(Repositories)和开发者(Developers)。右边可以选择语言(Spoken Language,本地语言,汉语、英文等)、语言(Language,编程语言,Golang、C++等)和时间范围(Date Range,支持 3 个维度,Today、This week、This month)。
然后下面是每个仓库的信息:
① 仓库作者和名字
② 仓库描述
③ 主要使用的编程语言(创建仓库时设置的),也可能没有
④ 星数
⑤ fork 数
⑥ 贡献者列表
⑦ 选定的时间范围内(Today、This week、This month)新增多少星数
开发者页面也是类似的,只不过信息少了很多:
① 作者信息
② 最火的仓库信息
注意到切换的开发者页面后,URL 变成为github.com/trending/developers
。另外当我们选择本地语言为中文、开发语言为 Go 和时间范围为 Today 后,URL 变为https://github.com/trending/go?since=daily&spoken_language_code=zh
,通过在 query-string 中增加相应的键值对表示这种选择。
准备
在 GitHub 上创建仓库ghtrending
,clone 到本地,执行go mod init
初始化:
$ go mod init github.com/darjun/ghtrending
然后执行go get
下载goquery
库:
$ go get github.com/PuerkitoBio/goquery
根据仓库和开发者的信息定义两个结构:
type Repository struct {
Author string
Name string
Link string
Desc string
Lang string
Stars int
Forks int
Add int
BuiltBy []string
}
type Developer struct {
Name string
Username string
PopularRepo string
Desc string
}
开爬
要想使用goquery
获取相应的信息,我们首先要知道,对应的网页结构。按 F12 打开 chrome 开发者工具,选择Elements
页签,即可看到网页结构:
使用左上角的按钮就可以很快速的查看网页上任何内容的结构,我们点击单个仓库条目:
右边Elements