JAVA--利用HttpClient模拟浏覽器登陸請求擷取響應的Cookie
在通過java采集網頁資料時,我們常常會遇到這樣的問題: 站點需要登陸才能通路
而這種網站,一般都會對請求進行賬号密碼的驗證,驗證的方式也有多種,需要具體分析.
今天分析其中的一種情況: 站點對登陸密碼進行動态加密,作為Cookie響應給用戶端,之後的請求需要攜帶加密後的密碼進行通路
登陸成功的響應頭如下圖:

之後的請求頭:
因為每次登陸生成一個新的加密密碼,是以之前的密碼會失效
是以,需要在每次采集之前,先模拟登陸擷取響應的密碼,再作為cookie繼續請求,我們選擇采用HttpClient模拟請求.
我們模拟通路千瓜資料,代碼如下:
1 import org.apache.commons.httpclient.HttpClient;
2 import org.apache.commons.httpclient.NameValuePair;
3 import org.apache.commons.httpclient.methods.PostMethod;
4
5 @Test
6 public void testLogin() throws IOException {
7 //時間戳
8 long timestamp = new Date().getTime();
9 //請求位址
10 String url = "http://api.qian-gua.com/login/Login?_=" + timestamp;
11 HttpClient client = new HttpClient();
12 //post請求方式
13 PostMethod postMethod = new PostMethod(url);
14 //推薦的資料存儲方式,類似key-value形式
15 NameValuePair telPair = new NameValuePair();
16 telPair.setName("tel");
17 telPair.setValue("181****0732");
18 NameValuePair pwdPair = new NameValuePair("pwd","a123456");
19 //封裝請求參數
20 postMethod.setRequestBody(new NameValuePair[]{telPair,pwdPair});
21 //這裡是設定請求内容為json格式,根據站點的格式決定
22 //因為這個網站會将賬号密碼轉為json格式,是以需要這一步
23 postMethod.setRequestHeader("Content_Type","application/json");
24 //執行請求
25 client.executeMethod(postMethod);
26 //通過Post/GetMethod對象擷取響應頭資訊
27 String cookie = postMethod.getResponseHeader("Set-Cookie").getValue();
28 //截取需要的内容
29 String sub = cookie.substring(cookie.indexOf("&"), cookie.lastIndexOf("&"));
30 String[] splitPwd = sub.split("=");
31 String pwd = splitPwd[1];
32 System.out.println(pwd);
33 }
這樣,就可以在之後的請求中攜帶加密的密碼通路了