github公开项目爬取

py 复制代码
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  # GitHub 单页最大允许 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
            # GitHub 最多允许 10 页(即 10 * 100=1000 条)
            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 = "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"  # 强烈建议使用 Token

    # 获取最多 1000 条结果(实际数量取决于搜索匹配的总数)
    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("未找到结果")
相关推荐
逛逛GitHub9 小时前
我用 Codex 破解了家里这个设备,还能语音遥控。。。
github
风之九子11 小时前
在上游一天两版的项目上做二次开发:9 天 65 次提交的 fork 手记 (dsh-our-free-model)
人工智能·ai·github
邱杰47012 小时前
数智人事系统(十七):加班核算与薪资构成
后端·github
小弥儿12 小时前
GitHub今日热榜 | 2026-10-20:智能体基建七席连庄,生成类项目回流
学习·开源·github
江厌0112 小时前
两张卡部署两个模型:物理分卡、MIG、张量并行的选择与可复现配置
github·模型部署·vllm
问天_观心12 小时前
模型微调学习(二)
开发语言·人工智能·学习·语言模型·github
回眸&啤酒鸭13 小时前
【回眸】GitHub Copilot 智能编程辅助效果实测
github·copilot
Brilliantwxx13 小时前
【Linux】基础IO(下):输出重定向、dup2 与 minishell 重定向实战
linux·运维·服务器·github·bash
miofly13 小时前
GitHub 今日推荐|security-audit-skill:让编码代理自己审计漏洞还互相验证
javascript·开源·github