如何合法爬取 Github 的信息?

Posted by 陈树义 on 2022-02-12

前段时间因为工作需要,需要抓取 Github 上的一些信息。于是我就查了一些资料,看看如何能爬取到对应的信息。经过查询,发现 Github 有开放一些 HTTP 接口,可以让我们去调用。虽说直接调用 HTTP 接口也可以实现,但每次都要做入参和出参的封装,使用上非常麻烦。

经过一段时间的搜索,我发现了一款名为 GitHub API for Java 的 SDK,其对 Github 做了深度的封装,使得我们可以更方便地调用 Github 的 HTTP 接口。今天就跟大家介绍一下这款 SDK 的简单使用,方便朋友们后续使用。

鉴权方式

Github 提供了多种权限方式,例如:账号密码方式、Personal Access Token 方式、JWT 方式等。这款 SDK 对于这几种方式都支持了,并且还支持通过不同方式传递对应鉴权信息,例如:传参方式、配置文件方式、环境变量方式等等。这里我们只是简单地爬取数据,所以我们使用 Personal Access Token + 简单传参方式 就可以,其实例代码如下所示,非常简单。

GitHub github = new GitHubBuilder().withOAuthToken("my_personal_token").build();

Personal Access Token 的生成,在 Github Setting 的 Developer settings 中,如下图所示。如果你实在找不到,那么可以参考官方文档:创建个人访问令牌 - GitHub Docs

SDK 介绍

通过上面的介绍,我们可以知道通过 GithubBuilder 就可以获取一个 Github 对象,而该 Github 类对象其实就代表了 Github 这个网站。Github 类提供了各种方法,例如:获取 Github 的 IP 地址列表、获取所有组织列表等等,如下图所示。

其实这个 SDK 正是通过这种面向对象的方式设计的,除了最常用的 Github 类之外,还有下面这些类:

  • GHRepository 类:代表 Github 上的一个仓库
  • GHUser 类:代表 Github 上的一个用户
  • GHTeam 类:代表 Github 上的一个 Team
  • GHBranch:代表仓库的一个分支
  • 等等

基本上 Github 上的一切都用一个类来表示,一切都可以抽象为一个对象,这正是面向对象的精髓所在。 而每个类都提供了非常多的方法,例如 GHUser 类提供了方法 isMemberOf​(GHOrganization org) 方法来判断一个用户是否是某个组织的成员。

更多方法,大家可以直接查询其对应的 API 文档:Overview (GitHub API for Java 1.300 API)

快速入门

首先,在项目中引入该 maven 依赖,如下所示。

<dependency>
    <groupId>org.kohsuke</groupId>
    <artifactId>github-api</artifactId>
    <version>1.301</version>
</dependency>

接着直接写一个 HelloGithub 类,如下所示。

public class HelloGithub {
    public static void main(String[] args) throws IOException {
        GitHub github = new GitHubBuilder().withOAuthToken("my_personal_token").build();
        System.out.println(github.getMyself().getName());
    }
}

直接运行该类便可获取到的 token 对应用户的用户名,如下图所示。

这就是一个最简单的演示了,麻雀虽小五脏俱全,更多的功能等待大家去探索发现~

好了,这就是今天的简单分享,希望大家喜欢。


如果你喜欢今天这篇文章,欢迎一键三连,你们的支持就是我更新的最大动力!