偶然工做中用到了天气情况数据,后来就不须要了,但仍是想作一个天气的,由于想给本身的女票作个天气短信提醒。说搞就搞,第一想法就是apistore,上去了以后,好贵。。。,百度一了一下,全都很差用,决定本身写一个,本身动手丰衣足食嘛。再百度天气,中国天气网是第一条,仍是官方的,说明应该不错,点进去以后,看了数据,需求基本知足了,那么,走起。html
百度搜索引擎(本人声明,不是百度员工)python
第一步:查询数据源。google打开天气网,搜了下北京天气,alt+cmd+i打开调试模式(mac快快捷键),network查看数据来源。通过分析,基本能够肯定数据主要来源于2个接口:http://d1.weather.com.cn/dingzhi/101010100.html?_=1537709265753(地之一)和http://d1.weather.com.cn/sk_2d/101010100.html?_=1537709265752(地址二),多打开了几个别的城市进行查看,最后结论:101010100参数一城市的id值,1537709265753参数二时间戳(毫秒级)。git
调试&&分析github
第二步:获取城市id。在官网反反复复尝试获取城市的数据,发个城市id有几个规律:web
知道规律,也了解了request url,response,就能够搞定城市id的数据源了。解决方法以下:sql
语言:python数据库
思想:依据id的范围生成范围id,requests去get请求,获取结果json
要点:flask
很少说,直接上代码:api
城市id值生成
第三步:数据入库。数据库决定直接用sqlite,主要考虑到数据库的可移植性,git项目直接运行就能够,不用额外配置数据库,并且单张表,数据量不会很大,性能没有过高要求。python + requests + sqlalchemy + db,玩py的不知道sqlalchemy&&requests,本身赶快恶补一下吧。。。废话也很少说,git项目看db.py文件,建立表以及数据库见下图:
数据库建立&&表查询
城市id获取的整理流程设计ok,执行python citys.py就能够见证奇迹。不过,这个奇迹有点慢而已,个人本大概执行了30个小时左右,后来想的是python配合多进程(GIL机制,不要使用多线程)来提速,搞了个pool在那,不过我把多进程注释了,有兴趣的人能够去试下多进程。
第四步:api接口服务。作web服务,flask是不错的选择,简单易用,性能也不差。用blueprint作了个weather的接口,可是信息由地址一与地址二组成,地址一主要用来获取最高/最低温度,地址二获取实时的天气相关信息,请求的地址参数均由第三步回去的城市id以及时间戳。
requests基础:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
请求的时候,我把浏览器正常访问的header都记录,请求成功,把结果封装json返回。在controller那,我对请求方式,请求参数作了限制,增强接口的严谨性。详细本身看代码,post请求的参数那块,args,form,json,get_json分不清的,请自行百度,我作了个小技巧:
获取post请求参数
第五步:测试。这里介绍2种测试方式,postman + curl。
curl:curl -X POST http://127.0.0.1:8888/weather/ -H 'Content-Type: application/json' -d '{"city": "昌平"}' | python -m json.tool
postman:图形化界面。。。本身点把
没有curl命令的,本身搞下,作开发的话,不知道curl,会很low的,看下结果,完美:
成果,给本身点个赞
总结:代码很简单,不过在获取数据源id上花费了一些时间,后来一想,城市id的表有个问题,表有:id,cityname,cityid 3个字段,没有记录省份,查询同名的城市可能会有问题,后续在改吧。。。就先到这里了,我是程序猿,python程序猿。
二期功能:定时任务 + 短信提醒 + 邮件报警