1:如何獲取cookies。
1.1:因爲須要登陸,故先模擬登錄時的那一個<form>,這裏用map來裝載變量名稱,變量值。
Map<String, String> map = new HashMap<String, String>();
map.put("username", username);
map.put("pwd", md5.getMD5ofStr(password));
map.put("imgcode", "");
map.put("f", "json");
具體一個map要如何賦值,須要玩家本身去分析網頁,找到網頁中登錄的form,而後看所需的值。
1.2:httpclient的包有不少,這裏我用了一個開源包Jsoup-1.7.1.jar,這一個開源包,(其實比較建議先去學習httpclient這個包的使用,由於那個包纔是最基礎的,其餘全部的開源包應該都是在這一個的基礎上進行改進的),jsoup包中一個類Connection,這個是關鍵的類,請求都是經過它進行的。
代碼:
Connection conn = Jsoup.connect(LOGIN_URL);
conn.header("(Request-Line)", "POST /cgi-bin/login?lang=zh_CN HTTP/1.1");
conn.header("Accept", "application/json, text/javascript, */*; q=0.01");
conn.header("Accept-Encoding", "gzip, deflate");
conn.header("Accept-Language", "zh-cn");
conn.header("Cache-Control", "no-cache");
conn.header("Connection", "Keep-Alive");
conn.header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
conn.header("Host", "mp.weixin.qq.com");
conn.header("Referer", "https://mp.weixin.qq.com/");
conn.header("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)");
Response response = conn.ignoreContentType(true).method(Method.POST).data(map).execute();
能夠看出,首先要找到登錄時的LOGIN_URL,這一個要本身去分析網頁源碼,好像有什麼爬蟲技術,不過我還沒學,構造一個Connection conn對象,對象的構造須要傳入一個url,接着是對conn進行僞裝爲瀏覽器的模擬,即conn.header(),
裏面具體要對什麼值進行呢,這個喲根據實際狀況,有時候可能要求沒有那麼嚴格,總之"Host","Referer","User-Agent"是必定要的,而後,讓已經模擬爲瀏覽器的conn,開始發起請求,
Response response = conn.ignoreContentType(true).method(Method.POST).data(map).execute();
能夠看出,conn要調用data()方法,導入登錄表單的值map,method(method.post)仍是get方法呢?這個實際上是要嘗試的,通常登錄都是post方法,沒有發送數據請求,單純只是點點網頁的通常是get方法,總之post不行了,就試試get吧,最後調用execute()後開始執行,返回一個response類型的值,這個response裏面cookies的值,以及一些返回的信息。(response返回的是一個網頁,同時還有網頁看不出來的cookies)
1.3:cookies能夠當成事一種繼承map的數據類型,即爲{變量名=值 變量名=值 }這樣的形式,
Map<String, String> cookies = response.cookies();
這裏定義一個Map類型的值來裝載cookies。這裏就獲取到cookies的值了?
//不知道爲何,代碼裏面還有下面的部分???????進一步來獲取cookies?
//難道這一個cookies的值是被棄用的,難道不能用?????
//但是,下面也是調用response.cookies()方法來獲取cookies的值。
//原來,下面的代碼是用來獲取TOKEN的值!!!!!
1.4:如何獲取TOKEN的值呢?
String json=response.body();
//很明顯能夠看出,TOKEN的值在body裏面,這裏將response的body提取出來後,獲得一個字符串類型的json,裏面包含了TOKEN,其實咱們本身就能夠進行提取其中爲TOKEN的變量的值了,不懂的能夠直接打印出json的值,其實也不長,提取關鍵字的值只是基本夠而已了,可是這裏用了一個叫gson-2.2.2.jar的包,來幫助咱們進行提取。
1.5:用gson來提取關鍵字的值 代碼:
WeiXinResponse weiXinResponse=gson.fromJson(json, WeiXinResponse.class);
gson.fromJson須要2個值,一個是json,一個是類A,且返回值也是類A,而類A只是一個由單純的setter,gettet組成的類,類A中的值爲何呢?這裏就須要本身經過打印json來肯定變量名了。
而後獲得的類A就能夠方便咱們調用gettet來獲取TOKEN了,就是這樣。
上面是cookies的值的獲取。
關於獲取cookies的值後,又該如何利用該cookies的值來進行頁面的訪問呢?
2:準備條件:url,cookie
就只是這麼2個,cookies的值已經經過登陸獲取並保存下來了,之後要用的時候能夠直接使用cookies的值。
url就是你要訪問的頁面。
2.1:一樣的,訪問頁面仍是使用jsoup包中的connecion對象。
2.2:
Document document = Jsoup.connect(FANS_URL).cookies(cookie).get();
這裏還當心的是,有時候get方法會得不到內容,那就改成post方法吧。
之後也是這樣,get()仍是post()不是可預測的,咱們只能試試。
2.3:獲得一個document的對象。
我比較喜歡
System.out.println(document.outerHtml());
答應出整個頁面,就能夠看看咱們是否訪問成功了。
2.4:如何在一個頁面中獲取咱們想要的值呢?
我是喜歡分析頁面,而後看值在的是哪種標籤,通常都是在
<script>這種類型的標籤裏面的:
Elements cai = document.getElementsByTag("script");
獲得不少個Element組成的Elements,經過cai.size()能夠知道有幾個這樣的
標籤。
2.5:
int position=0;
for(int b=0;b<cai.size();b++) {
if(cai.get(b).data().contains("groupsList") == true) {
position = b;
}
}
Element dr =document.getElementsByTag("script").get(position);
而後,我選取我要的<script>中,獨一無二的一個關鍵字,groupsList,這樣就可以
得到那個咱們要的<script>了。
2.6:接下來就是在一個<script>中獲取咱們要的值。
String json = dr.data();
String [] s = json.split("\\s+");
將<script>轉爲字符型,並以空格爲分隔符進行分隔。
2.7:
進一步分析script,以提取包含id的那一部分字符串,獲得temp2
String temp2="";
for(int i=0;i<s.length;i++) {
//System.out.println(s[i]);
if(s[i].contains("id")== true) {
//System.out.println("In "+i);
temp2 =temp2+s[i];
}
}
2.8:
String fakeidstr = "";
int check2 = 0;
for(int jh=0;jh<temp2.length();jh++) {
if(temp2.charAt(jh)>=48&&temp2.charAt(jh)<=57) {
if(check2 == 0) {
fakeidstr = fakeidstr+"*";
}
fakeidstr = fakeidstr+temp2.charAt(jh);
check2 = 1;
}
else {
check2 =0;
}
}
這裏我要的是數字,並且數字的長度要長於4.
總結:
1:知道如何獲取cookies
2:知道如何利用cookies去進一步訪問頁面
3:知道怎樣在頁面中獲取本身要的值