学习了一段时间的Python,最近出现了“饥荒”,感觉需要多看些代码,多学习学习别人做些什么,但却不知道做点什么来进行练习。
说到看代码,我就想到了全球最大的同性交友网站GitHub。
在GitHub上面找项目还不能漫无目的的去找啊,毕竟这是一个大宝库,里面的内容非常丰富;
不仅仅是有Python,还有JS,JAVA等很多很多的语言,如果一直盲目的看下去,会浪费大量的时间。
所以我就打算写一个小爬虫,来爬取一下GitHub上面我想要的小项目。
·首先既然是要练习python的项目,肯定语言是Python;
·其次,既然是小项目,那代码不会太长,我这里设置为150K-200K的文件大小,这样应该项目也会比较小;
·最后,我如果获取的是整个GitHub上面的这个大小的python项目,对我来说也是海量的,所以要限制数量,我这里限制为最近一个月发布的30个项目。
好了这就是我的需求了,一共三点,同样我们要去考虑一下,这三点的内容应该如何应对。
首先第一个就是怎么去找到所有的python项目呢?在这里我们使用了GitHub的API来获取项目,那首先来看一下API的形式。
https://api.github.com/search/code?q=language:想找的语言
这个输入了之后,就可以找到想找的语言的所有项目了。
但找到了并没有结束,还需要给爬下来,那这里面选择的是requests库,通过requests对网页进行访问,获取数据:
importrequests
GetCodeApi ="https://api.github.com/search/code?q="
GetRepoApi ="https://api.github.com/search/repositories?q=language:python"
在整个API中,设置的条件还有三个还要提供文件大小以及目录:
https://api.github.com/search/code?q=language:语言+size:大小+repo:目录
这里大家可能比较好奇为什么我可以构建出来这样的一个API,实际上是通过GitHub的API接口网站来找的,这里有一个例子:
我们可以看到里面有很多的字段,比如说我选中的这个字段,实际上就代表了这个文件的大小,那也是符合我们需要的字段,那就需要在这个API中体现出来。
repo这个参数在哪里呢?实际上这个参数在html_url中:
当然啦,你要是认为哪个repo是和full_name一样的话,也是可以的,其实我最开始也是这么认为的。
不过后来我看到了下面这个东西,就认为上面的那个html_url这个更为靠谱些,就选择它了。
后面全部都是这个东西,那就是我们所需要的了。
下面我们就要建立一个函数,三个参数是需要我们自己输入的。
defget_code(language, size, repo):
这三个参数都是为了组成URL的,那这里面我们也要写上URL的内容:
url= GetCodeApi +"language:"+ language +"+size:"+ size +"+repo:"+ repo
这样就可以访问GitHub的接口了,但是我们要用它,读取这个JSON内容:
info=requests.get(url).json()
外加一个循环来进行重复性的操作:
if'items'ininfo:
fori ininfo['items']:
print(i['html_url'])
构建完了整个的函数。下面放上完整版:
defget_code(language, size, repo):
url = GetCodeApi +"language:"+ language +"+size:"+ size +"+repo:"+ repo
# 访问GitHub接口
info =requests.get(url).json()
if'items'ininfo:
fori ininfo['items']:
print(i['html_url'])
好,构建完了这个之后,我们就要进行下一步了,在上一步中我们实际上解决了两个问题;
一个是如何查找所有的python语言的项目,第二个是怎么限制文件的大小。
接下来需要解决的就是判断时间的问题,我们需要找到JSON里面写的这个:
方框中这两个值比较重要,第一个带黄底的是建立时间,第二个是更新时间。
框选两个是方便我们进行筛选,如果想找建立时间的,就用created_at进行判断,如果想找更新时间的就用updated_at来判断。
defget_project(FindTime):
info = requests.get(GetRepoApi).json()
forIininfo[‘items’]:
created_time = i[‘created_at’]
当然了,这里面我们找的是建立时间的,也可以找更新时间的(更新时间的感觉项目会更多一些),
如果要是更新时间的就将created_at改为updated_at就可以了。
ifcreated_time > FindTime
如果建立时间大于查找时间的时候,就执行下面的内容(这里给内容直接写死了,大家可以开动一下脑筋改一下~改为自己输入哦~):
language="python"
size ="
现在看到其实语言和size写死了,但是这个repo真的不能写死啊,这时候上面的截图里面有些html_url的后面箭头指的是repo的,那我们需要提取出来:
repo=i['html_url'].replace("https://github.com/","")
这次就要激活一下上面写的查找函数了:
get_code(language,size, repo)
执行这个函数就OK了,但是这里面有个问题,就是这个时间的问题。
时间推荐直接手动修改字符串,例如get_project(‘2019-02-12T00:00:00Z’)
好,那就给这部分的代码完整版放出来咯
defget_project(FindTime):
info = requests.get(GetRepoAPI).json()
foriininfo['items']:
created_time =i['created_at']
ifcreated_time >last_week:
language ="python"
size ="
repo =i['html_url'].replace("https://github.com/","")
get_code(language,size, repo)
这样我们就有取之不尽,用之不竭的小项目可以模仿,可以学习咯~
输出的结果是这样的:
最后,我将继续扮演一个小白,努力创造一个努力学习的小白形象,技术代码两开花,弘扬中华文化,希望大家多多支持啊~
领取专属 10元无门槛券
私享最新 技术干货