Python 獲取當地未來五天天氣 天氣預報 獲取天氣

我叫以賞發表於2020-04-09

說明

通過呼叫 天氣網 介面實現獲取當地天氣的效果,已打包至函式方便呼叫,函式返回一個列表,列表組成如下,
[當地地名,釋出時間,[[日期,[早天氣現象,晚天氣現象],[早氣溫,晚氣溫],[早風向,晚風向],[早風力,晚風力]]],…]

Python 獲取當地未來五天天氣 天氣預報 獲取天氣

程式碼

# -*- 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('&nbsp;', ' ').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 協議》,轉載必須註明作者和本文連結

相關文章