正文前先來一波福利推薦:
福利一:
百萬年薪架構師視頻,該視頻可以學到很多東西,是本人花錢買的VIP課程,學習消化了一年,為了支持一下女朋友公眾號也方便大家學習,共享給大家。
福利二:
畢業答辯以及工作上各種答辯,平時積累了不少精品PPT,現在共享給大家,大大小小加起來有幾千套,總有適合你的一款,很多是網上是下載不到。
獲取方式:
微信關注 精品3分鍾 ,id為 jingpin3mins,關注后回復 百萬年薪架構師 ,精品收藏PPT 獲取雲盤鏈接,謝謝大家支持!
-----------------------正文開始---------------------------
此處進行簡單的分類,對於普通的網頁爬取內容,如果沒有登錄界面可以直接使用Jsoup的API進行爬取;
如果網站是在打開目標也之前需要進行登錄,此時需要先使用用戶加密碼實現登錄獲取Cookie然后進行登錄;
本文就第二種方式進行分析:
方式一、 httpClient中的PostMethod 或者 GetMethod
使用httpClient進行獲得Cookie:
import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; public class HttpLogin { public static void main(String[] args) { // 登陸前 Url String loginUrl = "http://passport.mop.com/?targetUrl=http://hi.mop.com/?&g=1447141423230&loginCheck=UNLOGINED";
// http客戶端 HttpClient httpClient = new HttpClient(); // 模擬登陸,按實際服務器端要求選用 Post 或 Get 請求方式 PostMethod postMethod = new PostMethod(loginUrl); // 設置登陸時要求的信息,用戶名和密碼 NameValuePair[] data = { new NameValuePair("username", "**"), new NameValuePair("password", "**") }; postMethod.setRequestBody(data);
try { // 設置 HttpClient 接收 Cookie,用與瀏覽器一樣的策略 httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); int statusCode = httpClient.executeMethod(postMethod); // 獲得登陸后的 Cookie Cookie[] cookies = httpClient.getState().getCookies(); StringBuffer tmpcookies = new StringBuffer(); for (Cookie c : cookies) { tmpcookies.append(c.toString() + ";"); System.out.println("cookies = "+c.toString()); }
//登錄后需要登錄的網頁
String loginUrl =
"http://passport.mop.com/?targetUrl=http://hi.mop.com/?&g=1447141423230&loginCheck=UNLOGINED"
;
if(statusCode==302){//重定向到新的URL System.out.println("模擬登錄成功"); // 進行登陸后的操作 GetMethod getMethod = new GetMethod(dataUrl); // 每次訪問需授權的網址時需帶上前面的 cookie 作為通行證 getMethod.setRequestHeader("cookie", tmpcookies.toString()); // 你還可以通過 PostMethod/GetMethod 設置更多的請求后數據 // 例如,referer 從哪里來的,UA 像搜索引擎都會表名自己是誰,無良搜索引擎除外 postMethod.setRequestHeader("Referer", "http://passport.mop.com/"); postMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"); httpClient.executeMethod(getMethod); // 打印出返回數據,檢驗一下是否成功 String text = getMethod.getResponseBodyAsString(); System.out.println(text); } else { System.out.println("登錄失敗"); } } catch (Exception e) { e.printStackTrace(); } } }
使用 httpClient 方式獲得 cookie 后就可以使用 jsoup的API進行解析html操作,獲取所需的信息;
方式二、使用jsoup自帶的API方式
private static Integer TIMEOUT = 10000; private static String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"; private static String URL="登陸請求發送的url"; public static Map getLoginCookeis(){ try { //此處數據需要在頁面上登陸頁面,測試一下,獲取登錄時發送的登陸請求數據 Map map = new HashMap(); map.put("username", "用戶名"); map.put("password", "密碼");
Map map1 = new HashMap(); map1.put("ASPSESSIONIDASBTBDDT", "ACABMBFDKBGHOLHBHMKKMHLA"); map1.put("Sailing", "Skin="); map1.put("wwwkechengbiaonetjecas", "UserName=%D5%C5%C8%CB%C0%FB&AdminLoginCode=&AdminName=%D5%C5%C8%CB%C0%FB&LastPassword=v0rdu3g775Uqy735&UnreadMsg=&UserPassword=877b0591474be1fb&RndPassword=v0rdu3g775Uqy735&AdminPassword=877b0591474be1fb"); //發送登錄請求 Connection.Response rs = Jsoup.connect(URL) .postDataCharset("GB2312")//編碼格式 .data(map)//請求參數 .userAgent(USER_AGENT) .cookies(map1)//cookies .timeout(TIMEOUT)//超時 .method(Connection.Method.POST) .execute(); map1 = rs.cookies();//獲取登錄的cookies
//*** 獲取到cookie后,后邊就可以使用cookie進行二次登錄,然后獲取網頁目的信息,進行爬取操作;
return map1; } catch (IOException ex) { Logger.getLogger(KechengbiaoLogin.class.getName()).log(Level.SEVERE, null, ex); return null; } }
貼一張詳細代碼圖: