当前,有许多政府或企事业单位会在网上为公众提供相关的公开数据。以 http://api.help.bj.cn/api/均 .cn/api /网站为例,打开这个链接,大家可以看到多种可供调用的数据 。
进入 http://api.help.bj.cn/api/网站,单击“空气质量 API ” 。

 

 

 

 

 

 

 

 

 

我们可以看到其中提供的数据格式为 JSON 格式
通过上图所示的接口地址,
apis/ aqilist/ 。 其中数据结构如下 :

可知保存该数据的 完整链接为 http://api.help.bj.cn/api/?id=56
数据格式如下:

 

 

 

 

 

from bs4 import BeautifulSoup
import sqlite3,ast,hashlib,os,requests

conn = sqlite3.connect('E:\\DataBasePM25.sqlite') # 建立数据库连接
cursor = conn.cursor() # 建立 cursor 对象
# 建立一个数据表
sqlstr='''
CREATE TABLE IF NOT EXISTS TablePM25 ("no" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL UNIQUE ,"SiteName" TEXT NOT NULL ,"PM25" INTEGER)
'''
cursor.execute(sqlstr)
http://api.help.bj.cn/apis/aqilist/

 

 

url = "http://api.help.bj.cn/apis/aqilist/"
html=requests.get(url).text.encode('utf-8-sig')  # 读取网页原始码
# 判断网页是否更新
md5 = hashlib.md5(html).hexdigest()
old_md5 = ""
if os.path.exists('F:\\pythonBase\\pythonex\\ch06\\old_md5-.txt'):
    with open('F:\\pythonBase\\pythonex\\ch06\\old_md5-.txt', 'r') as f:
        old_md5 = f.read()
with open('F:\\pythonBase\\pythonex\\ch06\\old_md5-.txt', 'w') as f:
        f.write(md5)
print("old_md5="+old_md5+";"+"md5="+md5)  #显示新老md5码进行观察

 

 

if md5 != old_md5:
    print('数据已更新...')    
    sp=BeautifulSoup(html,'html.parser')   #解析网页内容
    jsondata = ast.literal_eval(sp.text)  #此时jscondata取到的是字典类型数据
    # 删除数据表内容
    js1=jsondata.get("aqidata")     #取出字典数据中的aqidata项的值(值是列表)
    conn.execute("delete from TablePM25")
    conn.commit()
    n=1
    for city in js1:   #city此时是列表js1中的第一条字典数据
        CityName=city["city"]  #取出city字典数据中的值为"city"的key
        if(city["pm2_5"]==""):
            PM25=0
        else:
            PM25=int(city["pm2_5"])
       # PM25=0 if city["pm2_5"] == "" else int(city["pm2_5"])  #如果city字典中的key对应的value为空,则PM25=0,否则,把PM25=value   
        print("城市:{}   PM2.5={}".format(CityName,PM25))   #显示城市对应的名称与PM2.5值
        # 新增一笔记录
        sqlstr="insert into TablePM25 values({},'{}',{})" .format(n,CityName,PM25)
        cursor.execute(sqlstr)
        n+=1
        conn.commit() # 主动更新 
else:
    print('数据未更新,从数据库读取...') 
    cursor=conn.execute("select *  from TablePM25")
    rows=cursor.fetchall()
    for row in rows:
        print("城市:{}   PM2.5={}".format(row[1],row[2]))    

conn.close()  # 关闭数据库连