公众号 采集 java_Java实现公众号数据的抓取
此文copy于掘金大神,因?yàn)楸容^喜歡,就copy過來了。
前言
昨天在公眾號(hào)查詢我房間還剩多少電時(shí),覺得這些操作好繁瑣,好麻煩,于是就萌生了用用JAVA把這些數(shù)據(jù)爬下來的想法。
爬到數(shù)據(jù)后,可以用這些數(shù)據(jù)做很多事,接下來就跟大家分享下如何通過Java來實(shí)現(xiàn)我的想法,歡迎各位感興趣的開發(fā)者閱讀本文。
環(huán)境搭建
JDK版本: 1.8
jsoup版本: 1.12.1
編譯器: IDEA
項(xiàng)目類型選擇Java點(diǎn)下一步
點(diǎn)下一步
填寫項(xiàng)目名以及項(xiàng)目路徑點(diǎn)擊下一步
在src下創(chuàng)建包和lib文件夾
從maven倉庫中下載jsoup版本為1.12.1
jar包下載好后,復(fù)制到項(xiàng)目的lib目錄下,并進(jìn)行應(yīng)用獲取公眾號(hào)接口
獲取登錄接口
打開公眾號(hào)的首頁,選擇在瀏覽器打開,并復(fù)制其鏈接
在PC瀏覽器打開剛才得到的鏈接
打開抓包工具,此處使用charles,觀察地址欄的url后我們發(fā)現(xiàn)登錄的參數(shù)全在URL里,此時(shí)只需要在url里填寫我們的手機(jī)號(hào)和密碼然后按回車發(fā)起請(qǐng)求// url中l(wèi)oginPhone和password就是我們需要進(jìn)行填寫的參數(shù)var url = "http://www.quanfangtong.net/phonehtml/phoneLogin/login.action?loginPhone=xxxxx&password=xxx&conpanyId=Company_20170627113853JMD7cK&language=Chinese";復(fù)制代碼打開抓包工具,查看攔截到的請(qǐng)求
通過抓包工具,我們獲取到了如下信息 1.接口的url地址 2.調(diào)用接口需要的參數(shù) 3.http的請(qǐng)求報(bào)文,從報(bào)文中了解到此方法為get請(qǐng)求,以及他header中需要的參數(shù)和值復(fù)制代碼獲取電量查詢接口
在pc瀏覽器進(jìn)行操作,進(jìn)入到電量查詢頁面
觀察當(dāng)前瀏覽器的url,打開抓包工具找到電量查詢接口
通過抓包工具,我們獲取到了如下信息 1. 登錄后返回了cookie過來,每次請(qǐng)求通過cookie來驗(yàn)證身份 2. 請(qǐng)求方式為get復(fù)制代碼至此,我們拿到了電量查詢的接口以及他需要傳的參數(shù),接下來我們就用代碼來實(shí)現(xiàn)抓取吧
編寫工具類
在util包下創(chuàng)建JsoupUtils類根據(jù)我們上面拿到的接口和http請(qǐng)求報(bào)文中的信息,我們通過Jsoup這個(gè)插件包來發(fā)起請(qǐng)求,把得到的信息進(jìn)行構(gòu)造。登錄方法,他將返回一個(gè)cookie。獲取電量信息方法,根據(jù)頁面的dom結(jié)構(gòu),找到需要的信息,放入HashMap中,并進(jìn)行返回。有Jsoup的語法請(qǐng)移步: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 {// 發(fā)起登錄請(qǐng)求 Connection.Response login = Jsoup.connect(loginUrl)// 忽略類型驗(yàn)證 .ignoreContentType(true)// 禁止重定向 .followRedirects(false) .postDataCharset("utf-8")// 設(shè)置請(qǐng)求頭相關(guān)信息 .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")// 登錄接口需要參數(shù) .data(data)// 登錄接口的請(qǐng)求方法 .method(Connection.Method.GET)// 執(zhí)行 .execute();// 設(shè)置字符集編碼 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<>();// 調(diào)用電量查詢接口,獲取返回的Dom Document document = Jsoup.connect(url)// 設(shè)置cookies .cookies(cookie) .get();// 解析Dom獲取電量信息if (!document.title().equals("錯(cuò)誤頁面")) {// 今日用電 String electricityToday = document.body().select("div > div > div").eq(2).text();// 剩余電量 String remainingBattery = document.body().select("div > div > div").eq(3).text() + "度";// 本月累計(jì)用電 String currentMonthBatteryTotal = document.body().select("div > div > div").eq(5).text();// 統(tǒng)計(jì)時(shí)間 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; }}復(fù)制代碼測(cè)試工具類
在httpNetWork包中創(chuàng)建NetWorkTest類,在main方法中調(diào)用工具類中的方法進(jìn)行測(cè)試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;// 構(gòu)造登錄參數(shù) HashMap UserInfo = new HashMap<>(); UserInfo.put("loginPhone","****"); UserInfo.put("password","****"); UserInfo.put("conpanyId","Company_20170627113853JMD7cK"); UserInfo.put("language","Chinese"); JsoupUtils jsoupUtils = new JsoupUtils();// 調(diào)用cookie登錄函數(shù)獲取cookie cookie = jsoupUtils.jsoupCookieLogin("http://www.quanfangtong.net/phonehtml/phoneLogin/login.action",UserInfo);// 調(diào)用獲取電量信息方法 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("本月累計(jì)用電: " + batteryInfo.get("currentMonthBatteryTotal")); System.out.println("統(tǒng)計(jì)時(shí)間: " + batteryInfo.get("time")); }else{ System.out.println(batteryInfo.get("msg")); } }}復(fù)制代碼執(zhí)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的公众号 采集 java_Java实现公众号数据的抓取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广东突降冰雹 多车被砸毁容!保险给赔吗?
- 下一篇: java美元兑换,(Java实现) 美元