微博自动发布气象数据(一)python获取气象数据

今年开始我每天会发布下面这样一条微博:

微博自动发布气象数据(一)python获取气象数据_第1张图片
需求示例.png

这里面的气象数据都是从别的网站上面获取,需要人工访问网站,查看每个小时的气温和降水量数据,然后计算出来,再编辑成微博发送,这样每天到时间都要进行人工操作显得很麻烦,有时候晚上忙就会忘掉。
于是我想到,这个工作其实可以全部交给电脑去自动完成, 每天定时去获取网络数据,计算数值,并编辑要发送的内容,自动发送微博。
把这个需求分成两部分,一是生成要发送的微博的内容,主要是使用python3的requests库,获取网页文本,并用beautifulsoup库进行解析。二是如何使用python通过微博的验证,成功发布微博。
这里面需要注意的是,气象日里面的 "今天"是指 前一天的晚上20时到今天的晚上20时。如下图红色方框区域就是程序要获取的数据。
微博自动发布气象数据(一)python获取气象数据_第2张图片
数据.png

以下是代码和执行的结果:

import requests
import time
from bs4 import BeautifulSoup
from datetime import datetime

tempCalcHours = ('02', '08', '14', '20')
baseUrl = 'http://q-weather.info/weather/'

hh = {('{:02d}'.format(i)) for i in range(24)}
dictData = dict.fromkeys(hh, ('0', '0'))


def getDateString():
    return time.strftime('%Y-%m-%d', time.localtime())


# 从网站获取每个小时所对应的温度和降水量,放在字典中
def getUsefulValuesFromWeb(stationNum):
    url = baseUrl + str(stationNum) + '/today/'
    req = requests.get(url)
    soup = BeautifulSoup(req.text, 'lxml')

    judgeDataIntegrity = 0
    today = getDateString()
    for tr in soup.tbody.find_all('tr'):
        strTd = tr.find('td').string
        hour = strTd[-8:-6]

        # 判断是否是今天的数据 假设今天是1月2日,今天的数据是指1月1日20时到1月2日20时,两种情况:
        # 1、     1月2日 且 20时之前
        # 2、 不是1月2日 且 20时之后
        if strTd.startswith(today) == (hour <= '20'):
            judgeDataIntegrity += 1
            hourTuple = []
            hourTuple.append(tr.find_all('td')[1].string)  # 小时气温
            hourTuple.append(tr.find_all('td')[-2].string)  # 小时降水量
            dictData[hour] = hourTuple
    if judgeDataIntegrity != 24:  # 不等于24说明数据不足24小时的
        return None
    return dictData


def combineData(dictData):
    listData = sorted(dictData.items(), key=lambda d: d[0])
    dailyData = []
    totalTemp = 0.0
    totalPrec = 0.0
    for item in listData:
        totalPrec += float(item[1][1])
        if item[0] in tempCalcHours:
            dailyData.append(item[1][0])
            totalTemp += float(item[1][0])
    if totalTemp > 0:  # 保证四舍五入正确
        avgTmp = totalTemp / 4.0 + 0.0001
    else:
        avgTmp = totalTemp / 4.0 - 0.0001
    dailyData.append('{:.1f}'.format(avgTmp))
    dailyData.append('{:.1f}'.format(totalPrec))
    # print(dailyData)
    return dailyData


def combineWeiboStatus(dailyData, stationNum):
    today = getDateString()
    status = str(stationNum) + '站' + today + '数据: 02时气温' + dailyData[0] + '度,08时气温'\
        + dailyData[1] + '度,14时气温' + dailyData[2] + '度,20时气温' + dailyData[3] + '度,平均气温'\
        + dailyData[4] + '度,降水量' + dailyData[5] + 'mm。\n'
    return status


def main(station):
    data = getUsefulValuesFromWeb(str(station))
    if data is None:
        raise Exception("数据异常")
    daily = combineData(data)
    status = combineWeiboStatus(daily, station)
    return status


if __name__ == '__main__':
    t = datetime.now()
    if (t.hour < 20) or (t.hour == 20 and t.minute < 20):  # 20时气温更新时间一般在20时20分之后
        print('今天的数据可能未更新,请稍后执行本程序...')
    else:
        totalStatus = main(57131) + main(57039)
        print('#西安气象数据# ' + totalStatus)

执行结果:

#西安气象数据# 57131站2018-01-07数据: 02时气温-2.4度,08时气温-1.7度,14时气温-0.4度,20时气温-0.1度,平均气温-1.2度,降水量1.3mm。
57039站2018-01-07数据: 02时气温-3.2度,08时气温-1.5度,14时气温0.3度,20时气温0.0度,平均气温-1.1度,降水量0.7mm。

你可能感兴趣的:(微博自动发布气象数据(一)python获取气象数据)