今天的主題是做一個簡單的GitHub的倉庫統計工具,目標是輸入GitHub用戶名獲取其所有倉庫的star以及fork數目,可以看作是一個簡單的爬蟲實戰。
我們利用requests爬取GitHub所提供的倉庫數據api,該api的格式如下,
https://api.github.com/users/<GitHub user name>/repos
這些json格式的數據是很方便解析的,我們只需要獲取倉庫名,倉庫語言,標星數目以及fork數目這些Key對應的值即可。需要注意的是,fork而來的倉庫不計算在內,因而我們需要對該布爾值進行判斷,篩選出所有自建的倉庫。
defcrawl(name):
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
flag=True
repo=[]
page=1
while flag:
url='https://api.github.com/users/{}/repos?page={}'.format(name,page)
try:
r=requests.get(url,headers=headers)
data=r.json()
if len(data) == 0:
flag=False
for i in data:
if not i['fork']:
repo.append([i['name'],i['language'],i['stargazers_count'],i['forks_count']])
page+=1
except Exception as e:
print(e)
break
repo=sorted(repo, key=lambda x: x[2], reverse=True)
repo.append(['Total','/',sum([i[2] for i in repo]), sum([i[3] for i in repo])])
return repo
獲取數據之後做一些簡單的處理,按照star數目將repo列表從高到低排列,接着對該用戶的所有倉庫進行加和統計。
接着就是數據的打印了,傳統的打印輸出不夠美觀,於是我用了prettytable,以表格的形式將倉庫的數據整齊美觀的打印出來。
defpretty_print(repo):
x=PrettyTable()
x.field_names=["Repository","language","Star","Fork"]
for i in repo:
x.add_row(i)
print(x)
下面以我的賬號爲例,展示一下效果
除了倉庫的api外,GitHub還提供了許多其它類型的api,可以用於查詢項目最新的提交信息,用戶的基本信息,用戶的follows列表等等,非常方便。
另外老肥的Python學習交流羣已建立,想要加入的童鞋後臺回覆「微信羣」即可。
有你想看的精彩
速速上車