zl程序教程

您现在的位置是:首页 >  工具

当前栏目

爬取github仓库所有release文件

GitHub文件 所有 仓库 爬取 Release
2023-09-11 14:17:50 时间

继上一篇博文Github资源中转至Gitlab后,本篇博文简单讲下爬取github某一仓库所有release文件的流程(方法不唯一,这里只是提供一种方法参考)。

通常我们要下载某一仓库的release文件时,你会发现有各种release版本,每个release版本下又可能有几十个或者上百个下载文件。如果要通过人工的方式去下,太不现实。所以本文介绍利用Github v4(graphql)API去爬取所有release版本下所有文件的方法。
release tagsrelease downloadUrl
这里给出Github v4(graphql)API测试网址(使用Github v4 API需要登录git账号):
https://developer.github.com/v4/explorer/
因为本例程使用github的graphql接口来获取下载信息的。接下来简单说下爬取流程:

  • 获取指定仓库的所有可下载的release tag信息
  • 遍历获取每个release tag下的所有release下载文件的url
  • 通过url爬取文件

查询指定仓库的所有release tag

下面给出用grapql语句,以sass/node-sass为例查询最新的5个release的tag信息(使用该graphql语句一次性最多只能查询100个结果):

{
  repository(name: "node-sass", owner: "sass") {
    releases(first: 5, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        tagName
      }
      pageInfo {
        endCursor
        hasNextPage
        hasPreviousPage
        startCursor
      }
    }
  }
}

查询结果如下:

{
  "data": {
    "repository": {
      "releases": {
        "nodes": [
          {
            "tagName": "v4.14.1"
          },
          {
            "tagName": "v4.14.0"
          },
          {
            "tagName": "v4.13.1"
          },
          {
            "tagName": "v4.13.0"
          },
          {
            "tagName": "v4.12.0"
          }
        ],
        "pageInfo": {
          "endCursor": "Y3Vyc29yOnYyOpK5MjAxOS0wNC0yNlQxODoxODoyMSswODowMM4BA13b",
          "hasNextPage": true,
          "hasPreviousPage": false,
          "startCursor": "Y3Vyc29yOnYyOpK5MjAyMC0wNS0wNVQwNzozNDoyNCswODowMM4Bjzrr"
        }
      }
    }
  }
}

通过返回的hasNextPage字段为true可知,还有tage信息没展示完。那么我们可以利用after字段接着查询下一页的tage信息,直到查询结果返回hasNextPage字段为false为止。下面就是接着上述结果查询下一页的示例,相比上面的graphql语句就多了个after字段,该字段的值就是上页返回的endCursor信息。

{
  repository(name: "node-sass", owner: "sass") {
    releases(first: 5, orderBy: {field: CREATED_AT, direction: DESC}, after: "Y3Vyc29yOnYyOpK5MjAxOS0wNC0yNlQxODoxODoyMSswODowMM4BA13b") {
      nodes {
        tagName
      }
      pageInfo {
        endCursor
        hasNextPage
        hasPreviousPage
        startCursor
      }
    }
  }
}

查询指定release tag版本下的所有下载url

下面给出用grapql语句,以sass/node-sass为例查询tagNamev4.14.1版本下的前2个下载文件url(使用该graphql语句一次性最多只能查询100个结果):

{
  repository(name: "node-sass", owner: "sass") {
    release(tagName: "v4.14.1") {
      releaseAssets(first: 2) {
        nodes {
          downloadUrl
          name
          size
        }
        totalCount
        pageInfo {
          endCursor
          hasNextPage
          hasPreviousPage
          startCursor
        }
      }
    }
  }
}

查询结果如下:

{
  "data": {
    "repository": {
      "release": {
        "releaseAssets": {
          "nodes": [
            {
              "downloadUrl": "https://github.com/sass/node-sass/releases/download/v4.14.1/darwin-x64-11_binding.node",
              "name": "darwin-x64-11_binding.node",
              "size": 3152608
            },
            {
              "downloadUrl": "https://github.com/sass/node-sass/releases/download/v4.14.1/darwin-x64-14_binding.node",
              "name": "darwin-x64-14_binding.node",
              "size": 3157792
            }
          ],
          "totalCount": 117,
          "pageInfo": {
            "endCursor": "Y3Vyc29yOnYyOpHOATeSLQ==",
            "hasNextPage": true,
            "hasPreviousPage": false,
            "startCursor": "Y3Vyc29yOnYyOpHOATeSLA=="
          }
        }
      }
    }
  }
}

通过返回的查询结果我们就得到相应文件的namedownloadUrl以及size信息,通过downloadUrl我们就能爬取相应的文件了。通过返回的hasNextPage字段为true可知,还有一些下载文件信息没展示完。那么我们可以利用after字段接着查询下一页的下载文件信息,直到查询结果返回hasNextPage字段为false为止。下面就是接着上述结果查询下一页的示例,相比上面的graphql语句就多了个after字段,该字段的值就是上页返回的endCursor信息。

{
  repository(name: "node-sass", owner: "sass") {
    release(tagName: "v4.14.1") {
      releaseAssets(first: 2, after: "Y3Vyc29yOnYyOpHOATeSLQ==") {
        nodes {
          downloadUrl
          name
          size
        }
        totalCount
        pageInfo {
          endCursor
          hasNextPage
          hasPreviousPage
          startCursor
        }
      }
    }
  }
}

通过以上方法就能获取到所有需要下载的release文件的url,接着根据自己的喜好选择爬虫引擎进行下载。