今天向大家介绍一款可以用来查询国内绝大部分城市天气预报的Python库pyweathercn,网上搜到的基本都不能用啦……
pyweathercn的作者正是大名鼎鼎的本人。
好吧,其实这个库我早在5月份的时候就写好了,但是由于太忙一直忘了这回事……
demo: https://weather.bennythink.com
特色
用法简洁
支持开启REST API风格的服务器,一库多用,异步非阻塞支持高并发,支持https
为啥要开发这个
因为我需要啊!上网搜罗了一波,各种天气预报API基本上都得注册,可能还得要钱,或者限制访问频率,这就让我非常不开心了。那么既然没人写过,那咱就只好自己写一个了啊。
不过需要注意的是,这个原理是爬虫并解析www.weather.com.cn,所以如果某天不好用了,很有可能就是人家网站改版了……
安装
需要注意的是,这个库并不支持Python 2,所以请使用Python 3
pip install pyweathercn
如果需要请自行替换为pip3
另外,如果你使用国内的PyPi源,可能现在还没更新到1.0.3呢……
其实这个库本应该是支持Python 2的,因为也没用什么Python 3才有的特性和语法用了一些的,但是我就是不想支持Python 2,不爽你来打我啊。不过非得想支持Python 2 的话,你可以下载tar包解压缩到site-packages啊
使用方法
普通模式
非常简单,支持chain call和实例模式,来几个例子:
>>> import pyweathercn >>> pyweathercn.Weather('重庆').temp() '重庆:20' >>> w = pyweathercn.Weather('北京') >>> w.data {'data': {'city': '北京', 'aqi': '159', 'tip': '紫外线指数很强涂擦SPF20以上,PA++护肤品,避强光。穿衣指数热适合穿T恤、短薄外套等夏季服装。', 'temp': '20', 'forecast': [{'date': '23日(今天)', 'type': '晴', 'temp': '15℃', 'wind': '西南风 3-4级'}, {'date': '24日(明天)', 'type': '晴', 'temp': '31℃/17℃', 'wind': '南风 3-4级'}, {'date': '25日(后天)', 'type': '晴转多云', 'temp': '31℃/19℃', 'wind': '西南风 <3级'}, {'date': '26日(周六)', 'type': '阴转多云', 'temp': '30℃/16℃', 'wind': '西风 <3级'}, {'date': '27日(周日)', 'type': '多云', 'temp': '29℃/15℃', 'wind': '南风 <3级'}, {'date': '28日(周一)', 'type': '多云', 'temp': '25℃/15℃', 'wind': '东北风 <3级'}, {'date': '29日(周二)', 'type': '晴', 'temp': '29℃/15℃', 'wind': '西南风 <3级'}]}, 'status': 0, 'message': 'success'} >>> w.today() '北京:23日(今天)晴15℃西南风 3-4级' >>> w.tomorrow(True) {'date': '24日(明天)', 'type': '晴', 'temp': '31℃/17℃', 'wind': '南风 3-4级'} >>> w.tip() '北京温馨提示:紫外线指数很强涂擦SPF20以上,PA++护肤品,避强光。穿衣指数热适合穿T恤、短薄外套等夏季服装。' >>> w.forecast(False,5) '北京:28日(周一)多云25℃/15℃东北风 <3级'
其中tomorrow 等类方法的参数如果传布尔真值的话,将会显示原始json响应,不传或者传布尔假值会显示易于阅读的字符串。
其他的一些类方法,咱的IDE都有提示,我注释写的还算简单易懂,这里就不细说了
服务器模式
import pyweather # running on http://127.0.0.1:8888 pyweathercn.server(host='127.0.0.1') # running on http://0.0.0.0:3333 pyweathercn.server(3333) # support ssl: https://www.example.com:8888 pyweathercn.server('8888', 'www.example.com', ssl_options={ "certfile": "fullchain.pem", "keyfile": "privkey.pem"})
哪位好心人我啊可以开放一个公开的API给大家用,哈哈。
在服务器模式下的调用方法,需要请求/weather
路由,必须参数为city,可选参数为day,使用get方法的url参数或者post方法的url-encode form,目前还不支持post json。
Nginx 反向代理
服务器用systemd等运行一个监听127.0.0.1的服务器模式python脚本,server块如下配置:
server { listen 80; server_name www.siteone.com; # 你的域名 location / { proxy_pass http://127.0.0.1:8888; }
如果需要https支持,可以参考这个配置文件
例子1 GET:呃请原谅我的pangu把url搞成了带空格的……
http://127.0.0.1:8888/weather?city=上海
例子2 GET:
http://127.0.0.1:8888/weather?city=上海&day=3
例子3 POST:
PyPi仓库地址
https://pypi.org/project/pyweathercn/
GitHub源代码
开源地址
欢迎star、fork、PR