公众号 采集 java_Java实现公众号数据的抓取

此文copy于掘金大神,因为比较喜欢,就copy过来了。

前言

昨天在公众号查询我房间还剩多少电时,觉得这些操作好繁琐,好麻烦,于是就萌生了用用JAVA把这些数据爬下来的想法。

爬到数据后,可以用这些数据做很多事,接下来就跟大家分享下如何通过Java来实现我的想法,欢迎各位感兴趣的开发者阅读本文。

环境搭建

JDK版本: 1.8

jsoup版本: 1.12.1

编译器: IDEA

项目类型选择Java点下一步

3a4cbf9f6d11bf883dd59920cb6ca197.png

点下一步

963f02bdedee637f91e3bfe3e9f63833.png

填写项目名以及项目路径点击下一步

209f8bf8c70886663a5d25786b8c4d85.png

在src下创建包和lib文件夹

f718fe620cd1dcaccf8d07f30adf2642.png

从maven仓库中下载jsoup版本为1.12.1

a7515ea0d729898748d80b87d14dc956.png

jar包下载好后,复制到项目的lib目录下,并进行应用获取公众号接口

获取登录接口

打开公众号的首页,选择在浏览器打开,并复制其链接

7b8c94a3d9b6b3aa513599aac794f1a4.png

在PC浏览器打开刚才得到的链接

8889089470b3299ed235c1b866d39f93.png

打开抓包工具,此处使用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";复制代码打开抓包工具,查看拦截到的请求

1f02c4fd9a6bead81f3f1659ed94864e.png

88e55b96331fc716d733a323cc646fde.png

通过抓包工具,我们获取到了如下信息 1.接口的url地址 2.调用接口需要的参数 3.http的请求报文,从报文中了解到此方法为get请求,以及他header中需要的参数和值复制代码获取电量查询接口

在pc浏览器进行操作,进入到电量查询页面

167216227e5917ae86d61beb25c6ab18.png

观察当前浏览器的url,打开抓包工具找到电量查询接口

254a8d747674638f60d30db55f0d556b.png

通过抓包工具,我们获取到了如下信息 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;publicclassJsoupUtils {/** * 获取cookie * @param loginUrl * @param data * @return * @throws IOException */public Map jsoupCookieLogin(String loginUrl, HashMap 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");// 打印接口返回的cookiesreturn login.cookies(); };/** * 获取电量信息 * @param cookie * @param url * @return * @throws IOException */public HashMap getBatteryInfo(Map cookie,String url) throws IOException {// 电量信息 HashMap 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;publicclassNetWorkTest {publicstaticvoidmain(String[] args) throws IOException {// 接收返回的Cookie Map cookie;// 构造登录参数 HashMap 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 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")); } }}复制代码执行结果

80fded8b4f8ef52089a9ff469c59e7bf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值