自从有娃以后,很久没有时间好好摸一摸编程了,周末的时候正好出门溜娃,就想到了空气质量的问题,虽然有APP啊上海发布啊之类的可以查,但我偏偏就是手贱要爬米帝领事馆的数据。(PM2.5监测网上的监测站点更多,但数据似乎总是低于美国领事馆公布的AQI)

是时候捡起python了!于是回到家,等孩子他妈哄睡了宝宝之后(妈妈真辛苦),我开始研究怎么实现我想要的功能。首先我上了一下数据监测页面http://aqicn.org/city/shanghai/quanshipingjun/cn/

右侧就是我们想要的每个监测点的数据,然而这是个动态网页,让我一个只学过怎么爬静态网页的人一脸懵逼……一番搜刮学习之后我找到了解决之道——一切没解决的问题都可以先用F12解决!

打开浏览器的F12,切换到Network标签,观察下面的JS或者XHR,试着拖动那张地图,看看下方的列表有没有变化,果然,每拖动一次XHR下就会生成1条记录,点进去一看,嘿~嘿~嘿~这不就是我们要的东西吗?

点击左侧的Headers还能看到动态网页的网址:

我们把这个网址复制下来,并解析,形如:

https://api.waqi.info/mapq/bounds/?bounds=31.043521630684204,121.19293212890624,31.466153715024294,121.84112548828125&inc=placeholders&k=_2Y2EzVxxIDVsfIydASBRWXmldZA4+LREbFkY3ZQ==&_=1497098578289

好长……是不是有点累觉不爱了?不过仔细看一下的话,bounds=后面的东西像不像坐标?这应该指的就是这张图的边界。多抓几次就会发现,每次不一样的除了坐标就只有最后那串数字,每次都不一样。我猜想这个会不会和时间有关呢?于是我每隔10秒移动一次地图,发现果然,每十秒钟差不多增加10000单位,那就是时间戳没跑了(其实后来发现,及时每次提交的时间戳即使一毛一样数据也会自动刷新……)。知道了这些之后就是写网页解析的代码了,这个就没太大难度了。

 1 url ="https://api.waqi.info/mapq/bounds/?bounds=31.064698120353743,121.201171875,31.487235582017444,121.84936523437499&inc=placeholders&k=_2Y2EzVxxIDVsfIydASBRWXmldZA4+LREbFkY3ZQ==&_=1497098578289" #动态网页网址
 2
 3 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
 4 headers = { 'User-Agent' : user_agent } #头文件
 5
 6 try:
 7     request = urllib.request.Request(url,headers = headers)
 8     response = urllib.request.urlopen(request) #获取数据
 9 except urllib.error.URLError as e:
10     if hasattr(e,"code"):
11         print(e.code)
12     if hasattr(e,"reason"):
13         print(e.reason)
14
15 aqi_trans=json.load(response) #json数据的解析
16 """
17 aqi_trans[0]数据结构:
18 {'aqi': '68',
19 'city': 'Yangpu Sipiao, Shanghai (上海杨浦四漂)',
20 'idx': 702,
21 'img': '_c_azCs5IzEvPSMzUfzZ3xbOty57Onv1sTxMA',
22 'lat': 31.2659,
23 'lon': 121.536,
24 'pol': 'pm25',
25 'stamp': 1497160800,
26 'tz': '+0800',
27 'utime': '2017-06-11 14:00:00',
28 'x': '482'}
29 共11个数据点
30 """

这里我们得到的aqi_trans是一个列表,列表中的每个元素都是一个字典,字典的内容就是监测站的名称啦,AQI指数啦,经纬度啦之类的信息。

