Python这门语言因其简单强大已经火了很久了,但我接触的比较晚,前几个月因为一篇博客开始初步了解这门语言,并且之后模仿某位北邮的前辈的微博写了一个新浪微博的爬虫
这里给出链接:python编写的新浪微博爬虫
当时为了能够顺便把从微博上抓下来的数据存储起来,顺便装了MySQL,之所以用MySQL,主要是因为Python支持MySQL的插件比较好找,比SQLserver好找一些,不过本人对数据库了解比较少,顺便学习了一些数据库方面的简单操作。
写好之后运行起来发现有些问题,主要是新浪微博的服务器对访问次数和访问频率有限制,以至于我下载了一些数据后,服务器会自动屏蔽不再传数据给我,当时挺困惑,网上有人说让程序睡一段时间再继续抓数据,当时也请教了北邮的前辈,也没给我一个明确的答复,也或许是自己写的问题,所以读到这里的朋友也可以提想法哈。或者到我微薄上留言:http://weibo.com/u/1820299335
———————————————————分割线———————————————–
最近看国内天气质量堪忧,所以心血来潮想要再写个程序把空气质量数据爬下来分析一下,于是开始动手,由于之前写新浪微博爬虫的经验,这次比较快,因为不像新浪微博需要模拟用户登录,中华人民共和国环境保护部–数据中心 的网页比起微博还算简单,所以很快代码就写好了,期间由于正则表达式运用不熟练,在抓取城市名称和污染指数时遇到点小麻烦,网页的html代码如下:
<td οnmοuseοver=”report1664549over()” class=”report1_4″ ><a href=”http://datacenter.mep.gov.cn/report/air_daily/
airDairyCityHourMain.jsp?city=%B1%B1%BE%A9%CA%D0″ >北京市</a></td>
<td class=”report1_10″ >2014-08-08 20:00</td>
<td class=”report1_10″ >85</td>
<td class=”report1_10″ >良</td>
<td οnmοuseοver=”report1664549over()” class=”report1_10″ >PM2.5</td>
是表格形式的,关键项的前后正则表达式不太会写,这里还望高手指点,不过我找到了替代的方法,网页下面还有一部分相关可以提取的html代码:
<area shape=”rect” coords=”76,116,86,216″ title=”北京市 AQI指数 85″>
<area shape=”rect” coords=”104,120,114,216″ title=”天津市 AQI指数 82″>
<area shape=”rect” coords=”131,141,141,216″ title=”石家庄市 AQI指数 64″>
<area shape=”rect” coords=”159,131,169,216″ title=”唐山市 AQI指数 72″>
这个就方便提取多了,用python的正则表达式包可以一次性把所有的结果保存下来,其实也就这么几行代码:
def getList(self,text):
pat = re.compile(‘<area shape=”rect” coords=”.*” 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,无语了,怎么会差这么多!查了下发现,因为地图是百度地图截屏的,百度地图用的是所谓的麦卡托投影法,也就是圆柱投影,亏自己以前在本科时研究过光纤陀螺测量地理维度,这个都没注意到。修正之后城市的投影位置准确多了。比如说首都的位置:
把所有城市的空气质量用渐变色标在地图上,才发现自己美工差:
(颜色随着空气污染指数的变差按:绿(优)、黄(良)、橙(轻微污染)、红(轻度污染)、紫(中度污染)、黑(重度污染)的顺序变化)
一个一个的红点像是生了皮肤病,还是用插值处理一下吧,还好Matlab在这方面功能比较强大,不用费工夫:
好了很多,当然上图的效果也是经过小小处理过的,总的来讲画面感同专业软件比还有一定差距,但考虑到我是用Matlab画出来的,这个画质我接受了,能够说明问题就行。
然后我挑选了一些有特点的空气污染比较严重的日子,制作生GIF动图,动图使用PhotoShop制作的。图中着重关注红紫色的雾霾在大气中的移动。
这个是14年1月2日14点 至14年1月4日18点,这次严重雾霾天影响全国,雾霾主要产生地主要有三个,河北山东一带,湖南湖北一带,重庆四川一带,总的看来是人口稠密,工业较多,而且也有地形因素在内。
左:(2014-01-11-18至2014-01-13-08)右:(2014-01-19-14至2014-01-20-18),北方的雾霾天还是比较严重的,并且冬季多北风,雾霾向南方或东南方向扩散,当时南方的很多雾霾天也就这么产生了。。。
(2014-03-17-06至2014-03-19-06)其实北京地区的污染源也并不完全是北京河北,比如这个就说明污染来自春季的蒙古大草原,查询当天北京是北风。。。
(2014-05-26-20 至2014-05-28-00)再如这张,也比较明显,查询当天北京天气是浮尘,也是北风
总的来说,空气质量差是全国性的,污染源比较多,只不过有些地方地理因素扩散起来快一些,扩散慢的话,即便是山清水秀的贵州也难免有雾霾。过了4月份,全国性的雾霾天明显有所减少。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/184829.html