這篇文章咱們將使用 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))
【爬蟲系列相關文章】