說明
通過呼叫 天氣網 介面實現獲取當地天氣的效果,已打包至函式方便呼叫,函式返回一個列表,列表組成如下,
[當地地名,釋出時間,[[日期,[早天氣現象,晚天氣現象],[早氣溫,晚氣溫],[早風向,晚風向],[早風力,晚風力]]],…]
程式碼
# -*- coding:utf-8 -*-
"""
Python獲取當地天氣
BY我叫以賞 And Pikachu
轉載註明出處
"""
import requests
def get_local_weather() -> list:
"""
此函式使用者獲取當地的天氣,通過呼叫天氣網介面:http://i.tianqi.com/index.php?c=code&id=57 實現效果。
BY 我叫以賞 And Pikachu
:return:(list)返回一個列表[當地地名,釋出時間,[[日期,[早天氣現象,晚天氣現象],[早氣溫,晚氣溫],[早風向,晚風向],[早風力,晚風力]]],...]顯示今天與未來五天
"""
# PositionText用於儲存網頁中關鍵文字出現的地方
PositionText = {
'area': ('<div class="top"><h1><a href="//www.tianqi.com/data/html/code_city.php">', '六天天氣預報</a></h1><span>'),
'publishTime': ('</a></h1><span>(', '釋出)</span>'),
'DayTime': ('<td width="15%" rowspan="2" bgcolor="#ffffff" class="f0">', '" target="_blank">', '</a></td>'),
'DayText':'<!--day',
'weather': ('<a href="http://wenzhou.tianqi.com/?tq" target="_blank">', '</a></td>')
}
data = requests.get('http://i.tianqi.com/index.php?c=code&id=57')#獲取介面網頁
weather_web = data.text # 天氣原資料
# 獲取地區
AreaTextPosition1 = weather_web.find(PositionText['area'][0]) + len(PositionText['area'][0]) # 尋找地區關鍵詞前的字元
AreaTextPosition2 = weather_web.find(PositionText['area'][1], AreaTextPosition1) # 尋找地區關鍵詞後面的字元
Area = weather_web[AreaTextPosition1:AreaTextPosition2] # 取出字元中間
# 獲取釋出日期 釋出日期在AreaTextPosition2後面
publishTimePosition1 = weather_web.find(PositionText['publishTime'][0], AreaTextPosition2) + len(
PositionText['publishTime'][0]) # 尋找釋出日期前的關鍵詞
publishTimePosition2 = weather_web.find(PositionText['publishTime'][1], publishTimePosition1) # 尋找後面的
publishTime = weather_web[publishTimePosition1:publishTimePosition2] # 取出釋出日期
# 取出天氣
weatherPosition = publishTimePosition2 # 將游標移至釋出日期後面,可以刪除
weatherPosition = weather_web.find(PositionText['DayText'], weatherPosition) + len(PositionText['DayText']) # 尋找一天出現的標誌
ret = [Area, publishTime] # 將前面獲取的資料先存到列表內
while weatherPosition != len(PositionText['DayText']) - 1: # 不斷迴圈直到找不到文字
DaytimePosition1 = weather_web.find(PositionText['DayTime'][0], weatherPosition) # 尋找時間出現位置
DaytimePosition2 = weather_web.find(PositionText['DayTime'][2], DaytimePosition1) # 尋找時間出現位置
DaytimePosition3 = weather_web.find(PositionText['DayTime'][1], DaytimePosition1)+len(PositionText['DayTime'][1]) # 由於時間位置特殊,沒有專門的標誌所以需要尋找三次
Daytime = weather_web[DaytimePosition3:DaytimePosition2].replace(' ', ' ').replace("<font color='green'>", '').replace("<font color='red'>", '').replace("</font>", '') # 替換文字中的額外資料
note = [] # 初始化獲取天氣資料
ZweatherPosition1 = DaytimePosition2 # 將貫標移到日期資料後面
for x in range(10): # 獲取天氣資料
ZweatherPosition1 = weather_web.find(PositionText['weather'][0],ZweatherPosition1)+len(PositionText['weather'][0]) # 尋找天氣開始位置
if weather_web[ZweatherPosition1:ZweatherPosition1+4]=='<img': # 過濾無效資料
continue
ZweatherPosition2 = weather_web.find(PositionText['weather'][1], ZweatherPosition1) # 尋找天氣結束位置
note.append(weather_web[ZweatherPosition1:ZweatherPosition2])#新增到末尾
ret.append([[ Daytime, [note[0],note[4]],[note[1], note[5]],[note[2], note[6]],[note[3], note[7]] ]]) # 新增資料到返回列表末尾
weatherPosition = weather_web.find(PositionText['DayText'], weatherPosition) + len(PositionText['DayText'])#尋找下一天
return ret#返回
if __name__ == '__main__':
print('此程式會獲取當地的天氣,BY 我叫以賞 And Pikachu !\n'
'轉載請註明出處!原始碼已打包成函式 get_local_weather() 使用了 requests 模組。\n'
'請稍等片刻正在呼叫 天氣網 的資料......')
try:
weather = get_local_weather()
except BaseException as error:
print('Error:獲取錯誤!原因:'+str(error))
else:
print('獲取城市:'+weather[0])
print('釋出天氣時間:'+weather[1])
print('-' * 55)
for x in range(2,7):
print('=日期:' + weather[x][0][0]+'=')
print('>白天<')
print('天氣現象:%s 氣溫:%s 風向:%s 風速:%s'%
(weather[x][0][1][0],weather[x][0][2][0],weather[x][0][3][0],weather[x][0][4][0]))
print('>晚上<')
print('天氣現象:%s 氣溫:%s 風向:%s 風速:%s' %
(weather[x][0][1][1], weather[x][0][2][1], weather[x][0][3][1], weather[x][0][4][1]))
print('-' * 55)
input('回車退出[Enter]')
下載地址:https://ysdmmxw.coding.net/api/share/downl...
本作品採用《CC 協議》,轉載必須註明作者和本文連結