import requests
def search_github_repositories ( keyword, token= None , language= None , max_results= 1000 ) :
"""
通过 GitHub API 搜索仓库,支持分页获取所有结果(最多 1000 条)
:param keyword: 搜索关键词
:param token: GitHub Token(可选,但建议使用以提高速率限制)
:param language: 过滤语言
:param max_results: 最大结果数(GitHub 允许最多 1000 条)
:return: 仓库列表
"""
url = "https://api.github.com/search/repositories"
headers = { "Accept" : "application/vnd.github.v3+json" }
if token:
headers[ "Authorization" ] = f"Bearer { token} "
query = keyword
if language:
query += f" language: { language} "
repositories = [ ]
page = 1
per_page = 100
while len ( repositories) < max_results:
params = {
"q" : query,
"sort" : "stars" ,
"order" : "desc" ,
"page" : page,
"per_page" : per_page
}
try :
response = requests. get( url, headers= headers, params= params)
response. raise_for_status( )
data = response. json( )
if not data. get( "items" ) :
break
for item in data[ "items" ] :
repo_info = {
"name" : item[ "name" ] ,
"owner" : item[ "owner" ] [ "login" ] ,
"url" : item[ "html_url" ] ,
"clone_url" : item[ "clone_url" ] ,
"description" : item[ "description" ] ,
"language" : item[ "language" ] ,
"stars" : item[ "stargazers_count" ]
}
repositories. append( repo_info)
if len ( repositories) >= max_results:
break
page += 1
if page > 10 :
break
except requests. exceptions. RequestException as e:
print ( f"请求失败: { e} " )
break
return repositories
def save_to_txt ( results, filename= "github_results.txt" ) :
"""
将结果保存到文本文件
:param results: 仓库列表
:param filename: 保存文件名
"""
with open ( filename, "w" , encoding= "utf-8" ) as f:
for repo in results:
line = (
f"仓库: { repo[ 'owner' ] } / { repo[ 'name' ] } | "
f"URL: { repo[ 'url' ] } | "
f"语言: { repo[ 'language' ] } | "
f"星数: { repo[ 'stars' ] } | "
f"克隆地址: { repo[ 'clone_url' ] } \n"
)
f. write( line)
print ( f"结果已保存至 { filename} " )
if __name__ == "__main__" :
keyword = "Aerospace Control"
language = "Python"
token = "********"
results = search_github_repositories( keyword, token, language= language, max_results= 1000 )
if results:
print ( f"找到 { len ( results) } 个 { language} 相关仓库:" )
for idx, repo in enumerate ( results, 1 ) :
print ( f"\n { idx} . { repo[ 'owner' ] } / { repo[ 'name' ] } " )
print ( f" URL: { repo[ 'url' ] } " )
print ( f" 语言: { repo[ 'language' ] } " )
print ( f" 克隆地址: { repo[ 'clone_url' ] } " )
else :
print ( "未找到结果" )
if results:
save_to_txt( results)
print ( f"实际获取 { len ( results) } 条结果" )
else :
print ( "未找到结果" )