• 選擇我們,所有數據都是你的!

    服務熱線:029-87553281

    聯系我們

    029-87553281(陜西 西安)

    13389148466 或 13571845363

    1649677458 或 181697466

    hello@webscraping.cn

    歡迎咨詢,點擊這里給我發送消息。 歡迎咨詢,點擊這里給我發送消息。

    技術文章

    如何突破防采集策略-數據加密

    發布時間:2013-06-02

    目前常見的Web反采集策略大概有以下幾種:

    • 1)數據加密;
    • 2)限制訪問頻率;
    • 3)數據以非文本形式展現;
    • 4)驗證碼保護;
    • 5)Cookie驗證;

    本文主要探討一下如何突破“數據加密”:

    反采集策略 - “數據加密”的原理:

    • Web服務器端腳本將HTML文檔中的部分數據加密,然后發送給HTTP客戶端(瀏覽器)。
    • 瀏覽器使用JavaScript將密文還原成文明后顯示。
       

    突破的方法:

    根據JavaScrip解密算法源碼,實現自己采集程序所需還原算法,在接收到服務器應答數據后,先對數據進行解密,然后再進行提取。

    一個實例:

    Whitepages的電話(手機)號碼是這樣輸出的:

    1. <script type="text/javascript" > <br>  
    2. // <![CDATA[  
    3. document.write(WPOL.Util.rotDecode('(57) 1771 3775'));  
    4. // ]]>  
    5. </script>  

    在瀏覽器中看到的電話號碼為:(02) 6226 8220,而不是”(57) 1771 3775“,如下所示:

    在源碼中可以找到WPOL.Util.rotDecode的源碼如下:

    1. rotDecode: function(C) {  
    2.     var B, A = "";  
    3.     for (B = 0; B < C.length; B++) {  
    4.         var E = C.charAt(B);  
    5.         if (/[a-zA-Z]/.test(E)) {  
    6.             var D = /[A-Z]/.test(E) ? "A""a";  
    7.             A += String.fromCharCode((E.charCodeAt(0) - D.charCodeAt(0) + 39) % 26 + D.charCodeAt(0))  
    8.         } else {  
    9.             if (/[0-9]/.test(E)) {  
    10.                 A += String.fromCharCode((E.charCodeAt(0) - 48 + 15) % 10 + 48)  
    11.             } else {  
    12.                 A += E  
    13.             }  
    14.         }  
    15.     }  
    16.     return A  

    我們的采集程序是采用Python編寫的,所以需要根據上述代碼實現我們自己的解密算法,如下:

    1. def phone_decode(phone_en):  
    2.     """Decode whitepages phone number 
    3.     """  
    4.     phone_de = ''  
    5.     for c in phone_en:  
    6.         if re.compile(r'[a-zA-Z]').search(c):  
    7.             if re.compile(r'[A-Z]').search(c):  
    8.                 d = 'A'  
    9.             else:  
    10.                 d = 'a'  
    11.             phone_de += chr((ord(c) - ord(d) + 39) % 26 + ord(d))  
    12.         else:  
    13.             if re.compile(r'[0-9]').search(c):  
    14.                 phone_de += chr((ord(c) - 48 + 15) % 10 + 48)  
    15.             else:  
    16.                 phone_de += c  
    17.     return phone_de  

    測試:

    国产精品自在线拍国产手机版 日本少妇人妻xxxxx18 欧美老熟妇按摩视频 日韩精品无码视频免费专区|久久久久A亚洲V无码专区首页|2021国产精品午夜久久|国产欧美日韩高清在线不卡