AD

网络机器人的识别与攻防的经典案例(也即爬虫与反爬虫的经典案例)

本文我们介绍一个网络机器人的识别与攻防的经典案例(也即爬虫与反爬虫的经典案例)。使用到的代码见本人的superword项目:

**github**/ysc/superword/blob/master/src/main/java/org/apdplat/superword/tools/ProxyIp.java

我们的目的是要使用机器人自动获取站点**ip.qiaodm**/ 和站点**proxy.goubanjia**/ 的免费高速HTTP代理IP和端口号。

不过他们未对机器人进行识别,如通过如下代码就可以获取网页内容:

public static void main(String[] args) {
    try {
        String url = "**proxy.goubanjia**/";
        HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection();
        connection.setConnectTimeout(10000);
        connection.setReadTimeout(10000);
        connection.setUseCaches(false);
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder html = new StringBuilder();
        String line = null;
        while ((line=reader.readLine()) != null){
            html.append(line);
        }
        LOGGER**("HTML:"+html);
    }catch (Exception e){
        LOGGER.error(e.getMessage());
    }
}

尽管如此,但是他们却考虑到了机器人的防范,通过分析发现,两个站点的防范措施是一致的,所以破一得二。

他们是如何防范的呢?我们看看IP:163.125.217.56和端口:9797,我们利用FIREFOX的FIREBUG插件进行分析,如下图所示:

网络机器人的识别与攻防的经典案例(也即爬虫与反爬虫的经典案例)

这里,如果我们直接调用选中的td节点的Jsoup的Element的text()方法,那么得到的值就会是 16363.1.125 25.21717.5.5,而不是我们在页面上看到的IP:163.125.217.56,还有<script>下面的那个6我们在源代码中是看不到的,这是<script>里面的JS执行之后动态生成的结果,对于端口9797也一样,在源代码中所有的端口全部是8080,我们这里之所以在上图中看到了6和9797,这是因为FIREBUG插件看到的是网页加载完毕且所有JS执行完毕之后的视图。

通过上面的分析,我们知道,防范的方法是将IP拆开在中间加入一些隐藏字符,并利用JS动态生成部分字符,而端口全部都是利用JS生成的。

那么我们如何来应对这种防范方法呢?首先的第一个要求是我们的机器人要能动态执行JS,其次是我们需要对IP字段进行逐节点分析,忽略隐藏节点中的字符。下面用代码说明:

1、动态执行JS。

引入htmlunit依赖,注意的是如果你是使用slf4j日志的话,需要排除commons-logging依赖。
<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.14</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

接下来看代码,这里获取到的html就是执行JS之后的内容:

private static final WebClient WEB_CLIENT = new WebClient(BrowserVersion.INTERNET_EXPLORER_11);
String html = ((HtmlPage)WEB_CLIENT.getPage(url)).getBody().asXml();

2、对IP字段进行逐节点分析,忽略隐藏节点中的字符。

引入jsoup依赖。
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.1</version>
</dependency>

接下来看代码:

private static String getIps(Element element){
    StringBuilder ip = new StringBuilder();
    Elements all = element.children();
    LOGGER**("");
    LOGGER**("开始解析IP地址,机器读到的文本:"+element.text());
    AtomicInteger count = new AtomicInteger();
    all.forEach(ele -> {
        String html = ele.outerHtml();
        LOGGER**(count.incrementAndGet() + "、" + "原始HTML:"+html.replaceAll("[\n\r]", ""));
        String text = ele.text();
        if(ele.hasAttr("style")
                && (ele.attr("style").equals("display: none;")
                    || ele.attr("style").equals("display:none;"))) {
            LOGGER**("忽略不显示的文本:"+text);
        }else{
            if(StringUtils.isNotBlank(text)){
                LOGGER**("需要的文本:"+text);
                ip.append(text);
            }else{
                LOGGER**("忽略空文本");
            }
        }
    });
    LOGGER**("----------------------------------------------------------------");
    LOGGER**("解析到的ip: "+ip);
    LOGGER**("----------------------------------------------------------------");
    Matcher matcher = IP_PATTERN.matcher(ip.toString());
    if(matcher.find()){
        String _ip = matcher.group();
        LOGGER**("ip地址验证通过:"+_ip);
        return _ip;
    }else{
        LOGGER**("ip地址验证失败:"+ip);
    }
    return null;
}

接着看运行过程的输出:

开始解析IP地址,机器读到的文本:61 61 . 18 18 5. 1 1 49 .1 .1 63
1、原始HTML:<div style="display:inline-block;">  <script type="text/javascript">//<![CDATA[document.write('');//]]>                </script> </div>
忽略空文本
2、原始HTML:<label style="display: none;"> 61 </label>
忽略不显示的文本:61
3、原始HTML:<span> 61 </span>
需要的文本:61
4、原始HTML:<div style="display:inline-block;">  . </div>
需要的文本:.
5、原始HTML:<div style="display:inline-block;">  <script type="text/javascript">//<![CDATA[document.write('');//]]>                </script> </div>
忽略空文本
6、原始HTML:<span style="display:inline-block;"> <script type="text/javascript">//<![CDATA[document.write('');//]]>                </script> </span>
忽略空文本
7、原始HTML:<p style="display: none;"> 18 </p>
忽略不显示的文本:18
8、原始HTML:<span> 18 </span>
需要的文本:18
9、原始HTML:<div style="display:inline-block;">  <script type="text/javascript">//<![CDATA[document.write('5.');//]]>                </script> 5. </div>
需要的文本:5.
10、原始HTML:<p style="display: none;"> 1 </p>
忽略不显示的文本:1
11、原始HTML:<span> 1 </span>
需要的文本:1
12、原始HTML:<div style="display:inline-block;">  49 </div>
需要的文本:49
13、原始HTML:<label style="display:none;"> .1 </label>
忽略不显示的文本:.1
14、原始HTML:<span> .1 </span>
需要的文本:.1
15、原始HTML:<div style="display:inline-block;">  <script type="text/javascript">//<![CDATA[document.write('');//]]>                </script> </div>
忽略空文本
16、原始HTML:<span style="display:inline-block;"> 63 </span>
需要的文本:63
----------------------------------------------------------------
解析到的ip: 61.185.149.163
----------------------------------------------------------------

下面是通过上面的分析程序获取到的部分能隐藏自己IP的代理服务器IP和端口号:

124.88.67.33:81
183.207.224.13:80
111.161.126.101:80
183.207.228.51:80
123.138.184.228:80
120.131.128.212:85
111.12.251.199:80
111.1.36.6:80
111.206.86.76:80
120.198.243.111:80
222.138.229.17:8104
123.125.104.240:80
124.88.67.25:81
202.102.22.182:80
183.207.228.114:80
162.208.49.45:8089
183.207.228.116:80
120.192.249.74:80
124.202.177.26:8118
124.88.67.32:80
111.161.126.100:80
183.207.224.14:80
183.207.224.43:80
111.206.81.248:80
183.207.224.45:80
182.118.31.110:80
124.88.67.53:80
111.13.109.52:80
190.38.26.167:8080
118.26.183.43:80
101.226.249.237:80
202.108.50.75:82
202.106.16.36:3128
111.1.36.133:80
124.88.67.24:80

有了这些IP和端口号,我们在JAVA中如何使用呢?只需要设置系统属性即可。

System.setProperty("proxySet", "true");
System.setProperty("http.proxyHost", ip);
System.setProperty("http.proxyPort", port);

设置完系统属性之后,我们如何判断有没有生效呢?我们可以通过看看在ip138的眼中,自己的IP是多少,然后和自己之前的IP作比较,看是否发生变化,如果发生变化,则认为我们的代理成功为我们向外部隐藏了自己的真实IP。

如何从ip138获取自己的外部地址呢?看如下代码:

public static String getCurrentIp(){
    try {
        String url = "**1111.ip138**/ic.asp?timestamp="+System.nanoTime();
        String text = Jsoup.connect(url)
                .header("Accept", ACCEPT)
                .header("Accept-Encoding", ENCODING)
                .header("Accept-Language", LANGUAGE)
                .header("Connection", CONNECTION)
                .header("Host", "1111.ip138**")
                .header("Referer", "**ip138**/")
                .header("User-Agent", USER_AGENT)
                .ignoreContentType(true)
                .timeout(5000)
                .get()
                .text();
        LOGGER**("检查自身IP地址:"+text);
        Matcher matcher = IP_PATTERN.matcher(text);
        if(matcher.find()){
            String ip = matcher.group();
            LOGGER**("自身IP地址:"+ip);
            return ip;
        }
    }catch (Exception e){
        LOGGER.error(e.getMessage());
    }
    LOGGER**("检查自身IP地址失败,返回之前的IP地址:"+ previousIp);
    return previousIp;
}

