(点击上方快速关注并设置为星标,一起学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在问号后面的有两个参数,分别是 randommodules,通过测试发现,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 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文件,测试可以发现

上面的方法是使用面向对象的方法来写的
下面是一个普通的函数式的写法

import requestsimport jsonmodule = [...]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,jsonifyapp = 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中文社区

(完)

看完本文有收获?请转发分享给更多人

关注「Python那些事」,做牛逼工程师

点「在看」的人都变好看了哦

flask post json_Flask 和 requests 搭建一个简单的API服务相关推荐

  1. ginapi服务器性能,如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)

    gin-gonic 介绍 Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性. 在这篇文章中,我想用最少的代码写出一个可用的 A ...

  2. 使用SpringBoot搭建一个简单的webSocket服务

    前言 个人地址:使用SpringBoot搭建一个简单的webSocket服务 什么是WebSocket? WebSocket是一个HTML5新增的协议,它的目的在浏览器和服务器之间建立一个不受限的双向 ...

  3. SpringBoot + Dubbo + Zookeeper搭建一个简单的分布式服务

    本文使用SpringBoot + Dubbo + Zookeeper 来搭建一个简单的分布式服务 文章目录 dubbo-spring-boot-starter 如何发布 Dubbo 服务 如何消费 D ...

  4. python仿真搭建_mock搭建——python——搭建一个简单的mock服务——简单版本

    1.无聊的背景.起源: 如今的业务系统越来越复杂庞大,各个功能直接的调用也是多如牛毛,但如果在联调的时候,恰好被调的接口正在开发,怎么办? 傻傻的等么,不存在的!这时会搭建一些server来进行moc ...

  5. java分布式dubbo_Dubbo剖析-搭建一个简单的分布式系统(1)

    一.前言 随着阿里巴巴开源的分布式RPC框架Dubbo成为Apache开源卵化器项目,Dubbo有火了一把.在接下来的一段时间本公众号将会时不时的发布一些dubbo使用与原理剖析的文章. image. ...

  6. 测试开发——搭建一个简单 web服务(flask框架基础)项目实战

    搭建一个简单 web服务-flask框架 一.什么是wsgi? 二.搭建一个简单 web服务 三.扩展 四.请求加参数的情况 五.安装flask 一.什么是wsgi? wsgi是webserver和a ...

  7. 使用 Python 的 flask 架构搭建一个简单web网站

    使用 Python 的 flask 架构搭建一个简单web网站 1.flask最简单框架,返回hello world: from flask import * app = Flask(__name__ ...

  8. python代理池_用Python搭建一个简单的代理池

    其实每次爬东西的时候,特怕IP被封,所以每次都要把时间延迟设置得长一点...这次用Python搭建一个简单的代理池.获取代理IP,然后验证其有效性.不过结果好像不是很理想,为什么西刺代理的高匿代理都能 ...

  9. 用思科网络模拟器搭建一个简单的局域网

    目录 前言 搭建 配置 前言 在搭建一个简单的局域网前,你必须知道一些常识. 网线(双绞)线的标准 T568A标准:白绿.绿.白橙.蓝.白蓝.橙.白棕.棕 T568B标准:白橙.橙.白绿.蓝.白蓝.绿 ...

最新文章

  1. l-lsblk查看设备可用块设备
  2. java 导出文件,导出多个文件方案~
  3. linux下su和su - 的区别
  4. codeforces 50A-C语言解题报告
  5. arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
  6. silverlight-Canvas中1像素的线变成了2像素
  7. 自下而上分析法基本问题
  8. Gradle简单使用
  9. mybatis mysql net教程_MyBatis 教程
  10. python爬微博个人信息_新浪微博数据爬取Part 1:用户个人信息
  11. 指示约束条件 (indicator constraint) 与大M (big M) 条件
  12. Mybatis Generator配置文件
  13. 真正高质量的免费高速高防空间!
  14. 小红书竞品分析_小红书与网易考拉海购竞品分析报告
  15. Anaconda安装虚拟环境
  16. C++实现内存“垃圾”回收机制
  17. 百度Site查询接口
  18. 【博学谷学习记录】超强总结,用心分享|大数据之数仓分层
  19. 分布模型的均值与方差
  20. 计算机键盘space键在哪,电脑中space键如何使用|电脑中space键有什么作用

热门文章

  1. 关于Spring注入方式的几道面试题,你能答上么?
  2. vue res返回html,vue 组件内获取actions的response方式
  3. maya python api,如何使用Maya Python API查找所有上游DG节点?
  4. SCUT - 254 - 欧洲爆破 - 概率dp - 状压dp
  5. koa2-cors应答跨域请求实现
  6. Convert Sorted Array to Binary Search Tree With Minimal Height
  7. exe可执行程序及堆栈分配(转载)
  8. 【二分】【中等难度】noip模拟赛 聪哥的工资
  9. Linux中让普通用户拥有超级用户的权限
  10. JVM内存管理:深入垃圾收集器与内存分配策略