利用Jsoup模擬跳過登錄爬蟲獲取數據


  

  今天在學習爬蟲的時候想着學習一下利用jsoup模擬登錄。下面分為有驗證碼和無驗證碼的情況進行討論。

 

---------------------------無驗證碼的情況----------------------------

 

1.我們正常利用網頁進行登錄,利用瀏覽器自帶的開發者工具查看一些登錄信息

 

 

 

    

   我們登錄的時候需要攜帶自己的身份信息,也就是用戶名和密碼。也會攜帶一些瀏覽器的信息,所以我們可以通過Jsoup偽造一些請求頭,並寫到自己的身份信息去登錄,然后獲取登錄后返回的cookie,cookie中會包含session,有了sessionid我們就可以爬取登錄之后可以訪問的url。

 

 

2.Jsoup偽造請求頭且攜帶身份信息獲取登錄信息

    /**
     * 模擬登錄獲取cookie和sessionid
     */
    public static void login() throws IOException {
        String urlLogin = "http://qiaoliqiang.cn/Exam/user_login.action";
        Connection connect = Jsoup.connect(urlLogin);
        // 偽造請求頭
        connect.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding",
                "gzip, deflate");
        connect.header("Accept-Language", "zh-CN,zh;q=0.9").header("Connection", "keep-alive");
        connect.header("Content-Length", "72").header("Content-Type",
                "application/x-www-form-urlencoded; charset=UTF-8");
        connect.header("Host", "qiaoliqiang.cn").header("Referer", "http://qiaoliqiang.cn/Exam/");
        connect.header("User-Agent",
                "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
                .header("X-Requested-With", "XMLHttpRequest");
        
        // 攜帶登陸信息
        connect.data("username", "362501197407067215").data("password", "123456").data("user_type", "2")
                .data("isRememberme", "yes");
        
        //請求url獲取響應信息
        Response res = connect.ignoreContentType(true).method(Method.POST).execute();// 執行請求
        // 獲取返回的cookie
        Map<String, String> cookies = res.cookies();
        for (Entry<String, String> entry : cookies.entrySet()) {
            System.out.println(entry.getKey() + "-" + entry.getValue());
        }
        System.out.println("---------華麗的分割線-----------");
        String body = res.body();// 獲取響應體
        System.out.println(body);
    }

 

結果:

logininfo-"362501197407067215,123456"
JSESSIONID-75ad3bad-30cd-4d7a-8918-b13054f4b737
rememberMe-deleteMe
---------華麗的分割線-----------
{"login_result":"success_manager","user_type":"2","login_url":"examParper\/examPaper\/examparperManage.jsp"}

 

 

反例:

此時我們將身份信息的密碼改成錯誤密碼:

        // 攜帶登陸信息
        connect.data("username", "362501197407067215").data("password", "123").data("user_type", "2")
                .data("isRememberme", "yes");

 

結果:

---------華麗的分割線-----------
{"login_result":"error002","user_type":"2","login_url":null}

 

 

3.在上述獲取cookie的基礎上模擬訪問網站登錄可以訪問的網址

  將cookies定義為一個全局變量cookies,當我們訪問登錄可以訪問的url的時候帶着cookies去訪問。

package cn.qlq.craw.Jsoup;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

/**
 * 模擬Jsoup跳過登陸進行爬蟲
 * 
 * @author liqiang
 *
 */
public class JsoupCookieCraw {
    private static Map<String, String> cookies = null;

    public static void main(String[] args) throws IOException {
        // 先模擬登錄獲取到cookie和sessionid並存到全局變量cookies中
         login();

        String url = "http://qiaoliqiang.cn/Exam/view/testPerson/outEmployeeAllot.jsp";
        // 直接獲取DOM樹,帶着cookies去獲取
        Document document = Jsoup.connect(url).cookies(cookies).post();
        System.out.println(document.toString());
    }

    /**
     * 模擬登錄獲取cookie和sessionid
     */
    public static void login() throws IOException {
        String urlLogin = "http://qiaoliqiang.cn/Exam/user_login.action";
        Connection connect = Jsoup.connect(urlLogin);
        // 偽造請求頭
        connect.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding",
                "gzip, deflate");
        connect.header("Accept-Language", "zh-CN,zh;q=0.9").header("Connection", "keep-alive");
        connect.header("Content-Length", "72").header("Content-Type",
                "application/x-www-form-urlencoded; charset=UTF-8");
        connect.header("Host", "qiaoliqiang.cn").header("Referer", "http://qiaoliqiang.cn/Exam/");
        connect.header("User-Agent",
                "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
                .header("X-Requested-With", "XMLHttpRequest");
        
        // 攜帶登陸信息
        connect.data("username", "362501197407067215").data("password", "123456").data("user_type", "2")
                .data("isRememberme", "yes");
        
        //請求url獲取響應信息
        Response res = connect.ignoreContentType(true).method(Method.POST).execute();// 執行請求
        // 獲取返回的cookie
        cookies = res.cookies();
    }

}

 

 

 

結果:(可以獲取到我們訪問的頁面的內容)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  <title>分配員工</title> 
    .....................

 

 

 

 

反例:

  我們將登錄方法去掉,同時訪問的時候不攜帶cookies:

    public static void main(String[] args) throws IOException {
        String url = "http://qiaoliqiang.cn/Exam/view/testPerson/outEmployeeAllot.jsp";
        // 直接獲取DOM樹,帶着cookies去獲取
        Document document = Jsoup.connect(url).post();
        System.out.println(document.toString());
    }

 

 

結果:(我們訪問到的是系統的主頁,也就是登錄界面,發現我們被攔在網站外面)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  <title>主頁</title> 
    .....

 

 

  

總結:

  不帶驗證碼的登錄利用上面的模擬登錄的方法基本能滿足要求。

 

 

 

---------------------------帶驗證碼的情況----------------------------

 


免責聲明!

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



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