Python项目:使用API

一、使用 Web API

1. 安装requests

Requests 包让 Python 程序能够轻松地向网站请求信息并检查返回的响应。要安装 Requests,可使用 pip:

复制代码
pip install requests

2. 处理API响应

下面来编写一个程序,自动执行 API 调用并处理结果:

python 复制代码
import requests
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
print(response_dicts.keys())

输出结果为:

3. 处理响应字典

将 API 调用返回的信息存储到字典里后,就可处理其中的数据了。生成一些概述这些信息的输出是一种不错的方式,可帮助我们确认收到了期望的信息,进而开始研究感兴趣的信息:

python 复制代码
import requests
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 打印与 'total_count' 相关联的值,它指出API 调用返回了多少个 Python 仓库
print(f"Total repositories: {response_dicts['total_count']}")
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
print(f"Total repositories: {len(repo_dicts)}")
# 先提取 repo_dicts中的第一个字典,并将其赋给 repo_dict
repo_dict = repo_dicts[0]
# 打印这个字典包含的键数,看看其中有多少项信息
print(f"\nKeys: {len(repo_dict)}")
# 打印这个字典的所有键,看看其中包含哪些信息
for key in sorted(repo_dict.keys()):
    print(key)

结果如下:

4. 概述最受欢迎的仓库

python 复制代码
import requests
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 打印与 'total_count' 相关联的值,它指出API 调用返回了多少个 Python 仓库
print(f"Total repositories: {response_dicts['total_count']}")
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
print(f"Total repositories: {len(repo_dicts)}")

print("\nSelected information about each repository:")
for repo in repo_dicts:
    print(f"\nName: {repo['name']}")
    print(f"Owner: {repo['owner']['login']}")
    print(f"Stars: {repo['stargazers_count']}")
    print(f"Repository URL: {repo['html_url']}")
    print(f"Description: {repo['description']}")

结果如下:

二、使用 Plotly 可视化仓库

我们将创建一个交互式条形图

python 复制代码
import requests
import plotly.express as px
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
# 处理有关仓库的信息
repo_names, stars = [], []
for repo in repo_dicts:
    repo_names.append(repo['name'])
    stars.append(repo['stargazers_count'])
fig = px.bar(x=repo_names, y=stars)
fig.show()

结果如下:

1. 设置图形的样式

python 复制代码
import requests
import plotly.express as px
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
# 处理有关仓库的信息
repo_names, stars = [], []
for repo in repo_dicts:
    repo_names.append(repo['name'])
    stars.append(repo['stargazers_count'])

title = 'Most-Starred Python Projects on GitHub'
labels = {'x': 'repo_names', 'y': 'stars'}
fig = px.bar(x=repo_names, y=stars, title=title, labels=labels)
fig.update_layout(title_font_size=28, xaxis_title_font_size=20, yaxis_title_font_size=20)
fig.show()

结果:

2. 添加定制工具提示

在 Plotly 中,将鼠标指向条形将显示它表示的信息。这通常称为工具提示(tooltip)

python 复制代码
import requests
import plotly.express as px
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
# 处理有关仓库的信息
repo_names, stars, hover_texts = [], [], []
for repo in repo_dicts:
    repo_names.append(repo['name'])
    stars.append(repo['stargazers_count'])
    # 创建悬停文本
    owner = repo['owner']['login']
    description = repo['description']
    hover_text = f"{owner} <br /> {description}"
    hover_texts.append(hover_text)

title = 'Most-Starred Python Projects on GitHub'
labels = {'x': 'repo_names', 'y': 'stars'}
fig = px.bar(x=repo_names, 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.show()

结果如下:

3. 添加可单击的链接

python 复制代码
import requests
import plotly.express as px
# 赋值一个调用API的URL
url = 'https://api.github.com/search/repositories'
url += '?q=language:python+sort:stars+stars:>10000'
# 指定 headers 显式地要求使用这个版本的 API 并返回 JSON 格式的结果
headers = {'Accept': 'application/vnd.github.v3+json'}
# 调用 API
r = requests.get(url, headers=headers)
# 打印 status_code,以核实调用是否成功
print(f'Status code: {r.status_code}')
# 使用 json() 方法将这些信息转换为一个 Python 字典
response_dicts = r.json()
# 查看了与'incomplete_results' 相关联的值,以便知道 GitHub 是否有足够的时间处理完这个查询
print(f"Complete results: {not response_dicts['incomplete_results']}")
repo_dicts = response_dicts['items']
# 处理有关仓库的信息
repo_links, stars, hover_texts = [], [], []
for repo in repo_dicts:
    repo_name = repo['name']
    repo_url = repo['html_url']
    repo_link = f'<a href="{repo_url}">{repo_name}</a>'
    repo_links.append(repo_link)
    stars.append(repo['stargazers_count'])
    # 创建悬停文本
    owner = repo['owner']['login']
    description = repo['description']
    hover_text = f"{owner} <br /> {description}"
    hover_texts.append(hover_text)

title = 'Most-Starred Python Projects on GitHub'
labels = {'x': 'repo_names', '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.show()

上面代码,点击横坐标即可跳转到对应页面。

4. 定制标记颜色

创建图形后,可使用以 update_ 打头的方法来定制其各个方面。前面使用了 update_layout() 方法,而 update_traces() 则可用来定制图形呈现的数据。

python 复制代码
fig.update_traces(marker_color='SteelBlue', marker_opacity=0.6)

三、Hacker News API

为了探索如何使用其他网站的 API 调用,我们来看看 Hacker News 网站。在这个网站上,用户分享编程和技术方面的文章,并就这些文章展开积极的讨论。Hacker News 的 API 让你能够访问有关该网站上所有文章和评论的信息,并且不要求通过注册获得密钥。

相关推荐
笨鸟先飞,勤能补拙1 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
微学AI2 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
长和信泰光伏储能2 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
豆瓣鸡3 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂3 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
韭菜炒鸡肝天3 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Gu Gu Study3 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
Aaron - Wistron4 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
卷无止境4 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境4 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python