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

Posted java9188

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了空气质量数据网页爬虫加数据处理相关的知识,希望对你有一定的参考价值。

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

 

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

 

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

 

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

 

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

 

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

 

<td οnmοuseοver="report1664549over()" class="report1_4" style="color:#00A7D1;"><a href="http://datacenter.mep.gov.cn/report/air_daily/

airDairyCityHourMain.jsp?city=%B1%B1%BE%A9%CA%D0" style="font-family:宋体;font-size:12px;color:#00A7D1;font-weight:normal;

font-style:normal;text-decoration:underline;">北京市</a></td>

<td class="report1_10" style="color:#00A7D1;">2014-08-08 20:00</td>

<td class="report1_10" style="color:#00A7D1;">85</td>

<td class="report1_10" style="color:#00A7D1;">良</td>

<td οnmοuseοver="report1664549over()" class="report1_10" style="color:#00A7D1;">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月份,全国性的雾霾天明显有所减少。

 

以上是关于空气质量数据网页爬虫加数据处理的主要内容,如果未能解决你的问题,请参考以下文章

“反爬虫”与“反反爬虫”

“反爬虫”与“反反爬虫”

“反爬虫”与“反反爬虫”

【Python爬虫】分析网页真实请求

Python+Selenium+PhantomJs爬虫 怎么抓取弹出新标签页的内容

Python爬虫怎么获取下一页的URL和网页内容