Flask 和 requests 搭建一个简单的API服务
?
作者:SunCOOL,喜歡python,相信python。
路由器為騰達路由器,使用requests來進行數據的獲取,使用flask來進行實現api的搭建
requests我就不介紹了,這個大家都很熟悉了,這篇文章主要是來提供一個編寫爬蟲的思路以及flask怎么搭建一個簡單的api服務。
1.分析頁面
我使用的是騰達路由器,一般路由器的管理ip地址是192.168.0.1
進入之后的頁面長這樣
按下F12進入開發者頁面選擇network選項可以看到下面的樣子
通過分析會發現,路由器是采用輪詢(按照一定的時間間隔來向服務器來獲取數據)的方式來獲取數據,從這里可以獲取發送請求的類型==>是GET類型,以及一些發送的參數http://192.168.0.1/goform/getStatus?random=0.46529553086082265&modules=internetStatus%2CdeviceStatistics%2CsystemInfo%2CwanAdvCfg%2CwifiRelay%2CwifiBasicCfg%2CsysTime在問號后面的有兩個參數,分別是?random、modules,通過測試發現,random這個參數不影響數據的獲取,所以將其刪去,剩下的url部分變成了?http://192.168.0.1/goform/getStatus?modules=XXX,接下來確定XXX的值從上面的gif可以發現,這里modules的值是internetStatus,deviceStatistics,systemInfo,wanAdvCfg,wifiRelay,wifiBasicCfg,sysTime,可以發現這里應該是從路由器獲取的各個參數,我們換一個頁面來看一下,是不是會有其他的參數
從上面的gif發現這里出現了其他參數,甚至連url的地址都變了。所以現在當務之急的找到一個確定的url來使用requests發送請求,獲取數據。到這里,來分析network這里的內容會讓工作變得困難,不如來分析一個js文件(因為前面發現所有的GET請求都是xhr類型的,也就是ajax來進行發送的數據)
從這里發現了好幾個js文件,打開后分析
分別在js文件里面獲得了幾乎所有的參數,而且發現了url的規律,gofrom/后面的路徑不起作用,真正起作用的是modules的值,路由器根據值的不同來返回不同的數據。
把上面所有的modules的值收集起來,經過去重后獲得了下面33個參數
wifiBasicCfg?wifiAdvCfg?wifiPower?wifiWPS?wifiGuest?wifiBeamforming?loginAuth?wanAdvCfg?lanCfg?softWare?wifiRelay?sysTime?remoteWeb?isWifiClients?systemInfo?hasNewSoftVersion?internetStatus?deviceStatistics?parentCtrlList?parentAccessCtrl?wanBasicCfg?localhost?onlineList?macFilter?guestList?staticIPList?IPTV?portList?ddns?dmz?upnp?ping
到這里基本上分析的差不多了,來整理一下
url是http://192.168.0.1/goform/getStatus?modules=XXX,其中getStatus這個路徑可以是上面的js里面的任意一個getUrl的值,返回的值是由modules的值來確定的。
2.發送請求(上代碼)
import?requestsimport?jsonmodule?=?["wifiBasicCfg","wifiAdvCfg","wifiPower","wifiWPS","wifiGuest","wifiBeamforming","loginAuth","wanAdvCfg","lanCfg","softWare","wifiRelay","sysTime","remoteWeb","isWifiClients","systemInfo","hasNewSoftVersion","internetStatus","deviceStatistics","parentCtrlList","parentAccessCtrl","wanBasicCfg","localhost","onlineList","macFilter","guestList","staticIPList","IPTV","portList","ddns","dmz","upnp","ping" ]class?Wifi:"""獲取連接本WiFi的其他設備信息"""def?__init__(self,?IP='192.168.0.1'):self.IP?=?IPself.data?=?self.req()def?req(self):"""獲取WiFi數據"""req?=?requests.session()module_args?=?",".join(module)url?=?f'http://{self.IP}/goform/getStatus?&modules={module_args}'try:req?=?req.get(url).json()'''with?open("wifi.json",?'r')?as?data:req?=?json.loads(data.read())'''self.status?=?Trueexcept:self.status?=?Falsereturn?req#用于為后面flask搭建api來提供接口def?get(self,?config_name):if?self.status:if?config_name?=="all":data?=?self.dataelse:try:data?=?self.data[config_name]except:data?=?f"no_{config_name}_data"else:data?=?f"no_{config_name}_data"return?data3.使用flask來搭建一個簡單的api接口,便于在瀏覽器中發起請求
from?flask?import?Flask,render_template,jsonifyapp?=?Flask(__name__)from?wifi?import?Wifi#實例化一個對象 w?=?Wifi()#@app.route("/api/<config_name>")定義了這個路徑需要做的事情,這里的的路徑是router/<config_name> #當瀏覽器像這個地址發送請求的時候,get函數就會被調用,同時<config_name>會作為一個參數,傳入get函數 #method規定了請求的類型 @app.route("/api/<config_name>",methods=['POST','GET']) def?get(config_name):try:#返回json格式的數據return?jsonify(w.get(config_name))except:return?"404" if?__name__?==?"__main__":app.run(debug=True)運行app.py文件,測試可以發現
上面的方法是使用面向對象的方法來寫的
下面是一個普通的函數式的寫法
贊 賞 作 者
Python中文社區作為一個去中心化的全球技術社區,以成為全球20萬Python中文開發者的精神部落為愿景,目前覆蓋各大主流媒體和協作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業界知名公司和技術社區建立了廣泛的聯系,擁有來自十多個國家和地區數萬名登記會員,會員來自以工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關、科研單位、金融機構以及海內外知名公司,全平臺近20萬開發者關注。
▼?點擊閱讀原文,即享騰訊云新用戶首購99元/年總結
以上是生活随笔為你收集整理的Flask 和 requests 搭建一个简单的API服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab怎么通分,matlab常见符
- 下一篇: IPTV的开展在广电企业、电信运营商角度