路由器为腾达路由器,使用requests来进行数据的获取,使用flask来进行实现api的搭建
requests我就不介绍了,这个大家都很熟悉了js获取url参数,这篇文章主要是来提供一个编写爬虫的思路以及flask怎么搭建一个简单的api服务。
1.分析页面
我使用的是腾达路由器,一般路由器的管理ip地址是192.168.0.1
进入之后的页面长这样
按下F12进入开发者页面选择network选项可以看到下面的样子
通过分析会发现,路由器是采用轮询(按照一定的时间间隔来向服务器来获取数据)的方式来获取数据,从这里可以获取发送请求的类型==>是GET类型,以及一些发送的参数%2CdeviceStatistics%2CsystemInfo%2CwanAdvCfg%2CwifiRelay%2CwifiBasicCfg%2CsysTime在问号后面的有两个参数,分别是random、modules,通过测试发现,random这个参数不影响数据的获取,所以将其删去,剩下的url部分变成了,接下来确定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个参数
wifiBasicCfgwifiAdvCfgwifiPowerwifiWPSwifiGuestwifiBeamformingloginAuthwanAdvCfglanCfgsoftWarewifiRelaysysTimeremoteWebisWifiClientssystemInfohasNewSoftVersioninternetStatusdeviceStatisticsparentCtrlListparentAccessCtrlwanBasicCfglocalhostonlineListmacFilterguestListstaticIPListIPTVportListddnsdmzupnpping
到这里基本上分析的差不多了,来整理一下
url是,其中getStatus这个路径可以是上面的js里面的任意一个getUrl的值,返回的值是由modules的值来确定的。
2.发送请求(上代码)
import requests
import json
module = [
"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 = IP
self.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 = True
except:
self.status = False
return req
#用于为后面flask搭建api来提供接口
def get(self, config_name):
if self.status:
if config_name =="all":
data = self.data
else:
try:
data = self.data[config_name]
except:
data = f"no_{config_name}_data"
else:
data = f"no_{config_name}_data"
return data
3.使用flask来搭建一个简单的api接口,便于在浏览器中发起请求
from flask import Flask,render_template,jsonify
app = Flask(__name__)
from wifi import Wifi
#实例化一个对象
w = Wifi
#@app.route("/api/")定义了这个路径需要做的事情,这里的的路径是router/
#当浏览器像这个地址发送请求的时候,get函数就会被调用,同时会作为一个参数,传入get函数
#method规定了请求的类型
@app.route("/api/",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文件js获取url参数,测试可以发现
上面的方法是使用面向对象的方法来写的下面是一个普通的函数式的写法
import requests
import json
module = [
...
]
IP = "192.168.0.1"
status = ""
data = ""
def req:
"""获取WiFi数据"""
req = requests.session
module_args = ",".join(module)
url = f'http://{IP}/goform/getStatus?&modules={module_args}'
try:
req = req.get(url).json
status = True
except:
status = False
return req
#用于为后面flask搭建api来提供接口
def get(config_name):
if status:
if config_name =="all":
data = data
else:
try:
data = data[config_name]
except:
data = f"no_{config_name}_data"
else:
data = f"no_{config_name}_data"
return data
#flask部分
from flask import Flask,render_template,jsonify
app = Flask(__name__)
#@app.route("/api/")定义了这个路径需要做的事情,这里的的路径是router/
#当浏览器像这个地址发送请求的时候,get函数就会被调用,同时会作为一个参数,传入get函数
#method规定了请求的类型
@app.route("/api/",methods=['POST','GET'])
def get_(config_name):
try:
#返回json格式的数据
return jsonify(get(config_name))
except:
return "404"
if __name__ == "__main__":
app.run(debug=True)
原文来自:Python中文社区
(完)
第一本是程序员必知的硬核基础知识,这是一本非常入门的经典 PDF,看完能让你对计算机有一个基础的了解和入门,是培养你 内核的基础,我们看下目录大纲
限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688