选择我们,所有数据都是你的!

服务热线:029-68863281

联系我们

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  

测试: