文章目次
一、概要
二、展示图
三、架构流程
1. 团体架构
2. 工作流程
四、技术实现
1. 核心依赖
2. 关键功能实现
1)数据获取模块
2)可视化模块
五、详细细节
1. API 哀求优化
2. 数据处置惩罚优化
3. 可视化优化
六、注意事项
1. API 限制
2. 数据量控制
3. 可视化建议
七、完整代码
八、总结
一、概要
这是一个基于 Python 的应用步伐,主要用于获取和可视化 GitHub 上星标数超过 10000 的 Python 项目数据。通过 GitHub REST API 获取堆栈数据,并使用 Plotly Express 天生交互式可视化图表,以直观的方式展示项目标受欢迎程度——以《Python从入门到实践 第三版》中的第二个项目为原型,做了优化和修改,实现分页提取数据功能。
二、展示图
三、架构流程
1. 团体架构
应用步伐主要包罗两个核心模块:
1)数据获取模块(fetch_github_repos)
2)数据可视化模块(create_visualization)
2. 工作流程
[GitHub API] -> [数据获取] -> [数据处置惩罚] -> [可视化天生] -> [HTML输出]
1)数据获取阶段:
2)可视化阶段:
四、技术实现
1. 核心依赖
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 = [f"<a href='{repo['html_url']}'>{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 哀求优化
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企服之家,中国第一个企服评测及商务社交产业平台。 |