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