偶然工做中用到了天氣情況數據,後來就不須要了,但仍是想作一個天氣的,由於想給本身的女票作個天氣短信提醒。說搞就搞,第一想法就是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程序猿。
二期功能:定時任務 + 短信提醒 + 郵件報警