利用如下网址来获取某个城市的空气质量
人家本来是提供了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这个作品,因为我根本没办法在其他网站找到这么方便的数据获取方式,其实根本原因就是国家环境保护部的网站太乱,(冏)。
网友评论