Python學習之路16-使用API

VPointer發表於2018-05-29

《Python程式設計:從入門到實踐》筆記。

本篇是Python資料處理的第三篇,本篇將使用Web應用程式介面自動請求網站的特定資訊並視覺化。

1. 前言

本將需要用到requests模組來請求網站資料。主要內容如下:

  • 向GitHub請求專案資料,按星排序;
  • 使用pygal視覺化上述資料;
  • 呼叫Hacker News的API

2. GitHub repositories

獲取GitHub中倉庫的描述資訊,並按星數排序:

# 程式碼:
import requests

# 執行API呼叫並儲存響應,注意不要輸錯了!
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("Total repositories:", response_dict["total_count"])

# 探索有關倉庫的資訊
repo_dicts = response_dict["items"]
print("Repositories returned:", len(repo_dicts))

# 研究第一個倉庫
repo_dict = repo_dicts[0]
print("\nKeys:", len(repo_dict))
for key in sorted(repo_dict.keys()):
    print(key)
    
# 結果:
Status code: 200
Total repositories: 2563652
Repositories returned: 30

Keys: 72
archive_url
archived
assignees_url
blobs_url
-- snip --
複製程式碼

有些請求可能並不能成功,可能需要你的個人授權碼:

headers = {"Authorization":"your perosonal token"}
url = "https://api.github.com/search/repositories?q=language:python&sort=stars"
r = requests.get(url, headers=headers)
複製程式碼

大多數API都存在速率限制,即特定時間內可執行的請求數。對於GitHub的速率限制可以訪問 https://api.github.com/rate_limit 訪問,時間是“每分鐘”。

3. 使用Pygal視覺化倉庫

使用一個引數配置類來定義圖表的引數,並自定義圖表中每個條形的描述資訊,並給這些條形新增網址連結。

import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS

-- snip --
repo_dicts = response_dict["items"]

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict["name"])

    plot_dict = {
        # 每個資料的值
        "value": repo_dict["stargazers_count"],
        # 自定義每個資料的描述資訊
        # 原文中沒有將其轉換成str,報錯;可能現在資料型別更改了?
        "label": str(repo_dict["description"]),
        # 為每個條新增網址連結
        "xlink": repo_dict["html_url"],
    }
    plot_dicts.append(plot_dict)

# 視覺化
my_style = LS("#333366", base_style=LCS)
# 圖表配置類
my_config = pygal.Config()
# x軸標籤順時針旋轉45度
my_config.x_label_rotation = 45
# 不顯示圖例
my_config.show_legend = False
my_config.title_font_size = 24
my_config.label_font_size = 14
# 主標籤大小,y軸
my_config.major_label_font_size = 18
# x軸標籤最長15個字元
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("", plot_dicts)
chart.render_to_file("python_repos.svg")
複製程式碼

得到如下表格:

Python學習之路16-使用API

現在每一個資料都有自己的描述資訊,並且點選它們還能跳到它們的專案網站。注意左側y軸上的刻度,書中的刻度很密集,但同樣的程式碼在這裡不知道為什麼很稀疏,所以這裡沒有體現出第34行程式碼的效果。

4. Hacker News API

Hacker News的API能讓你訪問該網站所有文章和評論的資訊,且不用註冊獲取祕鑰。下面通過一個API呼叫獲取其上當前熱門文章的ID,再檢視前30篇文章(有可能訪問不了,至於原因以及具體怎麼做,你懂的):

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]:
    # 對於每篇文章,都執行一個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"])
複製程式碼

以下是輸出結果:

Status code: 200
200
200
-- snip --

Title: Wells Fargo Hit with $1B in Fines
Discussion link: http://news.ycombinator.com/item?id=16886328
Comments: 358

Title: Want airline food? Take Amtrak
Discussion link: http://news.ycombinator.com/item?id=16882231
Comments: 160

-- snip --
複製程式碼

5. 小結

目前已經完成了兩個專案,這本書還剩最後一個Django專案,從下一篇開始,也是用三篇文章來初步瞭解Django,製作一個簡單的web應用。


迎大家關注我的微信公眾號"程式碼港" & 個人網站 www.vpointer.net ~

Python學習之路16-使用API

相關文章