網頁爬蟲小記:兩種方式的爬取網站內容


 正文前先來一波福利推薦:

 福利一:

百萬年薪架構師視頻,該視頻可以學到很多東西,是本人花錢買的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;         }     }

 貼一張詳細代碼圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM