牛叔叔 的笔记

好好学习

2021-07-29 11:53

使用Python通过中国天气网获取城市天气预报

牛叔叔

Python

(1354)

(0)

收藏

如何获取天气预报数据?

一种简单方案就是直接爬取各种天气预报页面,然后分析其中的数据即可。比如爬取百度的天气预报页面。

baidu.png


我们也找到了一个天气预报接口,可以直接拿到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': '小雨'}

今天台风”烟花“登陆青岛,风大,雨大,气温还是蛮宜人的。

微信图片_20210729115246.png

0条评论

点击登录参与评论