爬虫篇-物联网平台【附源码】


前言

  鉴于网上以及视频教材很多都是直接用cookie写到了headers中,这样验证是会过期的,我这里直接模拟浏览器请求。
  物联网平台爬虫应用,账号是内部的账号,因此没有账号的可以学习思路,有账号的可以考虑实战爬虫。
  物联网平台的爬虫主要获取一些数据表格,主要是传感器的数据,包括:时间、风速、雨量、大气温度、日雨量累计、数字气压、紫外线、风向、负氧离子、大气湿度等数据


一、介绍一下物联网后台数据

如图,本次取数内容为一下内容:
在这里插入图片描述
在这里插入图片描述
从入口到查询等步骤可以分析,此爬虫比较简单,只需要把用户名和密码直接传递进去即可,不存在验证码等问题。


二、分析网页后台

1.分析物联网平台后台

base_url = 'http://iot.whxph.com/environment/login'

  从前面分析可知,本次需要先模拟登陆,因此,我们按下F12,进入浏览器开发者工具,选择Network板块。
  然后重新刷新一下网页,这个时候我们会在开发者工具中得到后台的一些请求步骤,同时我们需要随便输入一个用户名和密码,查看登陆的时候前端浏览器会怎样发送数据到后台的,如图:
刷新网页的后台请求数据:
在这里插入图片描述
随便用户登录的时候的请求内容:
在这里插入图片描述
从上边的分析可知,base_url的请求基本作用不大,因此我们代码请求的时候可完全忽略,其次随便输入用户信息点击登陆发现这个后台数据就是模拟登陆的关键,因此我们着重分析此请求内容

2.分析模拟登陆的前端请求和后端返回

1.前端请求-headers

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json',
    'Host': '115.28.187.9:8005',
    'Origin': 'http://iot.whxph.com',
    'Referer': 'http://iot.whxph.com/',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}

2.前端请求-打包数据

先上图,按照这个图来构建请求数据包即可:
在这里插入图片描述
代码构建数据包:

post_data={
    'password':passwd,
    'username':user
}

3.前端请求-代码请求

request = urllib.request.Request(self.login_url,data,headers)
login_result = self.opener.open(request).read().decode('utf-8')
login_jsonresult = json.loads(login_result)

4.后端返回-分析返回数据

如图:
在这里插入图片描述
从返回数据可以知道,token是后续请求数据用到的,还有就是用户登陆是否成功的标志,因此分析后段字段即可实现,代码如下:

if '认证成功' in login_jsonresult['message']:
    self.token = login_jsonresult['token']
    return True
else:
    self.token = None
    return False

3.数据获取

在模拟登陆完成之后,即可做数据采集了,先分析采集页面:
在这里插入图片描述
随便检索一下可以查看到数据的请求url,因此我们构建此图的请求内容:
data_url=’ http://115.28.187.9:8005/datas/16062539?pageNum=1&pageSize=20&startTime=2021-01-01+00:00:00&endTime=2021-01-31+00:00:00&interval=1’
通过分析data_url,后面附带的参数意思为:
pageNum:请求第几页
pageSize:每页数据量
startTime:查询的开始时间
endTime:查询的结束时间
interval:不重要参数,直接用即可


根据之前学习的分析步骤,下边直接请求取数:

1.数据采集-headers

data_url = 'http://115.28.187.9:8005/datas/16062539?pageNum={0}&pageSize={1}&startTime={2}+{3}:{4}:{5}&endTime={6}+{7}:{8}:{9}&interval=1'
header={
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Host': '115.28.187.9:8005',
    'Origin': 'http://iot.whxph.com',
    'Referer': 'http://iot.whxph.com/',
    'token': self.token,
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}

2.数据采集-获取检索时间段内有多少页数据

_get_data_start_time = get_data_start_time.strftime("%Y-%m-%d %H:%M:%S")
start_hours = _get_data_start_time.split(' ')[1].split(':')[0]
start_min = _get_data_start_time.split(' ')[1].split(':')[1]
start_sec = _get_data_start_time.split(' ')[1].split(':')[2]
_get_data_end_time = get_data_end_time.strftime("%Y-%m-%d %H:%M:%S")
end_hours = _get_data_end_time.split(' ')[1].split(':')[0]
end_min = _get_data_end_time.split(' ')[1].split(':')[1]
end_sec = _get_data_end_time.split(' ')[1].split(':')[2]