最后看看程序运行的部分截图如下:

尝试使用新的代理:186.91.60.155:8080
检查自身IP地址:您的IP地址 您的IP是:[186.91.60.155] 来自:委内瑞拉
自身IP地址:186.91.60.155
Thread[main,5,main]自动更换代理成功!
Thread[main,5,main]更换代理耗时:4025毫秒
将66条代理IP地址写入本地
将81条能隐藏自己的代理IP地址写入本地
将108条不能隐藏自己的代理IP地址写入本地
Thread[main,5,main]请求重新更换代理
Thread[main,5,main]开始重新更换代理
尝试使用新的代理:117.158.98.214:80
检查自身IP地址:您的IP地址 您的IP是:[117.158.98.214] 来自:河南省许昌市 移动
自身IP地址:117.158.98.214
Thread[main,5,main]自动更换代理成功!
Thread[main,5,main]更换代理耗时:176毫秒
将66条代理IP地址写入本地
将81条能隐藏自己的代理IP地址写入本地
将108条不能隐藏自己的代理IP地址写入本地
Thread[main,5,main]请求重新更换代理
Thread[main,5,main]开始重新更换代理
尝试使用新的代理:120.131.128.212:85
检查自身IP地址:您的IP地址 您的IP是:[111.200.10.82] 来自:北京市 联通
自身IP地址:111.200.10.82
Thread[main,5,main]自动更换代理成功!
Thread[main,5,main]更换代理耗时:240毫秒
将66条代理IP地址写入本地
将81条能隐藏自己的代理IP地址写入本地
将108条不能隐藏自己的代理IP地址写入本地

完整的代码见本人的superword项目:**github**/ysc/superword/blob/master/src/main/java/org/apdplat/superword/tools/ProxyIp.java

标签: 网络爬虫, 爬虫, 代理, 网络机器人, 攻防
分类: superword
时间: 2015-04-11

