Читаем Изучаем Python онлайн бесплатно
При построении визуализации этих данных на диаграмму необходимо нанести более одного репозитория. Напишем цикл для вывода информации о каждом репозитории, возвращаемом вызовом API, чтобы все эти репозитории можно было включить в визуализацию:
python_repos.py
...
# Анализ информации о репозиториях.
repo_dicts = response_dict['items']
print("Repositories returned:", len(repo_dicts))
(1) print("\nSelected information about each repository:")
(2)for repo_dict in repo_dicts:
. .print('\nName:', repo_dict['name'])
. .print('Owner:', repo_dict['owner']['login'])
. .print('Stars:', repo_dict['stargazers_count'])
. .print('Repository:', repo_dict['html_url'])
. .print('Description:', repo_dict['description'])
В точке (1) выводится приветственное сообщение. В точке (2) перебираются все словари в repo_dicts. Внутри цикла выводится имя каждого проекта, его владелец, количество звезд, URL на GitHub и краткое описание проекта:
Status code: 200
Total repositories: 713067
Repositories returned: 30
Selected information about each repository:
Name: httpie
Owner: jkbrzt
Stars: 16101
Repository: https://github.com/jkbrzt/httpie
Description: CLI HTTP client; user-friendly cURL replacement featuring
intuitive UI, JSON support, syntax highlighting, wget-like downloads,
extensions, etc.
Name: django
Owner: django
Stars: 15028
Repository: https://github.com/django/django
Description: The Web framework for perfectionists with deadlines.
...
Name: powerline
Owner: powerline
Stars: 4315
Repository: https://github.com/powerline/powerline
Description: Powerline is a statusline plugin for vim, and provides
statuslines and prompts for several other applications, including zsh, bash,
tmux, IPython, Awesome and Qtile.
В этих результатах встречаются интересные проекты; возможно, вам стоит присмотреться к некоторым из них… Но не увлекайтесь, потому что мы собираемся создать визуализацию, которая существенно упростит чтение результатов.
Многие API ограничивают частоту обращений; иначе говоря, существует предел для количества запросов в определенный промежуток времени. Чтобы узнать, не приближаетесь ли вы к ограничениям GitHub, введите в браузере адрес https://api.github.com/rate_limit. Вы получите ответ, который выглядит примерно так:
{
"resources": {
. ."core": {
. . "limit": 60,
. . "remaining": 58,
. . "reset": 1426082320
. .},
(1) . ."search": {
(2) . . "limit": 10,
(3) . . "remaining": 8,
(4) . . "reset": 1426078803
. .}
},
"rate": {
. ."limit": 60,
. ."remaining": 58,
. ."reset": 1426082320
}
}
В этих данных нас интересует частота обращений для поискового API (1) . В точке (2) видно, что предельная частота составляет 10 запросов в минуту и что на текущую минуту осталось еще 8 запросов (3). Значение reset представляет Unix-время, или эпохальное время (число секунд, прошедших с полуночи 1 января 1970 года) момента, когда произойдет сброс квоты (4). При достижении предельного количества обращений вы получите короткий ответ, уведомляющий о достижении предела API. Если вы достигнете предела, просто подождите, пока квота будет сброшена.
Примечание
Многие API требуют регистрации и получения ключа API для совершения вызовов. На момент написания для GitHub такого требования не было, но, если вы получите ключ API, предельная частота обращений для ваших программ значительно увеличится.
Теперь, с появлением интересных данных, мы построим визуализацию, демонстрирующую относительную популярность проектов Python в GitHub. Мы построим интерактивную столбцовую диаграмму: высота каждого столбца будет представлять количество звезд у проекта. Щелчок на столбце будет открывать домашнюю страницу проекта на GitHub. Первая попытка выглядит так:
python_repos.py
import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
# Создание вызова API и сохранение ответа.
URL = 'https://api.github.com/search/repositories?q=language:python&sort=star'
r = requests.get(URL)
print("Status code:", r.status_code)
# Сохранение ответа API в переменной.
response_dict = r.json()
print("Total repositories:", response_dict['total_count'])
# Анализ информации о репозиториях.
repo_dicts = response_dict['items']
(1) names, stars = [], []
for repo_dict in repo_dicts:
(2) . .names.append(repo_dict['name'])
. .stars.append(repo_dict['stargazers_count'])
# Построение визуализации.
(3)my_style = LS('#333366', base_style=LCS)
(4)chart = pygal.Bar(style=my_style, x_label_rotation=45, show_ legend=False)
chart.title = 'Most-Starred Python Projects on GitHub'
chart.x_labels = names
(5)chart.add('', stars)
chart.render_to_file('python_repos.svg')




