1. 程式人生 > >【逆向工程】從原始碼分析網站反爬蟲措施

【逆向工程】從原始碼分析網站反爬蟲措施

       從事網頁爬蟲工作有兩年了,從最開始的新聞,bbs論壇,論文網站,到現在的全國企業信用資訊公示系統,無論是PC網頁,到手機移動APP,還是現在的支付寶微信小程式一直採集別人家網站上的資料,也算得上也是身經百戰。如今,領導安排我注意收集整理歸納一下反爬蟲措施,好直接用到我們自家的網站上,以免辛辛苦苦得來的資料被人輕而易舉的抓取了。

       1、瀏覽器Cookies中的JSESSIONID

       多年的經驗告訴我,那些反爬蟲比較厲害的網站一般都會校驗cookies的,所以傳送請求的時候一定要帶上cookies,需要注意的是最好在這兩處都要加上cookies。一個是直接請求帶上cookies,cookies是以鍵值對的形式帶上的;另一個是在headers中也要加上Cookies的,這裡的Cookies的value是用“;”隔開的字串。下面我們分析一下

package com.test.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class SetJeSessionIdServlet extends HttpServlet{
    
    @Override
    protected void service(HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException {
        //這裡是獲取請求JESESSIONID
        String JESESSIONID = request.getParameter("JSESSIONID");
        //在cookie中加入JESESSIONID
        Cookie cookie = new Cookie("JSESSIONID",JESESSIONID);
        response.addCookie(cookie);
    }
}

       從上面程式碼可以看出,每次webserver處理請求,返回時都會加上JESESSIONID進行校驗處理,所以編寫爬蟲時要cookies中有JESESSIONID是必須要加上的,同樣的cookie中的uuid,__jsluid也很重要,使用時注意觀察不要遺漏了,這其中比較有意思的網站,如全國企業信用資訊系統中使用了加速樂的反爬蟲措施,就會校驗以上引數。

       2、小程式中禁用WiFi代理伺服器反爬蟲

     在爬蟲某小程式時,用Fiddler設定WiFi代理抓包檢視請求,發現所有請求異常,沒有返回。看一下後臺業務邏輯歸納:

if(isWifiProxy){  

    //true,使用了wifi代理,不做訪問操作

}else{     
            
    //flase,正常使用者,未使用wifi代理,訪問網頁
}

Java的判斷邏輯也不復雜嘛!展示一下具體的程式碼實現:


 //判斷裝置 是否使用代理上網
 
private boolean isWifiProxy(Context context) {
 
        final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
        String proxyAddress;
        int proxyPort;
        if (IS_ICS_OR_LATER) {
            proxyAddress = System.getProperty("http.proxyHost");
            String portStr = System.getProperty("http.proxyPort");
            proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
        } else {
            proxyAddress = android.net.Proxy.getHost(context);
            proxyPort = android.net.Proxy.getPort(context);
        }
        return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
    }

這麼做確實一定程度上可以做到防止抓包,但是一刀切導致所有使用代理的使用者無法訪問小程式。那就不用WiFi代理訪問小程式,在電腦上裝個安卓模擬器用Fiddler再次抓包,仍然無法看到url,原來模擬器跟PC是“獨立”的終端裝置。但道高一尺魔高一丈,終於讓我發現了個神器,手機抓包工具,即使不使用WiFi代理,我也可以在手機上直接進行抓包。如下,直接抓包成功,然後非常暢快的進行網路爬蟲採集!