page_Num = -1
request = urllib.request.Request(page_url.format(_get_data_start_time.split(' ')[0],start_hours,start_min,start_sec,_get_data_end_time.split(' ')[0],end_hours,end_min,end_sec),headers=header)
data_num = int(self.opener.open(request).read().decode('utf-8'))
if data_num==0:
    print("get {4}-{3} date:{0}~{1} -> empty[{2}]".format(get_data_start_time,get_data_end_time,0,table_name,self.Scenic_Spot))
    start_time = get_data_end_time + datetime.timedelta(seconds=1)
    return
page_Num = data_num//rows + 1

3.数据采集-根据页码遍历取数

add_dict_list=[]
for each_page in range(0,page_Num):
	request = urllib.request.Request(data_url.format(each_page+1, rows,_get_data_start_time.split(' ')[0],start_hours,start_min,start_sec,_get_data_end_time.split(' ')[0],end_hours,end_min,end_sec),headers=header)
	result_data = self.opener.open(request).read().decode('utf-8')
	data = json.loads(result_data)
	for each_data in data:
	    MGDB_data={}
	    MGDB_data['日期'] = each_data['dataTime']
	    try:
	        MGDB_data['日期'] = datetime.datetime.strptime(MGDB_data['日期'], '%Y-%m-%d %H:%M:%S')
	    except:
	        pass
	    MGDB_data['风速(m/s)'] = each_data['e1']
	    MGDB_data['雨量(mm)'] = each_data['e2']
	    MGDB_data['大气温度(℃)'] = each_data['e3']
	    MGDB_data['日雨量累计(mm)'] = each_data['e4']
	    MGDB_data['数字气压(hPa)'] = each_data['e5']
	    MGDB_data['紫外线(mW/m2)'] = each_data['e6']
	    MGDB_data['风向(°)'] = each_data['e7']
	    MGDB_data['负氧离子(个/cm3)'] = each_data['e8']
	    MGDB_data['大气湿度(%RH)'] = each_data['e9']
	    add_dict_list.append(MGDB_data)
	print("get {4}-{3} date:{0}~{1} -> ok[{2}]".format(get_data_start_time,get_data_end_time,len(add_dict_list),table_name,self.Scenic_Spot))

这里的add_dict_list就是所有数据,MGDB_data就是处理过程中的单条数据


三、效果

我这边主要是把数据塞进数据库,最终效果如图:
在这里插入图片描述


四、总结

本项目代码比较简单,源码基本就是上边的源码,只需要读懂按照步骤即可实现数据采集,完成爬虫

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本项目系统是一个简单易用的生活物联网平台。可用于企业搭建私域物联网,个人学习和搭建自己的智能家居平台,以及手机和电脑的监控。项目包含服务端、web端、移动端、设备端SDK、以及手机和电脑端的设备模拟器并支持智能音箱 功能 权限管理: 用户管理、部管理、岗位管理、菜单管理、角色管理、字典和参数管理等 系统监控: 操作日志、登录日志、系统日志、在线用户、服务监控、连接池监控、缓存监控等 产品管理: 产品、产品物模型、产品分类、产品固件、设备授权码等 设备管理: 控制、分组、定时、日志、统计、定位、分享、配置、禁用、OTA升级、自动注册、影子模式、实时监测、加密认证等 EMQ管理: Mqtt客户端、监听器、消息主题、消息订阅、插件管理、规则引擎、资源 硬件 SDK: 支持WIFI和MQTT连接、物模型响应、实时监测、定时上报监测数据、AES加密、NTP时间等 物模型管理: 属性 (设备状态和监测数据) ,功能(执行特定任务),事件(设备主动上报给云端) 其他功能:多租户、统计、新闻资讯、通知公告支持TDengine时序数据库 计划开发完善功能: 设备告警、场景联动、云云对接智能音箱、设备配网、第三方登录、短信登录 技术栈 服务端 相关技术:Spring boot、MyBatis、Spring Security、Jwt、Mysql、Redis、TDengine、EMQX、Netty等 开发工具:IDEA Web端 相关技术:ES6、Vue、Vuex、Vue-router、Vue-cli、Axios、Element-ui等 开发工具:Visual Studio Code 移动端(微信小程序 / Android / Ios / H5) 相关技术:uniapp、uView、uChart 开发工具:HBuilder 硬件端 相关技术: ESP-IDF、Arduino、FreeRTOS、Python、Lua等 开发工具:Visual Studio Code 和 Arduino等 spring-boot --------------- 后端 vue ----------------------- 前端 docker -------------------- docker部署文件 sdk ----------------------- 硬件SDK,已集成多种设备

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的广东仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值