天天看點

JAVA--利用HttpClient模拟浏覽器登陸請求擷取響應的Cookie

JAVA--利用HttpClient模拟浏覽器登陸請求擷取響應的Cookie

在通過java采集網頁資料時,我們常常會遇到這樣的問題:  站點需要登陸才能通路

而這種網站,一般都會對請求進行賬号密碼的驗證,驗證的方式也有多種,需要具體分析.

今天分析其中的一種情況:  站點對登陸密碼進行動态加密,作為Cookie響應給用戶端,之後的請求需要攜帶加密後的密碼進行通路

登陸成功的響應頭如下圖:

JAVA--利用HttpClient模拟浏覽器登陸請求擷取響應的Cookie

之後的請求頭:

JAVA--利用HttpClient模拟浏覽器登陸請求擷取響應的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     }                                                          

這樣,就可以在之後的請求中攜帶加密的密碼通路了