如何获取天气预报数据?
一种简单方案就是直接爬取各种天气预报页面,然后分析其中的数据即可。比如爬取百度的天气预报页面。
我们也找到了一个天气预报接口,可以直接拿到json格式的数据,使用起来就相对简单。
接口url:
http://wthrcdn.etouch.cn/weather_mini?city=青岛
接下来我们编写程序,获取某个城市的天气预报数据。
首先我们要能获取url的返回数据,使用万能的urllib.request,因为url中有中文城市名参数,需要进行编码处理,所以需要使用urllib.parse中的quote方法。同时该返回数据进行了gzip压缩,需要进行解压缩,之后再解码即可。
from urllib import request from urllib.parse import quote #读取url网址对应的html内容 def get_page_html(url): #假冒浏览器 #url首先封装到一个对象中 req = request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36') data = request.urlopen(req).read() data = gzip.decompress(data).decode('utf-8') return data
测试一下,可以返回json数据,并且编码正确。
我们将城市名作为参数,再进行一次封装:
def get_city_wather(city_name): city_name = quote(city_name, 'utf-8') url = f'http://wthrcdn.etouch.cn/weather_mini?city={city_name}' data = get_page_html(url) data = json.loads(data) return data
参数是城市名,调用刚才的get_page_html(url)获取相应的数据,再进行json解析,即可。
完整代码如下:
from urllib import request from urllib.parse import quote import gzip import json #读取url网址对应的html内容 def get_page_html(url): #假冒浏览器 #wanmait.com万码学堂 #url首先封装到一个对象中 req = request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36') data = request.urlopen(req).read() data = gzip.decompress(data).decode('utf-8') return data def get_city_wather(city_name): city_name = quote(city_name, 'utf-8') url = f'http://wthrcdn.etouch.cn/weather_mini?city={city_name}' data = get_page_html(url) data = json.loads(data) return data if __name__ == '__main__': data = get_city_wather('青岛') for day in data['data']['forecast']: print(day)
运行结果:
{'date': '29日星期四', 'high': '高温 27℃', 'fengli': '<![CDATA[5级]]>', 'low': '低温 24℃', 'fengxiang': '东南风', 'type': '大雨'} {'date': '30日星期五', 'high': '高温 28℃', 'fengli': '<![CDATA[3级]]>', 'low': '低温 25℃', 'fengxiang': '西南风', 'type': '小雨'} {'date': '31日星期六', 'high': '高温 30℃', 'fengli': '<![CDATA[3级]]>', 'low': '低温 25℃', 'fengxiang': '南风', 'type': '多云'} {'date': '1日星期天', 'high': '高温 28℃', 'fengli': '<![CDATA[2级]]>', 'low': '低温 25℃', 'fengxiang': '南风', 'type': '小雨'} {'date': '2日星期一', 'high': '高温 28℃', 'fengli': '<![CDATA[2级]]>', 'low': '低温 26℃', 'fengxiang': '北风', 'type': '小雨'}
今天台风”烟花“登陆青岛,风大,雨大,气温还是蛮宜人的。
0条评论
点击登录参与评论