# 使用API抓取新冠肺炎(COVID-19)的最新狀態 ###### tags: `python` `covid-19` `colab` `flask` ## RapidAPI ### 介紹 https://rapidapi.com/login RapidAPI是一個API的市集,就像Apple的App Store和Google PlayStore上面有各式各樣的App可以下載一樣,只是這裡可以讓你找到的不是APP,而是API,讓你不需要再發明輪子,直接使用全世界各國的開發者開發好的功能,讓你可以快速建立你的應用。 ### 申請Application Key API並非開放使用,每次的呼叫都遠端都會確認有經過授權,因為API的運作需要源源不斷的雲端服務,因為為了阻擋沒有經過同意的呼叫,每次呼叫API時都必須帶入這個Application Key。 申請或修改Application Key可以到「MyApps」選擇左邊已經建立App名稱,然後到「Security」頁面下設定。 ## 以Python開發 ### 需要的模組 | 模組名稱 | 說明 | 安裝 | | -------- | -------------------------------------- | --- | | Flask | 開發網站用 | `pip3 install flask` | | requests | HTTP要求模組,用來直接透過網路讀取網頁資料 | `pip3 install requests` | | Json | 操作CSV檔案格式模組 | 不需安裝 | ### 取的COVID-19的最新資料 本範例使用的API:https://rapidapi.com/KishCom/api/covid-19-coronavirus-statistics #### header ##### X-RapidAPI-Host(必要欄位) ``` covid-19-coronavirus-statistics.p.rapidapi.com ``` ##### X-RapidAPI-Key(必要欄位) ``` 4e99a51760msh101eb7f3fbb43a8p19880djsm1178154416e9 ``` > 這只是一個範例,並非真實的Application Key,請填入跟RapidAPI申請的Application Key,每個人會不同。 ### 完整整程式碼 ```python # -*- coding: utf-8 -*- from flask import Flask import requests import json import sys url = "https://covid-19-coronavirus-statistics.p.rapidapi.com/v1/total" querystring = {"country":"Global"} headers = { 'x-rapidapi-host': "covid-19-coronavirus-statistics.p.rapidapi.com", 'x-rapidapi-key': "3e99a92190msh101eb7e3faa43a8p13070djsn1178154416e5" } app = Flask(__name__) @app.route('/') def update_covid_19(): response = requests.request("GET", url, headers=headers, params=querystring) # print(response.text) data = json.loads(response.text) # 將JSON格式轉成Python資料型態 if data['statusCode'] != 200: print('無法取得資料.') sys.exit() # 最後要輸出到網頁的內容 result = f''' <!DOCTYPE html> <html> <head> <meta charset"utf-8"/> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.0.0/animate.min.css" /> </head> <body style="margin: 5px; text-align: center;" > <h1 class="animate__animated animate__bounce">全球武漢肺炎狀況最新資訊</h1> <img class="animate__animated animate__slideInLeft" src="https://www.cdc.gov.tw/Uploads/3d07c50d-5769-4cac-9b26-95a50589160e.png" width="600px"/><br/><br/> <p>更新時間:{data['data']['lastChecked'][:-6].replace('T', ' ')}<br/> 確診人數:{str(data['data']['confirmed'])}<br/> 死亡人數:{str(data['data']['deaths'])}<br/> 復原人數:{str(data['data']['recovered'])}<br/> </p> <iframe width="540" height="260" src="https://www.youtube.com/embed/FHSKtyfqGJU" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </body> </html> ''' print('全球武漢肺炎狀況更新') print('更新時間:', data['data']['lastChecked'][:-6].replace('T', ' ')) print('確診人數:', data['data']['confirmed']) print('死亡人數:', data['data']['deaths']) print('復原人數:', data['data']['recovered']) print('輸出網頁:', result) try: # 寫入檔案,可在本地端直接用瀏覽器開啟,如果僅需API,可以不須寫到檔案 with open('index.html', 'w') as src: src.write(result) except: print('Cannot write index.html') # HTTP Response return result if __name__ == '__main__': # 這裡只會在本地端執行生效 app.run(host='127.0.0.1', port=80, debug=True) ``` > 注意: > > `x-rapidapi-key`欄位內需要填入RapidAAPI配發的Application Key。 ### 執行結果 1. 程式執行成功會在目前路徑下產生`index.html`靜態網頁檔案,可以直接用瀏覽器打開觀看結果。 2. 啟動一個HTTP伺服器,在瀏覽器輸入:`127.0.0.1`就可以打開該網頁。 ![](https://i.imgur.com/sw4iDQq.jpg) ## 在Google Colab上執行 ### 前言 因為Google Colab是雲端環境,所有的程式碼都是在雲端執行,因此我們無法直接在雲端啟動一個Flask HTTP伺服器來接受外面的連線;所以需要透過其他方式處理。 ngrok這個服務可以幫忙來把連線的要求用轉接的方式幫忙轉到Colab裡面去,而且有提供Pyhon模組支援,且使用簡易,只需要加少少的程式碼就可以做到使用Colab來啟動HTTP伺服器。 使用步驟如下: 1. 安裝`flask-ngrok`模組,Colab並沒有支援ngrok,所以要額外安裝。 ``` !pip install flask-ngrok ``` > **補充** > > 在瀏覽器關閉以前,只需要安裝一次即可,因此可以額外開一個新的Cell來執行這個安裝指令。 2. 引入`flask-ngrok`模組 ``` from flask_ngrok import run_with_ngrok ``` > **補充** > > 可以在`from flask import Flask`上面來進行引入。 3. 加上將Flask物件轉拋給ngrok套件的程式碼: ``` run_with_ngrok(app) ``` > **補充** > > 請將該行加在`app = Flask(__name__)`下面即可。 4. 將最後`app.run()`內的參數全部移除: ``` app.run() ``` ### 執行結果 ![](https://i.imgur.com/aW2CM8L.png) **說明** 紅框圈起來就是ngrok服務幫忙轉拋的網址,點擊該連結就可以打開剛剛開發的網頁;只是每次重新執行程式都會變,舊的會失效,請使用每次執行後新的網址來測試網頁。