http://passover.blog.51cto.com/2431658/502232

转载自:点击打开链接

     所有写搜索的朋友估计都有过和我一样的烦恼,那就是如果不断的对某一个网站进行爬行,很容易被封IP。最笨的版本就是减少爬行频率,但是在很多场景下对爬行效率是有要求的,那么最直接的办法就是不断切换实际访问的IP,来达到访问流量分散的效果。当然也有很多朋友在用一个比较贱的办法,就是用ADSL拨号方式爬行,一旦被封掉就重新拨号换个IP,这个也算一个非常取巧的手段了。

    本文重点介绍代理IP自动切换的方式,其实这个如果只是要实现,那是再简单不过了。一个爬虫在启动的时候读取一批代理IP,访问网页的时候不断轮换,这样就是一个最简单的实现。但是这样有一个比较大的问题,就是你每写一个爬虫就要实现这样的模块,多个爬虫之前还不能共享代理IP资源。

    这里我想到利用一个本地代理来实现这个效果,那么爬虫只要连接到这一个代理,他在帮忙访问最终页面的时候再使用一个代理池不断轮换。这个方案既解决了代码重复的问题,又解决了多个爬虫都要维护代理IP列表的麻烦,而且部署起来也非常简单。

    经过本方案改造前后的部署示意图:


 我这里用Jetty7的proxy server做了一个简单的例子,实现了本地代理的功能,代码非常简单,贴出来大家一起学习下吧。

 

    public class WiseProxyServlet extends ProxyServlet { 
         
         public void service(ServletRequest req, ServletResponse res)  
            throws ServletException, IOException { 
             _client.setProxy(getProperAddress()); 
             super.service(req, res); 
         } 
     
         /** 
          * 这应该是在一个代理池中按照一定的规则来不断切换代理 
          */ 
        private Address getProperAddress() { 
            return new Address("222.169.11.102", 8080); 
        } 
          
    }  



    public class WiseProxyServer {       
           
        public static void main(String[] args) throws Exception {       
            Server server = new Server();       
            SelectChannelConnector connector = new SelectChannelConnector();       
            connector.setPort(8888);       
            server.addConnector(connector);       
                   
            HandlerCollection handlers = new HandlerCollection();       
            server.setHandler(handlers);       
           
            // Setup proxy servlet       
            ServletContextHandler context = new ServletContextHandler(handlers, "/", ServletContextHandler.SESSIONS);       
            ServletHolder proxyServlet = new ServletHolder(WiseProxyServlet.class);       
            context.addServlet(proxyServlet, "/*");       
           
            // Setup proxy handler to handle CONNECT methods       
            ConnectHandler proxy = new ConnectHandler();       
            handlers.addHandler(proxy);       
           
            server.start();       
        }       
           
    }  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值