本文內容來源:https://www.dataquest.io/mission/117/working-with-apis
本文的數據來源:https://en.wikipedia.org/wiki/International_Space_Station
本文摘要:通過requests庫和github的api來操作github倉庫,從而熟悉一下與網絡數據交互的過程
API(Application Program Interface)的作用是查詢和返回網絡上的動態數據,譬如股票的價格信息和新聞的實時評論。通過API獲取數據的過程就像你訪問一個網頁一樣,向服務器提交請求,然后服務器返回相應的數據。通常使用requests庫(http://www.python-requests.org/en/latest/)來提交請求的,本文所用的github的API地址為:https://developer.github.com/v3/
獲取訪問令牌
要想通過api來操作你的github,必須要先在github的網址(https://github.com/settings/tokens)上生成一個訪問令牌
使用訪問令牌而不是用用戶名和密碼的原因有兩個:
- 通常放入了程序中的用戶名和密碼是很容易泄密的,別人看到了你的代碼后知道了用戶名和密碼就能進行任意的操作。而如果有人使用了你的訪問令牌,你可以隨時注銷掉該令牌
- 訪問令牌是可以進行細粒度的權限配置,你可以設置該令牌只能查看你的github,從而保證了安全
獲取到了訪問令牌后,記得馬上復制下來,並記錄在程序中,往后的所有requests都必須帶着這個訪問令牌,記得必須要有token字段
{"Authorization": "token 975ef3a9dff1a7dc50d5f0a4341ecf5a89f201ab"}
注意:本文中的所有出現kylinlin的地方都要替換為你的賬戶名
GET請求
GET請求用戶從服務器中獲取信息
# 獲取授權用戶的信息 import requests headers = {"Authorization": "975ef3a9dff1a7dc50d5f0a4341ecf5a89f201ab"} # 前兩行會在后面的代碼中忽略掉不寫 user = requests.get('https://api.github.com/user', headers=headers).json() print user #如果get()方法里沒有headers參數,則會返回如下結果:(表示要求認證) {u'documentation_url': u'https://developer.github.com/v3', u'message': u'Requires authentication'} 但並不是所有的方法都必須要帶上headers參數 獲取個人信息(將kylinlin替換為任意的帳戶名都可以) response = requests.get("https://api.github.com/users/kylinlin") print response.status_code print response.json()
每一個訪問都會生成一個狀態碼,用屬性status_code表示,這個狀態碼用來表示這個訪問的結果:
- 200 -- 一切正常,返回了要求的結果
- 301 -- 服務器將該請求重定向到其他網站
- 401 -- 身份認證出錯
- 400 -- 服務器認為這是一個錯誤請求
- 403 -- 你無權訪問該資源
- 404 -- 訪問的資源不存在
一個請求返回的內容默認是字符串格式,要提取該內容中的某些信息,最方便的方法就是將字符串轉換成python對象,而json()方法用來實現這個功能的。
在get方法里帶上參數,requests.get()方法里的params參數就是url里的參數,與headers參數不同,headers參數的值會寫在請求頭里,而params參數的值會寫在url里,譬如要獲取github作者所關注的項目,並將50條結果作為一頁,獲取第一頁的內容。此時的url實際上是這樣的:https://api.github.com/users/kylinlin/starred?pre_page=50&page=1
params = {"per_page": 50, "page": 1} response = requests.get("https://api.github.com/users/kylinlin/starred", params=params) page1_repos = response.json() print page1_repos
POST請求
POST請求用於向服務器發送信息,然后在服務器上創建對象,譬如要創建一個新的項目
payload = {'name':'learning-about-apis'} # name參數的值是要創建的項目名稱 status = requests.post('https://api.github.com/user/repos', headers=headers, json=payload).status_code # json參數會將payload變量轉化為字典格式 print status # 輸出201就表明項目創建成功
PATCH和PUT請求
有時候我們只是要更新一個項目的信息,此時就可以使用PATCH或PUT方法,譬如要更新剛才創建的項目的描述信息
payload = {'description': 'Learning about requests!', 'name': 'learning-about-apis'} status = requests.patch('https://api.github.com/repos/kylinlin/learning-about-apis', json=payload, headers=headers).status_code print status # patch方法成功后會返回200
DELETE請求
DELETE請求用於刪除服務器上的對象,譬如要刪除剛才的項目
status = requests.delete('https://api.github.com/repos/kylinlin/learning-about-apis', headers=headers).status_code print status #輸出204就表示刪除成功