实时抓取空气质量数据

2016-11-04  本文已影响0人  家琦的三亩地

利用如下网址来获取某个城市的空气质量

http://pm25.in/

人家本来是提供了API的,而且也有公共Token可以让人测试,但是我觉得调人家接口有点不好意思,反正我只要数据,也就不占用人家的服务了(哈哈,就是把爬虫说的这么清新脱俗),真的,你看我最后的time.sleep(1*60)就知道我真的不是那种恶意把人家服务器搞趴的坏人。
代码如下

# -*- coding: utf-8 -*-
from lxml import etree
import requests
import sys
import json
import datetime
import hashlib
import time

# 指定默认编码方式为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')


# 从网站获取空气状况
def get_pm(city='hangzhou'):  # 输入参数为城市全拼
    url = 'http://pm25.in/' + city
    response = requests.get(url)  # 获取指定网址的html
    html = etree.HTML(response.text)
    table_result = html.xpath('//table[@id="detail-data"]')  # 获取数据表
    table = table_result[0]
    head_results = table.xpath('thead/tr/th')  # 获取表头
    records = table.xpath('tbody/tr')  # 获取记录
    air_record = {}  # 定义字典
    air_records = []  # 定义列表
    for record in records:  # 遍历记录
        for i in range(0, len(head_results)):  # 遍历字段
            air_record[head_results[i].text] = record.xpath('td')[i].text
        air_records.append(air_record)
        air_record = {}  # 清空变量的缓存
    return air_records


# 加时间戳输出文件
def file_output(text, target_dir=''):
    current_time = datetime.datetime.now()
    file_name = current_time.strftime('%Y%m%d%H%M') + '.json'
    output_file = open(target_dir + file_name, 'w')
    output_file.write(text)
    output_file.close()


# 校验是否更新
def is_update(current, original=''):
    md5_of_original = hashlib.md5(original).hexdigest()
    md5_of_current = hashlib.md5(current).hexdigest()
    if md5_of_current == md5_of_original:
        return False
    else:
        return True

# 定时任务
original_records_json = ''  # 对比原数据初始化
while True:
    current_records = get_pm()  # 获取数据
    current_records_json = json.dumps(current_records, ensure_ascii=False, indent=2)  # 转化为JSON格式
    if is_update(current_records_json, original_records_json):
        # file_output(current_records_json)
        print datetime.datetime.now().strftime('%Y%m%d%H%M')  # 时间戳
        print current_records_json  # 数据输出
        original_records_json = current_records_json  # 对比数据更新
    else:
        print datetime.datetime.now().strftime('%Y%m%d%H%M')
        print u'数据尚未更新'
    time.sleep(1*60)

最后还是非常感谢BestApp工作室的PM25.in这个作品,因为我根本没办法在其他网站找到这么方便的数据获取方式,其实根本原因就是国家环境保护部的网站太乱,(冏)。

上一篇 下一篇

猜你喜欢

热点阅读