[Python/网络爬虫] 技术调研-效能工具:统计指定 Github 项目的 Star 数 和 Fork 数

  • DeepSeek / Kimi 等 AI 大模型,尚且无法直接准确抓取网站的数据,抓取工作仍需我们人工手动抓取。

2025.02.08

  • 技术调研工作中,非常常见、且耗时的一项工作即:对比 Github 开源项目的 star 数 和 fork 数。

  • 本工具能大幅提升此项工作的效率。

源码实现(Python)

markdown_table_to_csv.py : Markdown 转 CSV 文件数据(可选)

  • 依赖:markdown_table_to_csv.py

github_projects_stat_spider.py(抓取 Github 项目的统计数据)

# 导入 markdown_table_to_csv.py 模块
from markdown_table_to_csv import parse_markdown_table, write_csv
import requests

"""
+ 角色: 高级Python软件工程师
+ 开发需求: 使用Python,严格地根据 github.com 网站,抓取、统计开源项目此刻最新的开源项目的 star数 和 fork数,以Markdown表格形式【项目名称(projectName)、URL(url)、Star数(starCount)、Fork数(forkCount)】列出:
> + { "projectName": "joplin", "url" : "https://github.com/laurent22/joplin" }
> + { "projectName": "Standard Notes", "url": "https://github.com/standardnotes/app" }
> - Joplin : https://github.com/laurent22/joplin
> - Standard Notes : https://github.com/standardnotes/app
"""

# 方式1 : 通过 requests.get 获取数据
"""
    # usage
    repo_data = fetch_github_repo_data(repo_url)
    if repo_data:
        print(f"| {repo_data[0]} | {repo_data[1]} | {repo_data[2]} | {repo_data[3]} |")
    else:
        print(f"| {repo_url} | N/A | N/A | N/A |")
"""
def fetch_github_stats(repo_url):
    api_url = repo_url.replace("https://github.com/", "https://api.github.com/repos/")
    response = requests.get(api_url)
    if response.status_code == 200:
        data = response.json()
        return repo_url, data['stargazers_count'], data['forks_count']
    else:
        return None


# 方式2 : 通过 bs4.BeautifulSoup 解析网页
"""
def fetch_github_stats(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, 'html.parser')
        star_count = soup.find('a', href=lambda href: href and 'stargazers' in href).find('span').text.strip()
        fork_count = soup.find('a', href=lambda href: href and 'network/members' in href).find('span').text.strip()
        return repo_url, star_count, fork_count
    else:
        return repo_url, None, None
"""


def generate_markdown_table(projects):
    markdown_table =  "| 项目名称(projectName)   | URL(url) | Star数(starCount) | Fork数(forkCount) |\n"
    markdown_table += "| ---------------------- | --------- | ----------------- | ----------------- |\n"
    
    for project in projects:
        url, star_count, fork_count = fetch_github_stats(project['url'])
        markdown_table += f"| {project['projectName']} | {project['url']} | {star_count} | {fork_count} |\n"

    return markdown_table

def main():
    # Step1 定义要抓取的项目列表
    projects = [
        { "projectName": "Joplin", "url": "https://github.com/laurent22/joplin" }
        , { "projectName": "Standard Notes", "url": "https://github.com/standardnotes/app" }
        , { "projectName": "Mark Text", "url": "https://github.com/marktext/marktext" }
        , { "projectName": "Zettlr", "url": "https://github.com/Zettlr/Zettlr" }
        , { "projectName": "Notable", "url": "https://github.com/notable/notable" }
        , { "projectName": "Boostnote(已停止维护,但社区版本仍在)", "url": "https://github.com/BoostIO/BoostNote.next" }
        , { "projectName": "Logseq", "url": "https://github.com/logseq/logseq" }
        , { "projectName": "VNote", "url": "https://github.com/vnotex/vnote" }
    ]


    # Step2 生成Markdown表格
    markdown_table = generate_markdown_table(projects)

    # Step3 打印Markdown表格
    print("dataset(markdown):\n", markdown_table, "\n")

    # Step4 将Markdown表格写入CSV文件
    # step4.1 解析 Markdown 表格
    # headers, rows = parse_markdown_table(markdown_table)
    # step4.2 将解析后的数据写入 CSV 文件
    # output_dir = 'C:\\Users\\xxxx\\Desktop\\output.csv';
    # write_csv(headers, rows, output_dir)
    # print(f"CSV文件已生成到: {output_dir}")

if __name__ == "__main__":
    main()

X 参考文献

posted @ 2025-02-08 11:58  千千寰宇  阅读(42)  评论(0)    收藏  举报