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 | 向死而生

该日志由 Matt Sun 于2012年03月17日发表在 我是唐僧 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Python 3.2初体验 – 抓取保存空气质量日报 | 向死而生
关键字: , , ,

Python 3.2初体验 – 抓取保存空气质量日报:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter