爬蟲系列(八) 用requests實現天氣查詢

這篇文章咱們將使用 requests 調用天氣查詢接口,實現一個天氣查詢的小模塊,下面先貼上最終的效果圖html

一、接口分析

雖然如今網絡上有不少免費的天氣查詢接口,可是有不少網站都是須要註冊登錄的,過程比較繁瑣python

幾經艱辛,博主終於找到一個不用註冊能夠直接使用的天氣查詢接口,如下是該接口的使用說明:git

接口查詢格式json

https://www.sojson.com/open/api/weather/json.shtml?city={cityName}api

其中 cityName 爲待查詢城市的名稱,能夠直接使用中文網絡

接口返回數據網站

>>> import requests
>>> import pprint # 用於格式化打印字典類型數據
>>> url = 'https://www.sojson.com/open/api/weather/json.shtml?city=廣州'
>>> response = requests.get(url)
>>> pprint.pprint(response.json())
{'city': '廣州',
 'count': 7,
 'data': {'forecast': [{'aqi': 69.0,
                        'date': '19日星期日',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 32.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:04',
                        'sunset': '18:57',
                        'type': '雷陣雨'},
                       {'aqi': 77.0,
                        'date': '20日星期一',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 32.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:04',
                        'sunset': '18:56',
                        'type': '雷陣雨'},
                       {'aqi': 97.0,
                        'date': '21日星期二',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 32.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:04',
                        'sunset': '18:55',
                        'type': '雷陣雨'},
                       {'aqi': 84.0,
                        'date': '22日星期三',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 33.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:05',
                        'sunset': '18:54',
                        'type': '雷陣雨'},
                       {'aqi': 76.0,
                        'date': '23日星期四',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 33.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:05',
                        'sunset': '18:53',
                        'type': '雷陣雨'}],
          'ganmao': '極少數敏感人羣應減小戶外活動',
          'pm10': 54.0,
          'pm25': 24.0,
          'quality': '良',
          'shidu': '99%',
          'wendu': '26',
          'yesterday': {'aqi': 70.0,
                        'date': '18日星期六',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 32.0℃',
                        'low': '低溫 26.0℃',
                        'notice': '帶好雨具,別在樹下躲雨',
                        'sunrise': '06:03',
                        'sunset': '18:58',
                        'type': '雷陣雨'}},
 'date': '20180819',
 'message': 'Success !',
 'status': 200}
>>> # 若傳入的參數沒法識別,則只會返回 message,因此咱們能夠根據 message 判斷請求是否成功
>>> url = 'https://www.sojson.com/open/api/weather/json.shtml?city=錯誤'
>>> response = requests.get(url)
>>> pprint.pprint(response.json())
{'message': 'Check the parameters.'}

二、完整代碼

import requests
def weather(cityName):
    url = 'https://www.sojson.com/open/api/weather/json.shtml?city=' + str(cityName)
    response = requests.get(url)
    result = response.json()
    if result['message']=='Success !' :
        return result['data']
    else:
        return None

if __name__ == '__main__':
    while True :
        cityName = input('城市名稱:')
        result = weather(cityName)
        if result == None :
            print('查詢錯誤!')
        else:
            print('---------------Processing---------------')
            print('------------------------------')
            print('溫度:',result['wendu'])
            print('溼度:',result['shidu'])
            print('PM10:',result['pm10'])
            print('PM2.5:',result['pm25'])
            print('空氣質量:',result['quality'])
            print('感冒提醒:',result['ganmao'])
            print('------------------------------')
            for item in result['forecast']:
                print('日期:',item['date'])
                print('風力:',item['fl'])
                print('風向:',item['fx'])
                print('最高溫:',item['high'])
                print('最低溫:',item['low'])
                print('舒適提醒:',item['notice'])
                print('日出時間:',item['sunrise'])
                print('日落時間:',item['sunset'])
                print('天氣:',item['type'])
                print('------------------------------')
            print('---------------Finished---------------')

2019-03-10 更新:url

因爲原來的接口有所改變,因此從新寫文更新一下博客翻譯

現有接口查詢格式:code

http://t.weather.sojson.com/api/weather/city/{city_code}

其中,city_code 爲城市代號

能夠經過連接 http://cdn.sojson.com/_city.json 查看

能夠經過連接 http://cdn.sojson.com/_city.json?attname= 下載

具體能夠參考 https://www.sojson.com/blog/305.html

接口返回數據格式:

>>> import requests
>>> import pprint # 用於格式化打印字典類型數據
>>> url = 'http://t.weather.sojson.com/api/weather/city/101280101'
>>> response = requests.get(url)
>>> pprint.pprint(response.json())
{'cityInfo': {'city': '廣州市',
              'cityId': '101280101',
              'parent': '廣東',
              'updateTime': '18:24'},
 'data': {'forecast': [{'aqi': 20.0,
                        'date': '10',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 17.0℃',
                        'low': '低溫 12.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:43',
                        'sunset': '18:34',
                        'type': '小雨',
                        'week': '星期日',
                        'ymd': '2019-03-10'},
                       {'aqi': 36.0,
                        'date': '11',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 21.0℃',
                        'low': '低溫 12.0℃',
                        'notice': '陰晴之間,謹防紫外線侵擾',
                        'sunrise': '06:42',
                        'sunset': '18:34',
                        'type': '多雲',
                        'week': '星期一',
                        'ymd': '2019-03-11'},
                       {'aqi': 58.0,
                        'date': '12',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 23.0℃',
                        'low': '低溫 13.0℃',
                        'notice': '願你擁有比陽光明媚的心情',
                        'sunrise': '06:41',
                        'sunset': '18:35',
                        'type': '晴',
                        'week': '星期二',
                        'ymd': '2019-03-12'},
                       {'aqi': 73.0,
                        'date': '13',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 22.0℃',
                        'low': '低溫 14.0℃',
                        'notice': '陰晴之間,謹防紫外線侵擾',
                        'sunrise': '06:40',
                        'sunset': '18:35',
                        'type': '多雲',
                        'week': '星期三',
                        'ymd': '2019-03-13'},
                       {'aqi': 65.0,
                        'date': '14',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 20.0℃',
                        'low': '低溫 14.0℃',
                        'notice': '記得隨身攜帶雨傘哦',
                        'sunrise': '06:39',
                        'sunset': '18:36',
                        'type': '中雨',
                        'week': '星期四',
                        'ymd': '2019-03-14'},
                       {'aqi': 42.0,
                        'date': '15',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 21.0℃',
                        'low': '低溫 14.0℃',
                        'notice': '陰晴之間,謹防紫外線侵擾',
                        'sunrise': '06:38',
                        'sunset': '18:36',
                        'type': '多雲',
                        'week': '星期五',
                        'ymd': '2019-03-15'},
                       {'date': '16',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 22.0℃',
                        'low': '低溫 15.0℃',
                        'notice': '陰晴之間,謹防紫外線侵擾',
                        'sunrise': '06:37',
                        'sunset': '18:36',
                        'type': '多雲',
                        'week': '星期六',
                        'ymd': '2019-03-16'},
                       {'date': '17',
                        'fl': '<3級',
                        'fx': '無持續風向',
                        'high': '高溫 23.0℃',
                        'low': '低溫 16.0℃',
                        'notice': '陰晴之間,謹防紫外線侵擾',
                        'sunrise': '06:36',
                        'sunset': '18:37',
                        'type': '多雲',
                        'week': '星期日',
                        'ymd': '2019-03-17'},
                       {'date': '18',
                        'fl': '<3級',
                        'fx': '東北風',
                        'high': '高溫 22.0℃',
                        'low': '低溫 17.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:35',
                        'sunset': '18:37',
                        'type': '小雨',
                        'week': '星期一',
                        'ymd': '2019-03-18'},
                       {'date': '19',
                        'fl': '<3級',
                        'fx': '東南風',
                        'high': '高溫 25.0℃',
                        'low': '低溫 19.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:34',
                        'sunset': '18:38',
                        'type': '小雨',
                        'week': '星期二',
                        'ymd': '2019-03-19'},
                       {'date': '20',
                        'fl': '<3級',
                        'fx': '東北風',
                        'high': '高溫 25.0℃',
                        'low': '低溫 17.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:33',
                        'sunset': '18:38',
                        'type': '小雨',
                        'week': '星期三',
                        'ymd': '2019-03-20'},
                       {'date': '21',
                        'fl': '<3級',
                        'fx': '北風',
                        'high': '高溫 18.0℃',
                        'low': '低溫 15.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:32',
                        'sunset': '18:38',
                        'type': '小雨',
                        'week': '星期四',
                        'ymd': '2019-03-21'},
                       {'date': '22',
                        'fl': '<3級',
                        'fx': '東北風',
                        'high': '高溫 20.0℃',
                        'low': '低溫 16.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:31',
                        'sunset': '18:39',
                        'type': '小雨',
                        'week': '星期五',
                        'ymd': '2019-03-22'},
                       {'date': '23',
                        'fl': '<3級',
                        'fx': '東風',
                        'high': '高溫 23.0℃',
                        'low': '低溫 18.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:30',
                        'sunset': '18:39',
                        'type': '小雨',
                        'week': '星期六',
                        'ymd': '2019-03-23'},
                       {'date': '24',
                        'fl': '<3級',
                        'fx': '東南風',
                        'high': '高溫 26.0℃',
                        'low': '低溫 21.0℃',
                        'notice': '雨雖小,注意保暖別感冒',
                        'sunrise': '06:29',
                        'sunset': '18:39',
                        'type': '小雨',
                        'week': '星期日',
                        'ymd': '2019-03-24'}],
          'ganmao': '各種人羣可自由活動',
          'pm10': 22.0,
          'pm25': 15.0,
          'quality': '優',
          'shidu': '81%',
          'wendu': '15',
          'yesterday': {'aqi': 20.0,
                        'date': '09',
                        'fl': '3-4級',
                        'fx': '北風',
                        'high': '高溫 17.0℃',
                        'low': '低溫 13.0℃',
                        'notice': '出門最好穿雨衣,勿擋視線',
                        'sunrise': '06:44',
                        'sunset': '18:33',
                        'type': '大雨',
                        'week': '星期六',
                        'ymd': '2019-03-09'}},
 'date': '20190310',
 'message': 'Success !',
 'status': 200,
 'time': '2019-03-10 19:00:00'}

完整代碼:

須要比以前的多一個步驟,就是將城市名字映射爲城市代號進行查詢

import json
import requests
def readFile():
    with open('_city.json','r',encoding='UTF-8') as f:
        data = json.load(f)
    return data

def getCode(data,city_name):
    result = [item['city_code'] for item in data if item['city_name'] == str(city_name)]
    if result:
        city_code = result[0]
    else:
        city_code = None
    return city_code
    
def getWeather(city_code):
    url = 'http://t.weather.sojson.com/api/weather/city/' + str(city_code)
    response = requests.get(url)
    content = response.json()
    if content['message']=='Success !' :
        result = content['data']
    else:
        result = None
    return result

def showResult(result,day):
    for i in range(day):
        print('----------' + result['forecast'][i]['ymd'] + ' ' + result['forecast'][i]['week'] + '----------')
        print('天氣類型:' + result['forecast'][i]['type'])
        print('最高溫度:' + result['forecast'][i]['high'])
        print('最低溫度:' + result['forecast'][i]['low'])
        print('風力:' + result['forecast'][i]['fl'])
        print('風向:' + result['forecast'][i]['fx'])
        print('日出時間:' + result['forecast'][i]['sunrise'])
        print('日落時間:' + result['forecast'][i]['sunset'])
        print('舒適提示:' + result['forecast'][i]['notice'])
    
if __name__ == '__main__':
    data = readFile()
    while True :
        print('---------------查詢參數---------------')
        city_name = input('城市名稱:')
        city_code = getCode(data,city_name)
        if not city_code:
            print('輸入錯誤,請從新輸入')
            continue
        result = getWeather(city_code)
        if not result:
            print('查詢錯誤,請從新輸入')
            continue
        day = input('查詢天數:')
        if not day.isdigit():
            print('查詢天數必須是數字,請從新輸入')
            continue
        if not 0 <= int(day) <= 15:
            print('查詢天數必須小於十五天,請從新輸入')
            continue
        showResult(result,int(day))

【爬蟲系列相關文章】

相關文章
相關標籤/搜索