原標題:聽說你沒有python項目可做,我教你個方法
學習了一段時間的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對網頁進行訪問,獲取數據:
import requests
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這個更為靠譜些,就選擇它了。
后面全部都是這個東西,那就是我們所需要的了。
下面我們就要建立一個函數,三個參數是需要我們自己輸入的。
def get_code(language, size, repo):
這三個參數都是為了組成URL的,那這里面我們也要寫上URL的內容:
url = GetCodeApi +"language:" + language + "+size:" + size +"+repo:" + repo
這樣就可以訪問GitHub的接口了,但是我們要用它,讀取這個JSON內容:
info =requests.get(url).json()
外加一個循環來進行重復性的操作:
if 'items' in info:
for i ininfo['items']:
print(i['html_url'])
構建完了整個的函數。下面放上完整版:
def get_code(language, size, repo):
url = GetCodeApi +"language:" + language + "+size:" + size +"+repo:" + repo
# 訪問GitHub接口
info =requests.get(url).json()
if 'items' in info:
for i ininfo['items']:
print(i['html_url'])
好,構建完了這個之后,我們就要進行下一步了,在上一步中我們實際上解決了兩個問題;
一個是如何查找所有的python語言的項目,第二個是怎么限制文件的大小。
接下來需要解決的就是判斷時間的問題,我們需要找到JSON里面寫的這個:
方框中這兩個值比較重要,第一個帶黃底的是建立時間,第二個是更新時間。
框選兩個是方便我們進行篩選,如果想找建立時間的,就用created_at進行判斷,如果想找更新時間的就用updated_at來判斷。
def get_project(FindTime):
info = requests.get(GetRepoApi).json()
for I in info[‘items’]:
created_time = i[‘created_at’]
當然了,這里面我們找的是建立時間的,也可以找更新時間的(更新時間的感覺項目會更多一些),
如果要是更新時間的就將created_at改為updated_at就可以了。
if created_time > FindTime
如果建立時間大于查找時間的時候,就執行下面的內容(這里給內容直接寫死了,大家可以開動一下腦筋改一下~改為自己輸入哦~):
language ="python"
size = "<200"
現在看到其實語言和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’)
好,那就給這部分的代碼完整版放出來咯
def get_project(FindTime):
info = requests.get(GetRepoAPI).json()
for i in info['items']:
created_time =i['created_at']
if created_time >last_week:
language ="python"
size ="<200"
repo =i['html_url'].replace("https://github.com/", "")
get_code(language,size, repo)
這樣我們就有取之不盡,用之不竭的小項目可以模仿,可以學習咯~
輸出的結果是這樣的:
最后,我將繼續扮演一個小白,努力創造一個努力學習的小白形象,技術代碼兩開花,弘揚中華文化,希望大家多多支持啊~返回搜狐,查看更多
責任編輯: