羊蹓狼 发表于 2025-4-5 15:50:47

GitHub上最受欢迎Python项目——数据可视化应用案例

文章目次
一、概要
二、展示图
三、架构流程
1. 团体架构
2. 工作流程
四、技术实现
1. 核心依赖
2. 关键功能实现
1)数据获取模块
2)可视化模块
五、详细细节
1. API 哀求优化
2. 数据处置惩罚优化
3. 可视化优化
六、注意事项
1. API 限制
2. 数据量控制
3. 可视化建议
七、完整代码
八、总结

一、概要

这是一个基于 Python 的应用步伐,主要用于获取和可视化 GitHub 上星标数超过 10000 的 Python 项目数据。通过 GitHub REST API 获取堆栈数据,并使用 Plotly Express 天生交互式可视化图表,以直观的方式展示项目标受欢迎程度——以《Python从入门到实践 第三版》中的第二个项目为原型,做了优化和修改,实现分页提取数据功能。
二、展示图

https://i-blog.csdnimg.cn/direct/8b7bb588cad24cea89620d2288fe569b.png
https://i-blog.csdnimg.cn/direct/b40978e2390745478a2705be056258a7.png
三、架构流程

1. 团体架构

应用步伐主要包罗两个核心模块:
1)数据获取模块(fetch_github_repos)
2)数据可视化模块(create_visualization)
2. 工作流程

    -> [数据获取] -> [数据处置惩罚] -> [可视化天生] ->
1)数据获取阶段:


[*]构建 API 哀求


[*]发送 HTTP 哀求


[*]处置惩罚响应数据


[*]错误处置惩罚和限流控制
2)可视化阶段:


[*]数据预处置惩罚


[*]图表配置


[*]天生交互式图表


[*]导出 HTML 文件
四、技术实现

1. 核心依赖



[*]requests:处置惩罚 HTTP 哀求


[*]plotly.express:数据可视化


[*]time:处置惩罚延时和时间戳
2. 关键功能实现

1)数据获取模块

def fetch_github_repos(per_page=30, max_pages=10):
    base_url = "https://api.github.com/search/repositories"
    url = f"{base_url}?q=language:python+sort:stars+stars:>10000&per_page={per_page}&page={page}"

[*]支持分页获取


[*]包罗查询参数配置


[*]实现速率限制处置惩罚


[*]异常处置惩罚机制
2)可视化模块

def create_visualization(repos, page_num):
    # 数据处理
    repo_links = }'>{repo['name']}</a>" for repo in repos]
   
    # 图表生成
    fig = px.bar(x=repo_links, y=stars, title=title, labels=labels,
               hover_name=hover_texts)

[*]交互式条形图


[*]支持链接跳转


[*]悬停信息展示


[*]自定义样式配置
五、详细细节

1. API 哀求优化



[*]使用 headers 指定 API 版本


[*]实现哀求重试机制


[*]添加适当的哀求隔断
2. 数据处置惩罚优化



[*]链接格式化处置惩罚


[*]数据清洗和转换


[*]分页数据独立处置惩罚
3. 可视化优化



[*]自定义字体大小


[*]图表颜色配置


[*]交互性能优化


[*]分页展示策略
六、注意事项

1. API 限制



[*]GitHub API 有速率限制(未认证每小时 60 次)


[*]必要适当的延时处置惩罚


[*]建议使用 Personal Access Token 提高限制
2. 数据量控制



[*]每页数据量建议控制在 100 条以内   【fetch_github_repos() 的参数:per_page:每页的堆栈数量(最大100)】
[*]总页数建议不超过 10 页    【fetch_github_repos() 的参数:max_pages:要获取的页数(建议不超过10页)】
[*]注意内存使用服从
3. 可视化建议



[*]克制单个图表数据过多


[*]确保图表可读性


[*]注意交互性能优化
七、完整代码

import requests
import plotly.express as px
import time

def create_visualization(repos, page_num):
    """为单页数据创建可视化图表"""
    repo_links, stars, hover_texts = [], [], []

    for repo_dict in repos:
      # 将仓库名转换为链接
      repo_name = repo_dict['name']
      repo_url = repo_dict['html_url']
      repo_link = f"<a href='{repo_url}'>{repo_name}</a>"
      repo_links.append(repo_link)
      stars.append(repo_dict['stargazers_count'])

      # 创建悬停文本
      owner = repo_dict['owner']['login']
      description = repo_dict['description']
      hover_text = f"{owner}<br />{description}"
      hover_texts.append(hover_text)

    # 可视化
    title = f"Most-Starred Python Projects on GitHub (Page {page_num})"
    labels = {'x': 'Repository', 'y': 'Stars'}
    fig = px.bar(x=repo_links, y=stars, title=title, labels=labels,
               hover_name=hover_texts)
    fig.update_layout(
      title_font_size=28,
      xaxis_title_font_size=20,
      yaxis_title_font_size=20
    )
    fig.update_traces(marker_color='SteelBlue', marker_opacity=0.6)
    fig.write_html(f'Github_Stars_Page_{page_num}.html')
    print(f'已生成第 {page_num} 页的可视化图表')


def fetch_github_repos(per_page=30, max_pages=3):
    base_url = "https://api.github.com/search/repositories"

    for page in range(1, max_pages + 1):
      # 构建查询URL,包含分页参数
      url = f"{base_url}?q=language:python+sort:stars+stars:>10000&per_page={per_page}&page={page}"
      headers = {"Accept": "application/vnd.github.v3+json"}

      try:
            r = requests.get(url, headers=headers)
            r.raise_for_status()# 检查是否有错误发生

            # 检查API速率限制
            if int(r.headers.get('X-RateLimit-Remaining', 0)) < 2:
                reset_time = int(r.headers.get('X-RateLimit-Reset', 0))
                sleep_time = max(reset_time - time.time(), 0)
                print(f"即将达到API限制,等待 {sleep_time:.0f} 秒...")
                time.sleep(sleep_time + 1)

            response_dict = r.json()
            current_repos = response_dict['items']

            if not current_repos:# 如果没有更多结果,退出循环
                break

            print(f"已获取第 {page} 页数据,包含 {len(current_repos)} 个仓库")

            # 为当前页面创建可视化
            create_visualization(current_repos, page)

            # 添加短暂延迟以避免触发GitHub的速率限制
            time.sleep(1)

      except requests.exceptions.RequestException as e:
            print(f"获取数据时发生错误: {e}")
            break


# 开始获取数据并生成可视化
print("开始获取GitHub仓库数据...")
fetch_github_repos()
print('所有页面的可视化图表已生成完成!') 八、总结

该应用步伐通过公道的架构设计和技术实现,成功地实现了 GitHub 堆栈数据的获取和可视化。其主要特点包括:
1)模块化设计:清晰的功能划分,便于维护和扩展
2)健壮性:完善的错误处置惩罚和限流机制
3)可视化效果:直观的数据展示和良好的交互体验
4)性能思量:公道的分页处置惩罚和数据量控制
通过这个应用,用户可以直观地相识 GitHub 上最受欢迎的 Python 项目,为开源社区贡献了一个有价值的数据可视化工具。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: GitHub上最受欢迎Python项目——数据可视化应用案例