Python 3.2初体验 – 抓取保存空气质量日报
最近成都的气温终于有所回升。春姑娘来了,我的棉裤也脱了。。。
貌似已经连着两天都出太阳,但这天让人蛋疼,似乎永远是灰蒙蒙的。不知道蓝天和白云是不是也躲进了美领馆。没想到成都天气质量竟如此的差,实在没有办法不怀念印象中的蓝天白云。在成都长大的孩子,会不会不知道有蓝天白云这种东西?
每天都刷一遍中央气象台的空气质量日报,成都已成功的连续几天破百。这还只是PM10的数据,要是把PM2.5的数据透露出来,不知得多吓人。另一点不爽的是日报每天更新,但不提供历史记录查询。想起最近工作中常用的爬虫小程序,决定自己动手DIY一个,把这些数据保留下来,然后再做data visualization。俗话说,干是一种美德。在折腾了一晚上后,能达到要求的alpha版本竟然出来了,比我预计的顺利得多。虽然很简陋,但是对N久没有写过代码 + 初学Python + 其实之前也没系统学过编程且智商不高的我来说,还是很happy滴。
语言:恩,标题就大大的剧透,用的是Python3.2。大概和大部分想学编程的人一样,最开始会纠结于学哪种语言。几年前就仔细比较过Perl,Ruby,Python,PHP等。看了一圈下来觉得Python最合适。虽然一直对Python感兴趣,但却一直没下手。而最近明显感觉到对各种小工具的需求慢慢增大,尤其是做一些数据的简单分析统计和可视化。于是终于撸起袖子开始尝试。
基本需求:爬一下中央气象台的空气质量日报页面,判断是否已更新当天的数据。如果已更新,则把页面另存下来,同时将里面的城市,污染指数,首要污染物,空气质量级别和空气质量状况提取出来,保存成逗号分隔的txt文件,方便后面的可视化部分。
除Python本身外用了Beautiful Soup这个第三方库。
思路及过程:最初是准备用正则表达式来提取网页中的内容,后来在搜索时找到了下面链接中的第二篇文章,了解到貌似Beautiful Soup是个好东西。于是装了BS后边阅读BS的文档,边尝试,找到实现目标的方法。一开始的预期只是把提取所需的信息这个核心部分弄出来,后来发现比预计的快了许多,于是不断的“完善”功能,让它尽量像一个可用的小工具。除了BS部分是看文档尝试出来的,其它基本全部是Google,然后安装提示尝试,包括获取日期,日期格式,用urllib访问网页获取页面信息,读写文件,中文页面的编码问题,for循环和if判断等
毫无疑问很原始。。。
#coding=utf-8 import time date = time.strftime('%Y%m%d', time.localtime()) date2 = time.strftime('%Y', time.localtime())+"年"+time.strftime('%m', time.localtime())+"月"+time.strftime('%d', time.localtime())+"日" import urllib.request response = urllib.request.urlopen('http://www.nmc.gov.cn/publish/environment/aq.htm') page = response.read().decode('GBK') f = open ("d:\\py32\\airquality\\"+date+".html", "wt") f.write(page) f.close() from bs4 import BeautifulSoup aq = BeautifulSoup(open("d:\\py32\\airquality\\"+date+".html")) thedate = aq.find("div", "author").string if thedate == date2: main = aq.table row = main.th.parent aqstac = ' ' for i in range(47): row = row.next_sibling.next_sibling city = row.th nb = city.next_sibling plth = nb.next_sibling level = plth.next_sibling condition = level.next_sibling aqstac = aqstac + '\n' + city.string + ',' + nb.string + ',' + plth.string + ',' + level.string + ',' + condition.string i = i + 1 print(aqstac) f = open("d:\\py32\\airquality\\"+date+".txt", "wt") f.write(aqstac) f.close() else: print("No fresh data!") import os os.remove("d:\\py32\\airquality\\"+date+".html")
3.22
复习beautiful soup的用法,顺便改用while代替for循环,用数的方法太笨 = =#
if thedate == date2: f = open ("d:\\py32\\airquality\\"+date+".html", "wt") f.write(page) f.close() begin = "北京" row = aq.table.find(text = begin).parent.parent.parent f = open("d:\\py32\\airquality\\"+date+".txt", "wt") while row is not None: city = row.th nb = city.next_sibling plth = nb.next_sibling level = plth.next_sibling condition = level.next_sibling aqstac = city.string + ',' + nb.string + ',' + plth.string + ',' + level.string + ',' + condition.string + '\n' print(aqstac) f.write(aqstac) row = row.find_next_sibling() f.close()
用到的链接
中央气象台空气质量日报 http://www.nmc.gov.cn/publish/environment/aq.htm
Web Scraping with Python http://www.packtpub.com/article/web-scraping-with-python
Beautiful Soup文档 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#
获取时间 http://www.cnblogs.com/wanpython/archive/2010/08/07/1794598.html
文件读写操作 http://hi.baidu.com/jxq61/blog/item/c2ec75115e2de68c6438db04.html
for循环和if判断 http://blog.csdn.net/treesky/article/details/7071640
抓取网页的方法 http://www.tetx.com/program/htm/tetx/blog/view/blog_id/1291521414/index.htm
中文编码问题 http://www.cnblogs.com/meteoric_cry/archive/2011/10/28/2227175.html
删除文件和目录 http://www.jb51.net/article/26537.htm
本文固定链接: https://offmask.com/2012/python-3-2-air-quality-daily-report.html | 向死而生