敢想敢做,创意源于生活🥴
前言
昨天在公众号查询我房间还剩多少电时,觉得这些操作好繁琐,好麻烦,于是就萌生了用用JAVA把这些数据爬下来的想法。
爬到数据后,可以用这些数据做很多事,接下来就跟大家分享下如何通过Java来实现我的想法,欢迎各位感兴趣的开发者阅读本文。
环境搭建
JDK版本: 1.8
jsoup版本: 1.12.1
编译器: IDEA
- 项目类型选择Java点下一步
- 点下一步
- 填写项目名以及项目路径点击下一步
- 在src下创建包和lib文件夹
- 从maven仓库中下载jsoup版本为1.12.1
- jar包下载好后,复制到项目的lib目录下,并进行应用
获取公众号接口
获取登录接口
- 打开公众号的首页,选择在浏览器打开,并复制其链接
- 在PC浏览器打开刚才得到的链接
- 打开抓包工具,此处使用charles,观察地址栏的url后我们发现登录的参数全在URL里,此时只需要在url里填写我们的手机号和密码然后按回车发起请求
// url中loginPhone和password就是我们需要进行填写的参数
var url = "http://www.quanfangtong.net/phonehtml/phoneLogin/login.action?loginPhone=xxxxx&password=xxx&conpanyId=Company_20170627113853JMD7cK&language=Chinese";
- 打开抓包工具,查看拦截到的请求
通过抓包工具,我们获取到了如下信息
1.接口的url地址
2.调用接口需要的参数
3.http的请求报文,从报文中了解到此方法为get请求,以及他header中需要的参数和值
获取电量查询接口
- 在pc浏览器进行操作,进入到电量查询页面
- 观察当前浏览器的url,打开抓包工具找到电量查询接口
通过抓包工具,我们获取到了如下信息
1. 登录后返回了cookie过来,每次请求通过cookie来验证身份
2. 请求方式为get
至此,我们拿到了电量查询的接口以及他需要传的参数,接下来我们就用代码来实现抓取吧😜
编写工具类
- 在util包下创建JsoupUtils类
根据我们上面拿到的接口和http请求报文中的信息,我们通过Jsoup这个插件包来发起请求,把得到的信息进行构造。
登录方法,他将返回一个cookie。
获取电量信息方法,根据页面的dom结构,找到需要的信息,放入HashMap中,并进行返回。
有Jsoup的语法请移步:Jsoup中文文档
package com.lk.util;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class JsoupUtils {
/**
* 获取cookie
* @param loginUrl
* @param data
* @return
* @throws IOException
*/
public Map<String, String> jsoupCookieLogin(String loginUrl, HashMap<String,String> data) throws IOException {
// 发起登录请求
Connection.Response login = Jsoup.connect(loginUrl)
// 忽略类型验证
.ignoreContentType(true)
// 禁止重定向
.followRedirects(false)
.postDataCharset("utf-8")
// 设置请求头相关信息
.header("Upgrade-Insecure-Requests","1")
.header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
.header("Accept-Encoding","gzip, deflate")
.header("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8")
.header("Connection","keep-alive")
.header("User-Agent","Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36")
// 登录接口需要参数
.data(data)
// 登录接口的请求方法
.method(Connection.Method.GET)
// 执行
.execute();
// 设置字符集编码
login.charset("UTF-8");
// 打印接口返回的cookies
return login.cookies();
};
/**
* 获取电量信息
* @param cookie
* @param url
* @return
* @throws IOException
*/
public HashMap<String,String> getBatteryInfo(Map<String,String> cookie,String url) throws IOException {
// 电量信息
HashMap<String, String> batteryInfo = new HashMap<>();
// 调用电量查询接口,获取返回的Dom
Document document = Jsoup.connect(url)
// 设置cookies
.cookies(cookie)
.get();
// 解析Dom获取电量信息
if (!document.title().equals("错误页面")) {
// 今日用电
String electricityToday = document.body().select("div > div > div").eq(2).text();
// 剩余电量
String remainingBattery = document.body().select("div > div > div").eq(3).text() + "度";
// 本月累计用电
String currentMonthBatteryTotal = document.body().select("div > div > div").eq(5).text();
// 统计时间
String time = document.body().select("div > div > div").eq(6).text();
// 电量信息赋值
batteryInfo.put("electricityToday", electricityToday);
batteryInfo.put("remainingBattery", remainingBattery);
batteryInfo.put("currentMonthBatteryTotal", currentMonthBatteryTotal);
batteryInfo.put("time", time);
batteryInfo.put("code", "0");
batteryInfo.put("msg", "获取成功");
} else {
batteryInfo.put("code", "1");
batteryInfo.put("msg", "获取失败");
}
return batteryInfo;
}
}
测试工具类
- 在httpNetWork包中创建NetWorkTest类,在main方法中调用工具类中的方法进行测试
package com.lk.httpNetWork;
import com.lk.util.JsoupUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class NetWorkTest {
public static void main(String[] args) throws IOException {
// 接收返回的Cookie
Map<String,String> cookie;
// 构造登录参数
HashMap<String,String> UserInfo = new HashMap<>();
UserInfo.put("loginPhone","****");
UserInfo.put("password","****");
UserInfo.put("conpanyId","Company_20170627113853JMD7cK");
UserInfo.put("language","Chinese");
JsoupUtils jsoupUtils = new JsoupUtils();
// 调用cookie登录函数获取cookie
cookie = jsoupUtils.jsoupCookieLogin("http://www.quanfangtong.net/phonehtml/phoneLogin/login.action",UserInfo);
// 调用获取电量信息方法
HashMap<String,String> batteryInfo = jsoupUtils.getBatteryInfo(cookie,"http://www.quanfangtong.net/phonehtml/myIntelligent/findMyelec.action");
if(batteryInfo.get("code").equals("0")){
System.out.println("今日用电: " + batteryInfo.get("electricityToday"));
System.out.println("剩余电量: " + batteryInfo.get("remainingBattery"));
System.out.println("本月累计用电: " + batteryInfo.get("currentMonthBatteryTotal"));
System.out.println("统计时间: " + batteryInfo.get("time"));
}else{
System.out.println(batteryInfo.get("msg"));
}
}
}
- 执行结果
写在最后
至此,Java获取我房间内的电表电量信息的过程分享结束,现在我们拿到了数据,在服务器写个接口,调用工具类中的方法,得到电量信息返回给调用者,调用者拿到这些数据后,可以以任意形式进行展示,后期我打算写一个Mac端的小工具,将接口返回的数据展示到顶栏中,欢迎各位感兴趣的开发者持续关注。
- 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
- 本文首发于掘金,未经许可禁止转载💌
评论区