zoukankan      html  css  js  c++  java
  • 吴裕雄--天生自然python学习笔记:抓取网络公开数据

    当前,有许多政府或企事业单位会在网上为公众提供相关的公开数据。以 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()  # 关闭数据库连 

  • 相关阅读:
    UVA1452|LA4727-----Jump------经典的约瑟夫公式的变形(DP)
    ORM框架Hibernate (四) 一对一单向、双向关联映射
    heaters
    对SIGQUIT的实验 & Java dump
    【Todo】单例模式各种实现方式及并发安全
    【转载】Spark系列之运行原理和架构
    git本地文件回滚操作
    Java异常与运行时异常,以及与线程的关系
    Callable与Future、FutureTask的学习 & ExecutorServer 与 CompletionService 学习 & Java异常处理-重要
    Linux系统负载排查
  • 原文地址:https://www.cnblogs.com/tszr/p/12024833.html
Copyright © 2011-2022 走看看