Главная страница
Навигация по странице:

  • Рис. 17.2.

  • Рис. 17.3.

  • Книга Изучаем Python


    Скачать 4.68 Mb.
    НазваниеКнига Изучаем Python
    Дата10.12.2022
    Размер4.68 Mb.
    Формат файлаpdf
    Имя файлаErik_Metiz_Izuchaem_Python_Programmirovanie_igr_vizualizatsia_da.pdf
    ТипКнига
    #837531
    страница41 из 53
    1   ...   37   38   39   40   41   42   43   44   ...   53
    368 Глава 17 • Работа с API
    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
    Многие API ограничивают частоту обращений; иначе говоря, существует предел для количества запросов в определенный промежуток времени. Чтобы узнать, не приближаетесь ли вы к ограничениям GitHub, введите в браузере адрес
    https://api.github.com/rate_limit. Вы получите ответ, который выглядит примерно так:
    {
    "resources": {
    "core": {
    "limit": 60,
    "remaining": 58,
    "reset": 1426082320
    },

    "search": {

    "limit": 10,

    "remaining": 8,

    "reset": 1426078803
    }
    },
    "rate": {
    "limit": 60,
    "remaining": 58,
    "reset": 1426082320
    }
    }
    В этих данных нас интересует частота обращений для поискового API . В точке  видно, что предельная частота составляет 10 запросов в минуту и что на текущую минуту осталось еще 8 запросов . Значение reset представляет Unix-время, или
    эпохальное время (число секунд, прошедших с полуночи 1 января 1970 года) мо- мента, когда произойдет сброс квоты . При достижении предельного количества обращений вы получите короткий ответ, уведомляющий о достижении предела
    API. Если вы достигнете предела, просто подождите, пока квота будет сброшена.

    Использование API веб-приложений 369
    ПРИМЕЧАНИЕ
    Многие API требуют регистрации и получения ключа API для совершения вызовов . На момент написания для GitHub такого требования не было, но, если вы получите ключ API, предельная частота обращений для ваших программ значительно увеличится .
    Визуализация репозиториев с использованием Pygal
    Теперь, с появлением интересных данных, мы построим визуализацию, демонстри- рующую относительную популярность проектов 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']
     names, stars = [], []
    for repo_dict in repo_dicts:
     names.append(repo_dict['name'])
    stars.append(repo_dict['stargazers_count'])
    # Построение визуализации.
     my_style = LS('#333366', base_style=LCS)
     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
     chart.add('', stars)
    chart.render_to_file('python_repos.svg')
    Сначала импортируется модуль pygal и стили Pygal, необходимые для оформления диаграммы. Затем выводится статус ответа на вызов API и общее количество обна- руженных репозиториев, чтобы мы сразу узнали о возможной проблеме с вызовом
    API. Информация о конкретных возвращенных проектах уже не выводится, потому что эта информация будет включена в визуализацию.
    В точке  создаются два пустых списка для хранения данных, включаемых в диа- грамму. Нам понадобится имя каждого проекта (для пометки столбцов) и количе-

    370 Глава 17 • Работа с API
    ство звезд, определяющее высоту столбцов. В цикле имя каждого проекта и коли- чество звезд присоединяются к соответствующему списку .
    Затем программа определяет стиль с использованием класса
    LightenStyle
    (псев- доним
    LS
    ) на базе темного оттенка синего цвета  . Также передается аргу- мент base_style для использования класса
    LightColorizedStyle
    (псевдоним
    LCS
    ). Метод
    Bar()
    создает простую столбцовую диаграмму, которой передается стиль my_style
    . Также передаются еще два стилевых аргумента: метки пово- рачиваются под 45 градусов к оси x (
    x_label_rotation=45
    ), а условные обо- значения скрываются, потому что на диаграмму наносится только одна серия данных (
    show_legend=False
    ). Затем назначается заголовок диаграммы, а атрибуту x_labels присваивается список names
    Так как метки для этой серии данных не нужны, при добавлении данных  вместо метки передается пустая строка. Полученная диаграмма изображена на рис. 17.1.
    Мы видим, что несколько первых проектов существенно популярнее остальных, но все эти проекты занимают важное место в экосистеме Python.
    Рис. 17.1. Проекты Python на GitHub с наибольшим количеством звезд
    Доработка диаграмм Pygal
    Немного доработаем стилевое оформление диаграммы. Мы собираемся внести несколько разных настроек, поэтому для начала слегка изменим структуру кода: создадим конфигурационный объект, который содержит все настройки, передава- емые
    Bar()
    :
    python_repos.py
    # Построение визуализации.
    my_style = LS('#333366', base_style=LCS)

    my_config = pygal.Config()

    Использование API веб-приложений 371
     my_config.x_label_rotation = 45
    my_config.show_legend = False
     my_config.title_font_size = 24
    my_config.label_font_size = 14
    my_config.major_label_font_size = 18
     my_config.truncate_label = 15
     my_config.show_y_guides = False
     my_config.width = 1000
     chart = pygal.Bar(my_config, style=my_style)
    chart.title = 'Most-Starred Python Projects on GitHub'
    chart.x_labels = names chart.add('', stars)
    chart.render_to_file('python_repos.svg')
    В точке  создается экземпляр класса Pygal
    Config с именем my_config
    ; измене- ние атрибутов my_config приведет к изменению внешнего вида диаграммы. Мы задаем два атрибута x_label_rotation и show_legend
    , которые ранее передава- лись в виде именованных аргументов при создании экземпляра
    Bar
    . В точке  назначаются размеры шрифта для заголовка диаграммы, дополнительных и ос- новных меток. К дополнительным меткам на этой диаграмме относятся имена проектов по оси x и большинство чисел по оси y. Основными метками являются только метки оси y для делений, кратных 5000 звездам. Эти метки должны быть более крупными, поэтому мы назначаем им другой размер шрифта. В точке  атрибут truncate_label используется для сокращения длинных имен проектов до 15 символов. (Если навести указатель мыши на сокращенное имя проекта, на экране появляется подсказка с полным именем.) Затем мы скрываем горизон- тальные линии на графике, задавая атрибуту show_y_guides значение
    False
    .
    Наконец, в точке

    назначается ширина диаграммы для более эффективного использования доступного места в браузере.
    Теперь при создании экземпляра
    Bar

    мы передаем my_config в первом аргумен- те; таким образом, один аргумент передает сразу все настройки конфигурации.
    Рис. 17.2. Диаграмма с улучшенным оформлением

    372 Глава 17 • Работа с API
    При желании в my_config можно внести сколько угодно стилевых и конфигураци- онных изменений; строка

    от этого не изменится. На рис. 17.2 изображена диа- грамма с измененным оформлением.
    Добавление подсказок
    В Pygal при наведении указателя мыши на отдельный столбец отображается инфор- мация, которую этот столбец представляет. В текущей версии экранная подсказка
    (tooltip) отображает количество звезд проекта. Давайте создадим нестандартную подсказку, которая также будет выводить описание каждого проекта.
    Рассмотрим короткий пример, в котором каждый из первых трех проектов выво- дится отдельно, с передачей нестандартных меток для каждого столбца. Для этого методу add()
    следует передавать список словарей вместо списка значений:
    bar_descriptions.py
    import pygal from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
    my_style = LS('#333366', base_style=LCS)
    chart = pygal.Bar(style=my_style, x_label_rotation=45, show_legend=False)
    chart.title = 'Python Projects'
    chart.x_labels = ['httpie', 'django', 'flask']
     plot_dicts = [

    {'value': 16101, 'label': 'Description of httpie.'},
    {'value': 15028, 'label': 'Description of django.'},
    {'value': 14798, 'label': 'Description of flask.'},
    ]
     chart.add('', plot_dicts)
    chart.render_to_file('bar_descriptions.svg')
    Рис. 17.3. С каждым столбцом связывается нестандартная подсказка

    Использование API веб-приложений 373
    В точке  определяется список с именем plot_dicts
    , который содержит три словаря: для проекта HTTPie, для проекта Django и для проекта Flask. Каждый словарь содержит два ключа:
    'value'
    и 'label'
    . Pygal использует число, связанное с 'value'
    , для определения высоты каждого столбца, а строка, связанная с 'label'
    , используется для создания подсказки столбца. Например, первый словарь  соз- даст столбец, представляющий проект с 16 101 звездой, а в его подсказке будет содержаться текст Description of httpie.
    Метод add()
    должен получать строку и список. При вызове add()
    передается список словарей, представляющих столбцы (
    plot_dicts
    ) . Одна из подска- зок изображена на рис. 17.3. Pygal включает количество звезд как подсказку по умолчанию в дополнение к нестандартной подсказке, которую мы определили в программе.
    Нанесение данных на диаграмму
    Чтобы построить диаграмму с данными, мы сгенерируем plot_dicts автоматически для 30 проектов, возвращенных вызовом API.
    python_repos.py
    # Анализ информации о репозиториях.
    repo_dicts = response_dict['items']
    print("Number of items:", len(repo_dicts))
     names, plot_dicts = [], []
    for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
     plot_dict = {
    'value': repo_dict['stargazers_count'],
    'label': repo_dict['description'],
    }
     plot_dicts.append(plot_dict)
    # Построение визуализации.
    my_style = LS('#333366', base_style=LCS)
     chart.add('', plot_dicts)
    chart.render_to_file('python_repos.svg')
    В точке  создаются два пустых списка, names и plot_dicts
    . Список names все еще необходим для построения меток оси x.
    Внутри цикла для каждого проекта создается словарь plot_dict
    . В нем количе- ство звезд сохраняется с ключом 'value'
    , а описание проекта — с ключом 'label'
    Затем словарь plot_dict каждого проекта присоединяется к plot_dicts
    . В точ- ке  список plot_dicts передается add()
    . Полученная диаграмма изображена на рис. 17.4.

    374 Глава 17 • Работа с API
    Рис. 17.4. При наведении указателя мыши на столбец появляется описание проекта
    Добавление активных ссылок на диаграмму
    Pygal также позволяет использовать каждый столбец диаграммы как ссылку на сайт. Чтобы реализовать эту возможность, достаточно добавить всего одну строку кода, в которой используется словарь, создаваемый для каждого проекта.
    В словарь plot_dict каждого проекта добавляется новая пара «ключ—значение» с ключом 'xlink'
    :
    python_repos.py
    names, plot_dicts = [], []
    for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    plot_dict = {
    'value': repo_dict['stargazers_count'],
    'label': repo_dict['description'],
    'xlink': repo_dict['html_url'],
    }
    plot_dicts.append(plot_dict)
    Pygal использует URL-адрес, связанный с 'xlink'
    , для преобразования каждого столбца в активную ссылку. Если щелкнуть на любом столбце диаграммы, в брау- зере автоматически открывается новая вкладка со страницей GitHub соответству- ющего проекта. Итак, мы создали интерактивную, содержательную визуализацию данных, загруженных через API!

    Использование API веб-приложений 375
    API Hacker News
    Чтобы познакомиться с использованием вызовов API для других сайтов, мы об- ратимся к сайту Hacker News (http://news.ycombinator.com/). На этом сайте поль- зователи делятся друг с другом статьями, посвященными программированию и технологиям, а также активно обсуждают эти статьи. API сайта Hacker News предоставляет доступ ко всем статьям и комментариям на сайте, а для его исполь- зования не требуется регистрация с получением ключа.
    Следующий вызов возвращает информацию о текущей самой популярной статье
    (на момент написания книги):
    https://hacker-news.firebaseio.com/v0/item/9884165.json
    Ответ представляет собой словарь с информацией о статье с идентификатором
    9884165:
    {

    'url': 'http://www.bbc.co.uk/news/science-environment-33524589',
    'type': 'story',

    'title': 'New Horizons: Nasa spacecraft speeds past Pluto',

    'descendants': 141,
    'score': 230,
    'time': 1436875181,
    'text': '',
    'by': 'nns',
    'id': 9884165,

    'kids': [9884723, 9885099, 9884789, 9885604, 9885844]
    }
    Словарь содержит ряд ключей, которые могут нам пригодиться, — например,
    'url'
     и 'title'
    . Ключ 'descendants'
    содержит количество комментариев, полученных статьей
    . Ключ 'kids'
    предоставляет идентификаторы всех дочерних
    комментариев, сделанных непосредственно в ответ на эту статью . У каждого из этих комментариев могут быть свои дочерние комментарии, так что количество потомков у статьи может быть больше количества дочерних комментариев.
    Создадим вызов API для получения идентификаторов статей, наиболее популяр- ных на Hacker News, а затем рассмотрим каждую из этих статей:
    hn_submissions.py
    import requests from operator import itemgetter
    # Создание вызова API и сохранение ответа.
     url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
    r = requests.get(url)
    print("Status code:", r.status_code)
    # Обработка информации о каждой статье.
     submission_ids = r.json()
     submission_dicts = []
    for submission_id in submission_ids[:30]:

    376 Глава 17 • Работа с API
    # Создание отдельного вызова API для каждой статьи.
     url = ('https://hacker-news.firebaseio.com/v0/item/' +
    str(submission_id) + '.json')
    submission_r = requests.get(url)
    print(submission_r.status_code)
    response_dict = submission_r.json()
     submission_dict = {
    'title': response_dict['title'],
    'link': 'http://news.ycombinator.com/item?id=' + str(submission_id),

    'comments': response_dict.get('descendants', 0)
    }
    submission_dicts.append(submission_dict)
     submission_dicts = sorted(submission_dicts, key=itemgetter('comments'),
    reverse=True)
     for submission_dict in submission_dicts:
    print("\nTitle:", submission_dict['title'])
    print("Discussion link:", submission_dict['link'])
    print("Comments:", submission_dict['comments'])
    Сначала программа создает вызов API и выводит статус ответа . Этот вызов API возвращает список идентификаторов 500 самых популярных статей на Hacker News на момент выдачи вызова. Текст ответа преобразуется в список Python , который сохраняется в переменной submission_ids
    . Идентификаторы будут использова- ны для построения набора словарей, каждый из которых содержит информацию об одной из текущих статей.
    В точке  создается пустой список с именем submission_dicts для хранения сло- варей. Далее программа перебирает идентификаторы 30 самых популярных статей и выдает новый вызов API для каждой статьи, генерируя URL с текущим значением submission_id
    . Также выводится статус каждого запроса, чтобы мы могли про- верить, успешно ли он был обработан.
    В точке  создается словарь для текущей обрабатываемой статьи, в котором со- храняется заголовок статьи и ссылка на страницу с ее обсуждением. В точке

    сохраняется количество комментариев в словаре. Если статья еще не имеет коммен- тариев, ключ 'descendants'
    отсутствует. Если вы не уверены, существует ли ключ в словаре, используйте метод dict.get()
    , который возвращает значение, связанное с ключом (если он существует), или значение, заданное вами (если ключ не суще- ствует), — 0 в данном примере. Наконец, словарь submission_dict присоединяется к списку submission_dicts
    Статьи Hacker News ранжируются по общей системе, основанной на нескольких факторах: сколько раз за статью голосовали, сколько комментариев она получила и давно ли была опубликована. Требуется отсортировать список словарей по коли- честву комментариев. Для этого мы используем функцию itemgetter()

    из модуля operator
    . Мы передаем этой функции ключ 'comments'
    , а она извлекает значение, связанное с данным ключом, из каждого словаря в списке. Функция sorted()
    затем использует это значение для сортировки списка. Мы сортируем список в обратном порядке, чтобы публикации с наибольшим количеством комментариев оказались на первом месте.

    Использование API веб-приложений 377
    После того как список будет отсортирован, мы перебираем элементы

    и выводим для каждой из самых популярных статей три атрибута: заголовок, ссылку на стра- ницу обсуждения и текущее количество комментариев:
    Status code: 200 200 200 200
    Title: Firefox deactivates Flash by default
    Discussion link: http://news.ycombinator.com/item?id=9883246
    Comments: 231
    Title: New Horizons: Nasa spacecraft speeds past Pluto
    Discussion link: http://news.ycombinator.com/item?id=9884165
    Comments: 142
    Title: Iran Nuclear Deal Is Reached With World Powers
    Discussion link: http://news.ycombinator.com/item?id=9884005
    Comments: 141
    Title: Match Group Buys PlentyOfFish for $575M
    Discussion link: http://news.ycombinator.com/item?id=9884417
    Comments: 75
    Title: Our Nexus 4 devices are about to explode
    Discussion link: http://news.ycombinator.com/item?id=9885625
    Comments: 14
    Аналогичный процесс применяется для обращения и анализа информации из лю- бого API. С такими данными вы сможете построить визуализацию, показыва- ющую, какие публикации вызывали наиболее активные обсуждения в последнее время.
    1   ...   37   38   39   40   41   42   43   44   ...   53


    написать администратору сайта