研究生導師布置的作業!利用Python和API收集與分析網絡數據!
猜猜看,下面這一組調查對象是什麽?
為什麽會這樣呢?
因為我在布置作業的時候,很貼心地給了一個樣例,是我之前寫的一篇教程《 如何用R和API免費獲取Web數據? 》。
於是,多組作業,都雷同。
講到這裏,他們一副不好意思的表情。
我卻發覺,這裏蘊藏著一個問題。
幾乎所有國內雲市場的 API 產品,都有豐富的文檔。不少還幹脆給出了各種編程語言對應調用代碼。
這是一款收費 API ,100次調用的價格為1分錢。
作為作業練習,100次調用已經足夠了。
這價格,他們表示可以接受。
我自己走了一遍流程。
點擊“立即購買”按鈕。
你會被引領到付費頁面。如果你沒有登錄,可以根據提示用淘寶賬號登錄。
支付1分錢以後,你會看到如下的成功提示。
之後,系統會提示給你一些非常重要的信息。
如果你的操作系統裏面已經安裝了 curl (沒有安裝的話,可以點擊這個鏈接,尋找對應的操作系統版本下載安裝),嘗試把上圖中 curl 開頭的那一行代碼拷貝下來,復制到文本編輯器裏面。
就像這樣:
curl -i -k --get --include ‘https://ali-weather.showapi.com/weatherhistory?area=%E4%B8%BD%E6%B1%9F&areaid=101291401&month=201601‘ -H ‘Authorization:APPCODE 你自己的AppCode‘
然後,一定要把其中的“你自己的AppCode”這個字符串,替換為你真實的 AppCode 。
把替換好的語句復制粘貼到終端窗口裏面運行。
運行結果,如下圖所示:
看見窗口下方包含中文的數據了嗎?
利用 API 獲取數據,就是這麽簡單。
上圖中,除了剛才我們使用的 curl ,還包括以下語言訪問 API 接口的樣例說明:
-
Java
-
C#
-
PHP
-
Python
-
Object C
我們以 Python 作為例子,點開標簽頁看看。
你只需要把樣例代碼全部拷貝下來,用文本編輯器保存為“.py”為擴展名的 Python 腳本文件,例如 demo.py 。
為什麽許多學生做不出來結果呢?
我讓他們實際跑了一下,發現確實有的學生粗心大意,忘了替換自己的 AppCode 。
但是大部分同學,由於安裝最新版本的 Anaconda (Python 3.6版),都遇到了下面的問題:
你可能會認為這是因為沒有正確安裝 urllib2 模塊,於是執行
pip install urllib2
你可能會看到下面的報錯提示:
在他們看來,官方網站提供的樣例,就應該是可以運行的。報了錯,又不能通過自己的軟件包安裝“三板斧”來解決,就會慌亂和焦慮。
更進一步,他們也不太了解 JSON 格式。
雖然,JSON已是一種非常清晰的、人機皆可通讀的數據存儲方式了。
他們想了解的,是怎麽把問題遷移到自己能夠解決的範圍內。
環境
首先我們來看看代碼運行環境。
前面提到過,如果樣例代碼的運行環境,和你本地的運行 環境不一 ,計時代碼本身沒問題,也無法正常執行 。
這個界面來自 Jupyter Lab。
圖中左側分欄,是工作目錄下的全部文件。
右側打開的,是咱們要使用的ipynb文件。
根據我的講解,請你逐條執行,並仔細觀察運行結果。
本例中,我們主要會用到以下兩個新的軟件包。
首先是號稱“給人用”(for humans)的HTTP工具包requests。
代碼
首先,讀入HTTP工具包requests。
import requests
第二句裏面,有“Your AppCode here”字樣,請把它替換為你自己的AppCode,否則下面運行會報錯。
appcode = ‘Your AppCode here‘
我們嘗試獲取麗江5月份的天氣信息。
在API信息頁面上,有城市和代碼對應的表格。
位置比較隱蔽,在公司簡介的上方。
看來我們需要在HTTP數據頭(header)中,加入 AppCode。
我們依次把這些信息都寫好。
url = ‘https://ali-weather.showapi.com/weatherhistory‘payload = {‘areaid‘: areaid, ‘month‘: month}headers = {‘Authorization‘: ‘APPCODE {}‘.format(appcode)}
下面,我們就該用 requests 包來工作了。
requests 的語法非常簡潔,只需要指定4樣內容:
-
調用方法為“GET”
-
訪問地址 url
既然調用成功,我們看看 API 接口返回的具體數據內容吧。
調用返回值的 content 屬性:
r.content
這一屏幕,密密麻麻的。
其中許多字符,甚至都不能正常顯示。這可怎麽好?
沒關系,從 API 信息頁上,我們得知返回的數據,是 JSON 格式。
返回的是一個列表。
因為列表裏面只有一個城市,所以我們只讓它返回第一項即可。
dfs[0]
這次顯示的,就是數據框了:
假設我們要綜合分析幾個城市的天氣信息,那麽就可以把這幾個數據框整合在一起。
用到的方法,是 Pandas 內置的 concat
函數。
它接收一個數據框列表,把其中每一個個數據框沿著縱軸(默認)連接在一起。
df = pd.concat(dfs)
看看此時的總數據框效果:
df
這是開頭部分:
這是結尾部分:
3個城市,4個多月的數據都正確讀取和整合了。
下面我們嘗試做分析。
這次就對了,日期和 AQI 都分別變成了我們需要的類型。其他數據,暫時保持原樣。
有的是因為本來就該是字符串,例如城市名稱。
另一些,是因為我們暫時不會用到。
下面我們繪制一個簡單的時間序列對比圖形。
讀入繪圖工具包 plotnine 。
註意我們同時讀入了 date_breaks
,用來指定圖形繪制時,時間標註的間隔。
我們指定橫軸為時間序列,縱軸為 AQI,用不同顏色的線來區分城市。
繪制時間的時候,以“2周”作為間隔周期,標註時間上的數據統計量信息。
我們修改橫軸的標記為中文的“日期”。
因為時間顯示起來比較長,如果按照默認樣式,會堆疊在一起,不好看,所以我們讓它旋轉45度角,這樣避免重疊,一目了然。
為了讓圖中的中文正常顯示,我們需要指定中文字體,這裏我們選擇的是開源的“文泉驛微米黑”。
數據可視化結果,如下圖所示。
怎麽樣,這張對比圖,繪制得還像模像樣吧?
從圖中,你可以分析出什麽結果呢?
反正我看完這張圖, 很想去麗江 。
當然,要是能給我的repo加一顆星,就更好了。
討論
你之前嘗試過用 Python 和 API 獲取數據嗎?你使用了哪些更好用的軟件包進行數據獲取、處理、分析與可視化呢?你還使用過哪些其他的數據產品市場?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
轉載於:玉樹芝蘭”(nkwangshuyi) 。
歡迎關註我的博客:https://home.cnblogs.com/u/Python1234/
歡迎加入千人交流答疑群:125240963
研究生導師布置的作業!利用Python和API收集與分析網絡數據!