美文网首页视觉艺术python
python:使用Web Api请求github的数据并可视化的

python:使用Web Api请求github的数据并可视化的

作者: 烂笔头2020 | 来源:发表于2020-04-29 14:33 被阅读0次

    参考书籍:《python编程从入门到实践》
    使用web应用编程接口(API)自动请求网站特定信息而不是整个网页,再对这些信息进行可视化,因为这样的程序始终使用最新的数据来生成可视化,因此即使数据瞬息万变,它呈现的信息也都是最新的。请求的数据的数据格式是Json或者cvs。

    下面的例子是对于github的的一个数据请求:调用返回github当前托管了多少个项目,还有有关最受欢迎的python仓库的信息。

    1、使用api调用请求数据:

    https://api.github.com/search/repositories?q=language:python&sort=stars
    https://api.github.com/)将请求发送到github网络中响应api调用部分
    (search/repositories)让api搜索github上的所有仓库
    (?)指出我们要传递一个实参
    (q=)q表示查询,等号让我们开始指定查询
    (language:python)指定语言为python
    (sort=stars)将指定项目按照星星进行排序
    下面是响应返回的前几行信息:

    {
    "total_count": 4982671,
    "incomplete_results": true,
    "items": [
    {
    "id": 54346799,
    "node_id": "MDEwOlJlcG9zaXRvcnk1NDM0Njc5OQ==",
    "name": "public-apis",
    "full_name": "public-apis/public-apis",
    "private": false,
    --snip--

    ( "incomplete_results": true,)说明github无法全面处理该API,如果全面处理返回值为false(它并非不完整的)

    2、下面的程序是处理API响应:
    # -*- encoding: utf-8 -*-
    import requests
    url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
    r = requests.get(url)
    print("Status code:", r.status_code) #返回状态码,200即使请求成功
    #将api响应存储在一个变量中
    response_dict=r.json()
    #处理结果
    #print(response_dict.keys())
    #结果:dict_keys(['total_count', 'incomplete_results', 'items'])
    print("Total repositories:", response_dict['total_count']) #指出github中总共有多少个python仓库
    #incomplete_results:值为false,据此知道请求是成功的(它并非不完整的),如果github无法全面处理该api,它会返回这个值为true
    #探索有关仓库的信息
    repo_dicts = response_dict['items'] #'items'相关联的是一个列表
    print("repositories retuned:",len(repo_dicts)) #打印列表的长度来获悉我们得到多少个仓库的信息
    
    #研究第一个仓库
    # repo_dict=repo_dicts[0]
    # print("\nkeys:",len(repo_dict)) #打印字典的键值,看看其中包含多少信息
    # for key in sorted(repo_dict.keys()):
    #      print(key)
    
    #打印每一个仓库以下的内容
    print("\nSelected information about each repository:")
    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']) #仓库的url
        print('Created:',repo_dict['created_at']) #创建时间
        print('Updated:',repo_dict['updated_at']) #最后一次更新时间
        print('Description:',repo_dict['description']) #仓库的描述
    
    3、API的速率限制(rate_limit)

    对于API的请求不是没有限制的,在特定的时间可执行的请求数是存在限制的,要知道请求次数是否接近极限可以在浏览器中输入进行查询,在这里我就不进行详细说明了,当请求配额用完的时候只能等配额重置,这里一般等几分钟就会重置。

    4、对仓库可视化(pygal)
    import pygal
    from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
    import requests
    url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
    r = requests.get(url)
    print("Status code:", r.status_code)
    #将api响应存储在一个变量中
    response_dict=r.json()
    #处理结果
    #print(response_dict.keys())
    #结果:dict_keys(['total_count', 'incomplete_results', 'items'])
    print("Total repositories:", response_dict['total_count']) #指出github中总共有多少个python仓库
    #incomplete_results:值为false,据此知道请求是成功的(它并非不完整的),如果github无法全面处理该api,它会返回这个值为true
    #探索有关仓库的信息
    repo_dicts = response_dict['items'] #'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)
    
    my_config = pygal.Config() #创建一个pygal类Config的实例,通过修改my_config的属性,可定制图标的外观
    my_config.x_label_rotation = 45
    my_config.show_legend = False #隐藏图例
    my_config.title_font_size = 24
    my_config.label_font_size = 14 #副标签:x轴上的项目名和y轴上的大部分数字
    my_config.major_label_font_size = 18 #主标签:是y轴上为5000整数倍的刻度,这些标签应该更大,和副标签区分开来
    my_config.truncate_label = 15 #将项目名字太长的项目名缩短为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')
    
    5、添加自定义工具

    将鼠标指向条形将显示它表示的信息,称为工具提示,下面来创建一个自定义工具提示,显示项目的描述,为此,我们要向向add传递一个字典列表,而不是值列表。
    只需要修改其中一部分代码即可:

    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)
    --snip--
    chart.add('',plot_dicts)
    
    
    6、在图表中添加可单击的链接

    只需要在上面的字典列表中添加多一个键值对就可以了

    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)
    --snip--
    chart.add('',plot_dicts)
    

    这样pygal就会根据与键‘xlink'相关联的URL将每个条形都转换为活跃的链接,单击图表中的任何条形时,都将在浏览器中打开一个新的标签页,并在其中显示相应项目的github页面,感觉非常的神奇。


    在这里会发现同一个项目在昨天和今天它的星星数是不一样的,因为是用的web api请求的网页数据,数据是跟着网页数据进行变化的,这样就很方便,数据不会是一成不变的。

    相关文章

      网友评论

        本文标题:python:使用Web Api请求github的数据并可视化的

        本文链接:https://www.haomeiwen.com/subject/jwxgwhtx.html