继上一篇博文Github资源中转至Gitlab后,本篇博文简单讲下爬取github某一仓库所有release文件的流程(方法不唯一,这里只是提供一种方法参考)。
通常我们要下载某一仓库的release文件时,你会发现有各种release版本,每个release版本下又可能有几十个或者上百个下载文件。如果要通过人工的方式去下,太不现实。所以本文介绍利用Github v4(graphql)API去爬取所有release版本下所有文件的方法。
这里给出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为例查询tagName
为v4.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=="
}
}
}
}
}
}
通过返回的查询结果我们就得到相应文件的name
、downloadUrl
以及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,接着根据自己的喜好选择爬虫引擎进行下载。