之后就是简单的数据整理,这就交给pandas了。这里我选择了4个数据,idx应该是监测点的索引(但隔一段时间会换,不过序列情况不变),utime就是监测的时间,city是监测点的名字,用正则表达式去掉括号,AQI就是空气质量指数啦~不过AQI只有数值,没有等级,但这个很简单,一个cut函数就解决了。

 1 aqi_table=pd.DataFrame(columns=['Idx','Time','Site','AQI'])
 2
 3 for i in range(len(aqi_trans)):
 4     pos_idx=int(aqi_trans[i]['idx'])
 5     record_time=aqi_trans[i]['utime']
 6     site=re.findall(r'上海\S*(?=\))',aqi_trans[i]['city'])[0] #正则,提取括号里的文字
 7     aqi=int(aqi_trans[i]['aqi'])
 8     aqi_table=aqi_table.append({'Idx':pos_idx,'Time':record_time,'Site':site,'AQI':aqi},ignore_index=True)
 9 aqi_table=aqi_table.sort_values('Idx',ascending=True)
10 aqi_table=aqi_table.set_index(pd.Series(range(0,11)))
11 aqi_table['Level']=pd.cut(aqi_table['AQI'],[0,50,100,150,200,300,10000],labels=[u'优',u'良',u'轻度污染',u'中度污染',u'重度污染',u'严重污染']) #打标签

最后我决定写一个函数,把获取AQI的功能打包一下,然后定时运行一下这个函数(领事馆数据貌似每小时更新一次),监测的数据就放进一个csv文件里,方便后续处理。汇总一下代码如下:

import urllib #python 3中urllib和urllib2合并了,很多语法不同了
import json
import re
import pandas as pddef Get_AQI(t):url ="https://api.waqi.info/mapq/bounds/?bounds=31.064698120353743,121.201171875,31.487235582017444,121.84936523437499&inc=placeholders&k=_2Y2EzVxxIDVsfIydASBRWXmldZA4+LREbFkY3ZQ==&_=%d"%(t)#这里用的是动态时间戳,但时间戳好像并不影响数据的实时性,那只要隔一段时间提交一次同样的网址就行了
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = { 'User-Agent' : user_agent }try:request = urllib.request.Request(url,headers = headers)response = urllib.request.urlopen(request)except urllib.error.URLError as e:if hasattr(e,"code"):print(e.code)if hasattr(e,"reason"):print(e.reason)aqi_trans=json.load(response)aqi_table=pd.DataFrame(columns=['Idx','Time','Site','AQI'])for i in range(len(aqi_trans)):pos_idx=int(aqi_trans[i]['idx'])record_time=aqi_trans[i]['utime']site=re.findall(r'上海\S*(?=\))',aqi_trans[i]['city'])[0]aqi=int(aqi_trans[i]['aqi'])aqi_table=aqi_table.append({'Idx':pos_idx,'Time':record_time,'Site':site,'AQI':aqi},ignore_index=True)aqi_table=aqi_table.sort_values('Idx',ascending=True)aqi_table=aqi_table.set_index(pd.Series(range(0,11)))aqi_table['Level']=pd.cut(aqi_table['AQI'],[0,50,100,150,200,300,10000],\labels=[u'优',u'良',u'轻度污染',u'中度污染',u'重度污染',u'严重污染']) #分段打标签return aqi_tableimport timesleep_time=1800 #30分钟运行一次if __name__ == '__main__':while True:now_time=int(time.time()*1000)aqi_database=Get_AQI(now_time)aqi_database.to_csv('D:\\AQI\\aqi_database.csv',mode='a+') #记录csv文件,a+为追加写入       print(time.ctime())print(Get_AQI(now_time))time.sleep(sleep_time)

终于磕磕绊绊地码完了,发现自己果然忘了不少东西,python3和python2也有很多不同点了,还需要学习一个,提高姿势水平啊~心满意足之余,我还YY了一下把这功能放在一个树莓派里,然后定时给微信推送,白日梦真是美妙极了~

啊~白日梦……

转载于:https://www.cnblogs.com/silence-gtx/p/6995064.html

