Python爬取逐小时的AQI数据

最近做了一点微小的工作,从环保部数据中心的官网中爬取每个城市逐日的AQI(空气质量指数),现记录一下过程,方便日后回忆。
这也是第一次用Python写爬虫,发现python真的是蛮容易上手的一个工具,学会基本的语法后,看一些案例,自己动手调试,大概一周时间断断续续写完的。
写代码永远是最后的步骤,在此之前,你需要对自己做什么,怎么完成有一个规划,这样做起来才事半功倍。


观察所要抓取的数据——所要抓取的信息怎么得到——如何抓取下一页信息——怎样保存

通过分析,我找到网页中所有抓取的文件都保存在名为report1这个表格中;
http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp?city=&startdate=2016-12-02%2012:00&enddate=2016-12-02%2012:00&page=2
网址的构造如上所示,表示2016年12月2日中午12点AQI数据的第二页,据此分析,我们就可以构造每一页对应的网址;
最后通过xlwt库将我们抓取的数据保存到EXCEL中。


  • 导入所需要的库
    from urllib2 import urlopen, Request from bs4 import BeautifulSoup import xlwt import datetime

  • 访问网址

def getBS(url):
    header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    req = Request(url, headers=header)
    html = urlopen(req)
    bsObj = BeautifulSoup(html, 'html.parser')
    return bsObj
  • 找到总页数
def getTotalPagesNum(htmltree):
    a = htmltree.findAll('font', {'color': '#004e98'})
    return a[1].get_text()
  • 打印每一页的信息
def getPageInfo(htmltree):
    # 找到空气质量的表格
    table = htmltree.find('table', {'id': 'report1'})
    rows = table.findAll('tr', {'height': '30'})
    # 将每一条数据输出到屏幕且保存到Items,Items中保存了所有AQI信息
    for i in range(2, len(rows)):
        data = rows[i].findAll('td')
        AQIItems = str()
        for item in data:
            AQIItems += item.get_text() + '    '
        print AQIItems
        Items.append(AQIItems)
  • 打印表头和每一页的信息
def printInfo(BSObj, baseurl):
    # 找到总页码数,在屏幕上打印出表头
    pages = getTotalPagesNum(BSObj)
    table = BSObj.find('table', {'id': 'report1'}).findAll('tr', {'height': '30'})
    Attrs = table[1].findAll('td')
    TableHeader = ''
    for Attr in Attrs:
        TableHeader += Attr.get_text() + '    '
    print TableHeader  # 显示表头字段名称

    # 在屏幕上显示查询结果并保存
    for i in range(1, int(pages) + 1):
        url = baseurl + '&page=' + str(i)
        bs = getBS(url)
        getPageInfo(bs)
  • 保存到EXCEL
def saveExcel(AQIdata):
    attrs = ['序号', '城市', '时间', 'AQI指数', '空气质量级别' , '首要污染物']
    wbk = xlwt.Workbook(encoding='utf-8')
    sheet1 = wbk.add_sheet('sheet1')
    cursor = 0
    # 输入各字段名称
    for attr in attrs:
        sheet1.write(0, cursor, attr)
        cursor += 1

    row = 1
    for AQIitem in AQIdata:
        lis = AQIitem.split('    ')
        col = 0
        for ls in lis:
            sheet1.write(row, col, ls)
            col += 1
        row += 1
    filename = ur'AQIData.xls'
    wbk.save(filename)

将上面的函数综合起来,写到主函数中:

def main():
    print '- '*30
    # startdate = raw_input('请输入起始日期(如2016-09-07):')
    # starttime = raw_input('请输入起始时间(如20:00):')
    # enddate = raw_input('请输入结束日期(如2016-09-08):')
    # endtime = raw_input('请输入结束时间(如18:00):')
    # isallcity = raw_input('是否查询所有城市?(Y/N)')
    # if isallcity[0].lower() == 'n':
    #     city = raw_input('请输入要查询城市(如北京市):')
    # else:
    #     city = ''
    # 打开空气质量界面

    baseurl = 'http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp?city=&startdate=2016-10-10%2000:00&enddate=2016-10-17%2000:00'



    BSObj = getBS(baseurl)
    global Items
    Items = []
    # 将信息输出到屏幕
    printInfo(BSObj, baseurl)
    # 存储到表格中
    saveExcel(Items)

备注:
1、实际情况下,此网址查询速度极慢,我零零散散下了16个txt文件,才下完6w+条数据。
2、此处为了方面,直接将网址写到了代码里,可根据自己的需要,设计一些交互式操作,参考主函数里面的注释部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 1,665评论 0 5
  • 前端时间自学了python的基本语法,为深入了解python,就打算真正的鼓捣些东西,加深记忆。据说,pyth...
    wsdadan阅读 326评论 0 0
  • 在上一篇中 , 我们构建了一个爬虫, 可以通过跟踪链接的方式下载我们所需的网页。 但是爬虫在下载网页之后又将 结果...
    枫灬叶阅读 1,957评论 0 5
  • 我叫姚发 我是个“名人” 一个特别不出名的人 身边的人叫我“姚总” 毫不夸张的说,我认识的老总 他们的身价加起来都...
    姚发阅读 1,034评论 0 1
  • 很少有人敢质疑权和威的合理性,于是这世界变得安宁。
    华北燕阅读 194评论 0 0