爬取空气质量指标 ( AQI )
这篇文章会使用 Python 的 Requests 函数库,借由政府数据开放平台的空气质量指标 ( AQI ) 的 API,实作一个可以自动抓取空气质量指标数值的网络爬虫,并进一步使用 CSV 储存数据。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
关于政府数据开放平台
政府数据开放平台是一个政府提供各种开放数据的管道,让民众可以在政府资源有限下,善用无限的创意,整合运用开放数据,推动政府数据开放加值应用,发展出各项跨机关便民服务。
政府数据开放平台:https://data.gov.tw/
关于空气质量指标 ( AQI )
从政府数据开放平台里,搜索“空气质量指标”,就能打开空气质量指标 ( AQI ) 的数据页面,数据有提供 JSON 格式与 CSV 格式,这个范例中会使用 JSON 格式,点击对应的按钮,就可以打开对应的 JSON API 内容。
- 空气质量指标 ( AQI ) :https://data.gov.tw/dataset/40448
- JSON API:文件链接
打开 API 后,可以从内容架构里,找到 records 的“键”,records 的内容由串列和字典 ( 或称对象和数组 ) 所组成,包含地点 SiteName、城市 County、AQI、PM2.5...等空气质量指标的数值。
爬取空气质量指标
使用 Requests 函数库的 get 的方法,抓取空气质量指标的内容,接着取出 records 的内容,由于 records 的内容为串列和字典所组成,直接使用 for 循环将结果印出。
import requests
# 2022/12 時氣象局有修改了 API 內容,將部份大小寫混合全改成小寫,因此程式碼也跟著修正
url = 'https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON'
data = requests.get(url) # 使用 get 方法透過空氣品質指標 API 取得內容
data_json = data.json() # 將取得的檔案轉換為 JSON 格式
for i in data_json['records']: # 依序取出 records 內容的每個項目
print(i['county'] + ' ' + i['sitename'], end=',') # 印出城市與地點名稱
print('AQI:' + i['aqi'], end=',') # 印出 AQI 數值
print('空氣品質' + i['status']) # 印出空氣品質狀態
使用 CSV 储存数据
能取得空气质量指标后,下一步可利用 Python 内建的 CSV 标准函数库,将数据储存为 CSV 文件,下方的程序执行后,会先指定 Colab 执行的目录,接着建立一个名为 csv-aqi 的 CSV 文件,再将数据转换为二维数组,写入 CSV。
参考:CSV 文件操作、Colab 连动 Google Drive、文件操作 os - chdir(path)、内建函数 ( 文件读写 open )、for 循环
import requests
import csv
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑
csvfile = open('csv-aqi.csv', 'w') # 建立空白並可寫入的 CSV 檔案
csv_write = csv.writer(csvfile) # 設定 csv_write 為寫入
url = 'https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=JSON'
data = requests.get(url)
data_json = data.json()
output = [['county','sitename','aqi','空氣品質']] # 設定 output 變數為二維串列,第一筆資料為開頭
for i in data_json['records']:
# 依序將取得的資料加入 output 中
output.append([i['county'],i['sitename'],i['aqi'],i['status']])
print(output)
csv_write.writerows(output) # 多行寫入 CSV
微信扫码关注
抖音扫码关注