空气质量数据网页爬虫加数据处理

Python这门语言因其简单强大已经火了很久了,但我接触的比较晚,前几个月因为一篇博客开始初步了解这门语言,并且之后模仿某位北邮的前辈的微博写了一个新浪微博的爬虫


这里给出链接:Python编写的新浪微博爬虫


当时为了能够顺便把从微博上抓下来的数据存储起来,顺便装了MySQL,之所以用MySQL,主要是因为Python支持MySQL的插件比较好找,比好状态"置疑"找一些,不过本人对数据库了解比较少,顺便学习了一些数据库方面的简单操作。


写好之后运行起来发现有些问题,主要是新浪微博的服务器对访问次数和访问频率有限制,以至于我下载了一些数据后,服务器会自动屏蔽不再传数据给我,当时挺困惑,网上有人说让程序睡一段时间再继续抓数据,当时也请教了北邮的前辈,也没给我一个明确的答复,也或许是自己写的问题,所以读到这里的朋友也可以提想法哈。或者到我微薄上留言:http://weibo.com/u/1820299335


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -分割线- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


最近看国内天气质量堪忧,所以心血来潮想要再写个程序把空气质量数据爬下来分析一下,于是开始动的手,由于之前写新浪微博爬虫的经验,这次比较快,因为不像新浪微博需要模拟用户登录,中华人民共和国环境保护部——数据中心的网页比起微博还算简单,所以很快代码就写好了,期间由于正则表达式运用不熟练,在抓取城市名称和污染指数时遇到点小麻烦,网页的html代码如下:


& lt; tdοnmοuseοver=皉eport1664549over ()”class=皉eport1_4祝辞& lt; a href=" http://datacenter.mep.gov.cn/report/air_daily/

airDairyCityHourMain.jsp吗?城市=% B1%B1%BE % A9%CA % D0”在北京市& lt;/a> & lt;/td>

& lt; td class=" report1_10”在2014-08-08 20:00

& lt; td class=" report1_10”在85 & lt;/td>

& lt; td class=" report1_10”祝辞良& lt;/td>

& lt; tdοnmοuseοver=" report1664549over()”类=" report1_10”祝辞PM2.5


是表格形式的,关键项的前后正则表达式不太会写,这里还望高手指点,不过我找到了替代的方法,网页下面还有一部分相关可以提取的html代码:

& lt;区域形状=熬匦巍弊?" 76116,86216 "标题="北京市机能指数85“在

& lt;区域形状=熬匦巍弊?" 104120114216 "标题="天津市机能指数82“在

& lt;区域形状=熬匦巍弊?" 131141141216 "标题="石家庄市机能指数64“在

& lt;区域形状=熬匦巍弊?" 159131169216 "标题="唐山市机能指数72”在

这个就方便提取多了,用python的正则表达式包可以一次性把所有的结果保存下来,其实也就这么几行代码:

def getList(自我、文本):

帕特=re.compile (' & lt;区域形状=熬匦巍弊?"。*" title="(.*) .+ ([0-9]+)">'.encode('utf-8'))

try:

cityList=pat.findall(text)

except:

cityList=None

return cityList

其中加了异常处理,一面在长时间运行过程中,出现错误程序异常终止。

第一次抓数据是从2014年1月抓到8月,(不知道为什么网站上没有2014年以前的空气质量数据,可能数据库没有开通吧),抓取数据的时间间隔为12小时,结果处理完生成GIF动图后发现,时间间隔略长,画面不连续,于是重写抓取,这次采用的是2个小时,一共运行了10几个小时把所有数据都下载下来了。


然后就是想办法做数据可视化,以前没用过地图数据可视化的工具,但是Matlab用的比较熟,Matlab做这种数据处理和图像处理都比较强大,所以就自己纯手工来进行数据可视化吧。


在网上截了个中国地图当背景,然后想办法用Matlab往上画数据。期间遇到点小麻烦,就是从网上找的城市坐标是经纬度表示的,需要映射到地图图像上相应的位置,我直接选用最简单的线性映射方式进行映射,结果发现在低纬度的城市映射结果还算准确,但是高纬度的城市要差200多km,无语了,怎么会差这么多!查了下发现,因为地图是百度地图截屏的,百度地图用的是所谓的麦卡托投影法,也就是圆柱投影,亏自己以前在本科时研究过光纤陀螺测量地理维度,这个都没注意到。修正之后城市的投影位置准确多了。比如说首都的位置:




把所有城市的空气质量用渐变色标在地图上,才发现自己美工差:

空气质量数据网页爬虫加数据处理