将 GitHub 数据保存到 SQLite 数据库中。
- 演示
- 如何安装
- 认证
- 抓取仓库的问题
- 抓取仓库的拉取请求
- 抓取仓库的问题评论
- 抓取仓库的提交
- 抓取仓库的发布
- 抓取仓库的标签
- 抓取仓库的贡献者
- 抓取用户或组织拥有的仓库
- 抓取特定的仓库
- 抓取用户已星标的仓库
- 抓取已星标特定仓库的用户
- 抓取 GitHub Actions 工作流程
- 抓取仓库的依赖项
- 抓取表情符号
- 进行已认证的 API 调用
https://github-to-sqlite.dogsheep.net/ 托管了一个 Datasette 演示站点,该站点展示了一个数据库,该数据库是通过 运行此工具 针对 Dogsheep GitHub 组织 中的所有仓库,以及 datasette 和 sqlite-utils 仓库生成的。
$ pip install github-to-sqlite
创建一个 GitHub 个人访问令牌: https://github.com/settings/tokens
运行此命令并粘贴您的新令牌
$ github-to-sqlite auth
这将在您当前目录中创建一个名为 auth.json
的文件,其中包含所需的值。要将文件保存到不同的路径或文件名,请使用 --auth=myauth.json
选项。
作为使用 auth.json
文件的替代方案,您可以将访问令牌添加到名为 GITHUB_TOKEN
的环境变量中。
issues
命令抓取指定仓库的所有问题。
$ github-to-sqlite issues github.db simonw/datasette
如果存在 auth.json
文件,它将使用文件中的令牌。对于公共仓库,无需认证即可工作,但请注意 GitHub 对未经认证的请求有严格的基于 IP 的速率限制。
您可以使用 -a
指向不同的 auth.json
文件位置
$ github-to-sqlite issues github.db simonw/datasette -a /path/to/auth.json
您可以使用 --issue
选项一次或多次来加载特定的问题
$ github-to-sqlite issues github.db simonw/datasette --issue=1
示例: 问题表
虽然拉取请求是一种问题,但单独抓取它们可以获得更多关于拉取请求的信息。例如,拉取请求是否已合并以及何时合并。
类似于抓取问题的 API,pull-requests
命令抓取指定仓库的所有拉取请求。
$ github-to-sqlite pull-requests github.db simonw/datasette
您可以使用 --pull-request
选项一次或多次来加载特定的拉取请求
$ github-to-sqlite pull-requests github.db simonw/datasette --pull-request=81
请注意,pull_requests
表上的 merged_by
列仅针对使用 --pull-request
选项加载的拉取请求填充 - GitHub API 在批量加载拉取请求时不会返回此字段。
您可以使用 --state
选项仅加载处于特定状态的拉取请求
$ github-to-sqlite pull-requests --state=open github.db simonw/datasette
可以使用 --org
加载整个组织(或多个组织)中的拉取请求
$ github-to-sqlite pull-requests --state=open --org=psf --org=python github.db
您可以使用搜索查询来查找拉取请求。请注意,最多只会加载 1000 个(这是 GitHub API 的限制),并且会丢失一些数据(base 和 head SHA)。使用搜索时,其他过滤器将被忽略;请将所有条件放入搜索本身中
$ github-to-sqlite pull-requests --search='org:python defaultdict state:closed created:<2023-09-01' github.db
示例: 拉取请求表
issue-comments
命令抓取仓库中所有问题的所有评论。
建议您先运行 issues
,以便每个导入的评论都可以有一个指向其对应问题的外键。
$ github-to-sqlite issues github.db simonw/datasette
$ github-to-sqlite issue-comments github.db simonw/datasette
您可以使用 --issue
选项仅加载该仓库中特定问题的评论,例如
$ github-to-sqlite issue-comments github.db simonw/datasette --issue=1
示例: 问题评论表
commits
命令抓取一个或多个仓库的所有提交的详细信息。它目前抓取 SHA、提交消息以及作者和提交者详细信息;它不抓取完整的提交正文。
$ github-to-sqlite commits github.db simonw/datasette simonw/sqlite-utils
该命令接受一个或多个仓库。
默认情况下,一旦看到先前已抓取的提交,它就会停止。您可以使用 --all
强制它抓取所有提交(包括先前已插入的提交)。
示例: 提交表
releases
命令抓取一个或多个仓库的发布。
$ github-to-sqlite releases github.db simonw/datasette simonw/sqlite-utils
该命令接受一个或多个仓库。
示例: 发布表
tags
命令抓取一个或多个仓库的所有标签。
$ github-to-sqlite tags github.db simonw/datasette simonw/sqlite-utils
示例: 标签表
contributors
命令抓取一个或多个仓库的所有贡献者的详细信息。
$ github-to-sqlite contributors github.db simonw/datasette simonw/sqlite-utils
该命令接受一个或多个仓库。它填充一个 contributors
表,该表包含指向 repos
和 users
的外键,还有一个 contributions
表,列出每个贡献者对该仓库的提交数量。
示例: 贡献者表
repos
命令抓取属于用户或组织的仓库。
不带任何其他参数时,此命令将抓取当前已认证用户拥有、协作或通过其组织之一可访问的所有仓库
$ github-to-sqlite repos github.db
要抓取属于特定用户或组织的仓库,请提供其用户名作为参数
$ github-to-sqlite repos github.db dogsheep # organization
$ github-to-sqlite repos github.db simonw # user
您可以传递多个用户名来同时抓取多个用户或组织的仓库
$ github-to-sqlite repos github.db simonw dogsheep
添加 --readme
选项可将仓库的 README 保存到名为 readme
的列中。添加 --readme-html
可将 README 的 HTML 渲染版本保存到名为 readme_html
的列中。
示例: 仓库表
您可以使用 -r
与 repos
命令一起使用一次或多次来仅抓取特定的仓库。
$ github-to-sqlite repos github.db -r simonw/datasette -r dogsheep/github-to-sqlite
starred
命令抓取用户已星标的仓库。
$ github-to-sqlite starred github.db simonw
如果您正在使用 auth.json
文件,则可以省略用户名来抓取已认证用户的星标仓库。
示例: 星标表
stargazers
命令抓取已星标指定仓库的用户。
$ github-to-sqlite stargazers github.db simonw/datasette dogsheep/github-to-sqlite
您可以使用 owner/repo
语法指定一个或多个仓库。
使用此命令抓取的用户将插入到 users
表中。显示他们星标了哪些仓库的多对多记录将添加到 stars
表中。
workflows
命令抓取每个仓库 .github/workflows
目录中的 YAML 工作流程配置,并解析它们以填充 workflows
、jobs
和 steps
表。
$ github-to-sqlite workflows github.db simonw/datasette dogsheep/github-to-sqlite
您可以使用 owner/repo
语法指定一个或多个仓库。
GitHub 依赖图可以显示依赖于特定仓库的其他 GitHub 项目,例如 simonw/datasette/network/dependents。
此数据尚无法通过 GitHub API 获取。scrape-dependents
命令抓取这些页面,并使用 GitHub API 加载依赖仓库的完整版本。
$ github-to-sqlite scrape-dependents github.db simonw/datasette
该命令接受一个或多个仓库。
添加 -v
以获得详细输出。
示例: 依赖项表
您可以使用 emojis
命令抓取 GitHub 支持的所有表情符号列表
$ github-to-sqlite emojis github.db
这将创建一个名为 emojis
的表,主键为 name
,并包含一个 url
列。
如果您添加 --fetch
选项,该命令还将抓取图像的二进制内容并将其放入 image
列中
$ github-to-sqlite emojis emojis.db -f
[########----------------------------] 397/1799 22% 00:03:43
然后您可以使用 datasette-render-images 插件直观地浏览它们。
示例: 表情符号表
github-to-sqlite get
命令提供了一个方便的快捷方式来执行已认证的 API 调用。创建 auth.json
文件(或设置 GITHUB_TOKEN
环境变量)后,您可以像这样使用它
$ github-to-sqlite get https://api.github.com/gists
这将对您提供的 URL 进行已认证的调用,并将结果 JSON 美观地打印到控制台。
您可以省略 https://api.github.com/
前缀,例如
$ github-to-sqlite get /gists
许多 GitHub API 使用 使用 HTTP Link header 进行分页。您可以使用 --paginate
跟踪分页并输出所有结果项的列表
$ github-to-sqlite get /users/simonw/repos --paginate
您可以使用 --nl
为每个项输出换行符分隔的 JSON。这对于将项流式传输到另一个工具非常有用。
$ github-to-sqlite get /users/simonw/repos --nl