让米帝领事馆给你报空气质量(动态网页爬取及简单的数据整理)相关推荐

  1. Echarts实现空气质量仪表盘网页

    Echarts实现空气质量仪表盘 ECharts实现全国空气质量查询 Python Flask框架建立项目 Python 爬虫爬取空气质量数据 Echarts实现空气质量查询网页   全国空气质量查询 ...

  2. 城市空气质量(AQI)数据爬虫

    全国各城市(网页上有的)空气质量爬虫,包括城市名称,AQI等信息,保存为.csv文件格式 网址首页:https://www.aqistudy.cn/historydata/index.php 首先是获 ...

  3. 一个简单的空气质量数据监测站项目

    大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测.并通过网络将数据上传到OneNet​显示.​ 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM ...

  4. python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?...

    原标题:干货!如何用 Python+KNN 算法实现城市空气质量分析与预测? 作者 | 李秋键 责编 | 伍杏玲 封图 | CSDN 付费下载自东方 IC 出品 | CSDN(ID:CSDNnews) ...

  5. 利用pyecharts库对京津冀上广深空气质量数据进行可视化

    本文以当前热门编程语言Python作为开发工具,利用Python的BeautifulSoup库进行网页爬虫以获取空气质量数据(AQI.PM2.5),然后综合运用第三方库Pandas进行数据处理,最后利 ...

  6. HTML构建空气质量实时获取代码,基于C#的空气质量实时监测接口调用代码实例

    代码描述:基于C#的空气质量实时监测接口调用代码实例 关联数据:空气质量 接口地址:http://www.juhe.cn/docs/api/id/33 1.[代码][C#]代码 using Syste ...

  7. 【毕设参考】ESP32 + HaaS Python 打造在线空气质量检测器

    空气检测系统    下图是本案例除硬件连线外的3步导学,每个步骤中实现的功能请参考图中的说明. 简介    近几年空气污染逐渐变重,很多人对空气质量愈发关心.及时检测周报环境的空气质量并通过钉钉通知相 ...

  8. ECharts实现全国空气质量查询

    ECharts实现全国空气质量查询 ECharts实现全国空气质量查询   项目简介   效果展示   主要技术   主要流程   环境配置 Python Flask框架建立项目 Python 爬虫爬 ...

  9. 不同城市空气质量实时监测api接口分享

    空气质量实时监测api提供查询不同城市的空气质量最新结果.最近几周的空气质量数据和各监测点的数据. 备注:有的城市可能没有监测点实时监测的数据 接口名称:空气质量实时监测api 接口平台:聚合数据 接 ...

最新文章

  1. 物理Data Guard的日常维护
  2. 遍历Map的几种方式以及性能小结
  3. 逆序输出螺旋字符矩阵(三种方法)
  4. 1/2 常用函数:内建函数
  5. 18秋学期《计算机网络》在线作业,18秋北交《计算机应用基础及计算机网络与应用》在线作业一-2辅导资料.docx...
  6. 关于C#异步编程你应该了解的几点建议
  7. 前端学习(2780):创建项目和外观
  8. 内存淘汰机制 LRU cache
  9. c#hello world_C#| 打印消息/文本(用于打印Hello world的程序)
  10. java jsp常见问题_jsp和servlet常见问题总结
  11. NET- SplitContainer控件说明
  12. Semaphore示例
  13. 神经网络绘图软件推荐合集
  14. SAP+条码系统软件是如何优化仓库库存管理?
  15. 3D STL文件解析
  16. 论文之目录的页码修改
  17. 职业学校计算机教学总结报告,中职计算机教师教学工作总结(共6篇) .docx
  18. win7笔记本蓝牙连接蓝牙耳机设备,无法播放音乐,听不见声音
  19. 华晨宏盛让理财更有实用性的小窍门有哪些?最好的理财方法有哪些
  20. 求职面试找工作时,你遇到的奇葩问题?

热门文章

  1. 分布式查询工具-Apache Drill
  2. 联想yoga710_联想Yoga 2 Pro:笔记本电脑第一,瑜伽士第二
  3. RNN、RNNCell
  4. 如何替换空格、回车符
  5. [JavaScript]关于JavaScript中DOM对象的使用
  6. JavaScript 如何计算两个日期之间的天数
  7. Krpano(虚拟漫游)
  8. window10下搭建php的运行环境
  9. 对于分布式集群,应该思考什么问题?
  10. httpd.conf linux,linux上安装apache以及httpd.conf基本配置