在通過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 }
這樣,就可以在之后的請求中攜帶加密的密碼訪問了