1. 程式人生 > >研究生導師布置的作業!利用Python和API收集與分析網絡數據!

研究生導師布置的作業!利用Python和API收集與分析網絡數據!

顏色 urllib 腳本 城市名 文件 object http 默認 環境

技術分享圖片

技術分享圖片

猜猜看,下面這一組調查對象是什麽?

技術分享圖片

技術分享圖片

技術分享圖片

為什麽會這樣呢?

因為我在布置作業的時候,很貼心地給了一個樣例,是我之前寫的一篇教程《 如何用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收集與分析網絡數據!