相关文章

  1. 网络机器人--游戏机器人的开发

    网络机器人(1)--悄然中向我们走来 最早听说网络机器人的存在,是在2002年底,那时第一次听说GOOGLE为了统计和查询网络资源,专门研制了一种网络机器人,在世界各地为GOOGLE不辞劳苦地忙碌着,然而,关于网络机器人 ...
  2. 中国将制定网络内容身份识别编码国标

    近日,据中国文化部网站消息,为打击网络盗版,有效保护网络音乐.视频.文本作品的知识产权,中国将采用国际通行做法,制订实施网络内容身份识别编码国家标准.8月5日,全国信息与文献标准化技术委员会在中国广播电视音像资料馆召开& ...
  3. java网络编程之识别示例 获取主机网络接口列表

    一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少.然后我们才能够通过这个地址向服务器发送信息. 获取主机地址信息 在Java中我们使用InetAddress类来代表目标网络地址,包 ...
  4. Ubuntu 14.04 LTC 有线网络--网线不识别,灯不亮问题

    通过与相关人员沟通 ,执行以下命令解决:ethtool -s eth0 autoneg off speed 100 duplex full,如果是非root,请加sudo处理.
  5. 网络爬虫面临的挑战 之 链接构造

    爬虫与反爬虫就好像是安全领域的破解与反破解一样,相互矛盾,相互克制,同时也相互促进. 网站的构建技术从简单的静态网站发展到动态网站,信息的传递从用户单向接收发展到双向交互,内容的产生从站长集中生成发展到全民参与生成. W ...
  6. windows7 无法识别无线网络

    我遇到这样的一个事情,在电脑刚装系统后,在公司可以正常使用无线网络,但是回到家里连接无线网络显示后显示一个感叹号,打开无线网络属性,提示无法识别网络.我怀疑是无线驱动的问题,我就卸载了无线驱动重新安装,结果还是一样,我使 ...
  7. 网络爬虫的实现

    作者:Gupta, P. ; Johari, K. ; Linagay's Univ., India 文章发表在: Emerging Trends in Engineering and Technology (ICETE ...
  8. 科学家首次开发出可用双手弹钢琴机器人

    这款尚未命名的机器人可以模仿人类各种表情,比如惊讶.愤怒.悲伤和欢乐 哈利·恩菲.马克·莫拉翰.加里·布里斯戴尔扮演的"利物浦人" 一款能用两只手弹钢琴的机器人在2010年台北国际机器人展上首次全球亮 ...
  9. 马云 牛根生 史玉柱 经典语录

    看成功人士的经典语录,大家可以看下. 马云经典语录: 1.当你成功的时候,你说的所有话都是真理. 2.我永远相信只要永不放弃,我们还是有机会的.最后,我们还是坚信一点,这世界上只要有梦想,只要不断努力,只要不断学习,不管 ...
  10. 网络基础学习之十七路由器原理.分类和选购

    上一篇我们已对路由器的基础方面有一个全面的了解,本篇要继续介绍路由器的其它几个方面.首先要介绍的是路由器的工作原理,只有在充分理解了路由器工作原理基础上,才能正确理解路由器的主要作用. 一.路由器的工作原理 我们知道路由 ...
  11. 苹果在华频吃官司:小i机器人诉Siri专利侵权

    编者按 或许正应了"树大招风"这句谚语,苹果在中国遭遇连环诉讼.昨天,苹果刚刚向唯冠支付了6000万美元"和解费",其因为iPhone 4S的最新功能Siri涉嫌侵犯专利权再次成为 ...
  12. 网页游戏,网络巨人手中的"人参娃娃"

    2007年底,美国有名的网络即时通信服务商Meebo开始向一个社交网站转型,网站的用户可以使用20多个已经移植到Meebo平台上的游戏软件.用户在和其他好友进入聊天状态之后可以激发这些游戏.而Meebo之前最大的特色,是 ...
  13. 网络营销经理(Web Marketing Manager)的职责

    网络营销经理,又名互联网营销经理,线上市场经理等,英文名 Web Marketing Manager, Online Marketing Manager等,各家公司的叫法不同,具体职责也有所不同,但其实总的来讲还是有一些 ...
  14. --成功的网络事件营销

    还记得汶川大地震刚刚发生不久,一大把的编辑问笔者要不要写一篇文章,关于灾难营销的,笔者拒绝了.然后写了如下的文章评论: 所谓"灾难营销"还是不要这么去叫的好,一个企业的企业责任心与社会责任感并不仅仅应 ...
  15. 如何对付网络爬虫 - JavaEye和网络爬虫斗争之路

    由于搜索引擎的泛滥,网络爬虫如今已经成为全球互联网的一大公害.除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,搜狐,腾讯,网易.再加上十分流氓的社区搜索奇虎等等,国内大大 ...
  16. 黑客攻防技术宝典--Web实战篇

    Web应用程序安全的关键问题因素: 1. 不成熟的安全意识 2. 独立开发 3. 欺骗性的简化 4. 迅速发展的威胁形式 5. 资源与时间限制 6. 技术上强其所难 Web应用程序使用三层相关联的安全机制处理用户访问: ...
  17. 机器人如何懂得人类感情

    今天在一席上听了任教授的演讲后,很受启发,思路也陡然变得清晰很多.任教授的演讲真是非常浓缩,所有的东西都是点到为止.需要我们自己记录下来消化! 机器人懂得人类情感大致可分为如下三步: 1. 识别: 识别包括识别人类的表情 ...
  18. 诚信成网络婚恋最大问题 实名制华而不实

    晚报记者 龚星 现场图片 晚报记者 陈珍妮 报道 伴随着电视婚恋节目的火爆,婚恋交友网站迎来井喷式发展,但单身男女也饱受网络征婚缺乏真实性.可靠性的困扰.国内三大婚恋交友网站之一的百合网,成为首个试水强制实名的婚恋网站, ...
  19. 基于Python实现的百度贴吧网络爬虫实例

    这篇文章主要介绍了基于Python实现的百度贴吧网络爬虫,实例分析了Python实现网络爬虫的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了基于Python实现的百度贴吧网络爬虫.分享给大家供大家参考. ...