python製做天氣數據api

偶然工做中用到了天氣情況數據,後來就不須要了,但仍是想作一個天氣的,由於想給本身的女票作個天氣短信提醒。說搞就搞,第一想法就是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

  1. 城市id由9位數字組成(可能你們以爲感受有點廢話了,別急日後看),例如:北京101010100;
  2. 城市id的第三位,第四位是表示省份(免費普及一下:中國34個省級行政區域,包括23個省,5個自治區,4個直轄市,2個特別行政區),01-北京,02-上海,03-天津,04-重慶。。。34-臺灣;
  3. 後三位尾數,針對於直轄市,尾數從000開始計數,非直轄市尾數從001開始計數;
  4. 天氣網數據細到鄉鎮,街道。鄉鎮的id:101080503(cityid) + xxx(數字,001開始),12位組成;街道數據過於細緻,不必獲取,並且本人能力有限,只初始化了到城市級別的的數據。
  5. 額外贈送:中國每一個省份的城市最大值位21,代碼中會用到

知道規律,也瞭解了request url,response,就能夠搞定城市id的數據源了。解決方法以下:sql

語言:python數據庫

思想:依據id的範圍生成範圍id,requests去get請求,獲取結果json

要點:flask

  • 省份的標誌位01~04位直轄市,05~34非直轄市,城市的標誌位01~23便可
  • header必須含有Referer值,應該用來作一個訪問標識
  • response返回值類型是string,可是weatherinfo的信息爲json,需轉化

很少說,直接上代碼:api

城市id值生成城市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請求參數獲取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程序猿。

二期功能:定時任務 + 短信提醒 + 郵件報警

項目git地址https://github.com/GIS90/weathers

相關文章
相關標籤/搜索