java抓取数据+破解屏蔽ip访问【多线程数据采集之三】

java抓取数据+破解屏蔽ip访问

今天就讲解一下,怎么破解 服务器 屏蔽ip的请求。

现在大多网站采取 ip访问次数达到一定次数就屏蔽ip的功能。

那么要破解服务器的屏蔽。 就只有改变ip, 或者代理ip。

如果用代理,哪里去找那么多ip呢。 用adsl 获取动态ip不是很简单吗。

转载注明出处:http://blog.csdn.net/column/details/threadgrab.html


那么现在就贴上adsl获取动态ip的方案实例源码


1、抓取网页数据的时候 catch异常之后 , 就采取拨号程序

//门票浏览  url参数 http://www.lvmama.com/dest/lantiancheng
	public static DataBean getWebData1(String url){
		DataBean data = null;
		try {
			Document docdata = Jsoup.connect(url).timeout(20000).get();
			
		} catch (Exception e) {
			e.printStackTrace();
                        //拨号一下
                        ConnectAdslNet.reconnectAdsl("宽带",Main.adslname,Main.adslpass);
		}
		return data;
	}

七七八八网http://www.qi788.com

2、拨号获取动态ip的 工具类

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

/**
 * 
 * ADSL拨号上网
 * Windwos操作系统需要是GBK编码
 * @author yijianfeng
 * 
 */

public class ConnectAdslNet {
	static Logger logger = Logger.getLogger(ConnectAdslNet.class);
	
	 /** 
     * 执行CMD命令,并返回String字符串 
     */  
    public static String executeCmd(String strCmd) throws Exception {  
        Process p = Runtime.getRuntime().exec("cmd /c " + strCmd);  
        StringBuilder sbCmd = new StringBuilder();  
        
        //注意编码 GBK
        BufferedReader br = new BufferedReader(new InputStreamReader(p  
                .getInputStream(),"GBK"));  
        String line;  
        while ((line = br.readLine()) != null) {  
            sbCmd.append(line + "\n");  
        }  
        return sbCmd.toString();  
    }  
  
    /** 
     * 连接ADSL 
     */  
    public static boolean connectAdsl(String adslTitle, String adslName, String adslPass) throws Exception {  
        System.out.println("正在建立连接.");  
        String adslCmd = "rasdial " + adslTitle + " " + adslName + " "  
                + adslPass;  
        String tempCmd = executeCmd(adslCmd);  
        
        // 判断是否连接成功  
        if (tempCmd.indexOf("已连接") > 0) {  
            System.out.println("已成功建立连接.");  
            return true;  
        } else {  
            System.out.println(tempCmd);  
            System.out.println("建立连接失败");  
            return false;  
        }  
    }  
  
    /** 
     * 断开ADSL 
     */  
    public static boolean disconnectAdsl(String adslTitle) throws Exception {  
        String disconnectAdsl = "rasdial " + adslTitle + " /disconnect";  
        String result = executeCmd(disconnectAdsl);       
         
        if (result.indexOf("没有连接")!=-1){  
            System.out.println(adslTitle + "连接不存在!");  
            return false;  
        } else {  
            System.out.println("连接已断开");  
            return true;  
        }  
    }  
    
    /**
     * adsl重新拨号,支持失败不断重拨
     * @param args
     * @throws Exception
     */
    public static boolean reconnectAdsl(String adslTitle, String adslName, String adslPass){
    	boolean bAdsl = false;
    	try {
			disconnectAdsl(adslTitle); 
			Thread.sleep(3000);    		
    		bAdsl = connectAdsl(adslTitle,adslName,adslPass);
			Thread.sleep(3000);
    		int i = 0;
    		while (!bAdsl){
				disconnectAdsl(adslTitle); 
				Thread.sleep(3000);
				bAdsl = connectAdsl(adslTitle,adslName,adslPass);
				Thread.sleep(3000);
				if(i>5){
					break;
				}
    		}
    	}catch(Exception e){
    		logger.error("ADSL拨号异常:", e);
    	}
    	
    	return bAdsl;     	
    }
     
    public static void main(String[] args) throws Exception {
//        reconnectAdsl("宽带","adsl账号","密码");  
    }  	
	
}


采用上述办法,基本上就可以解决拨号的问题了。


如果程序加入了多线程。 那么就必须考虑多线程,拨号同步,以及数据同步问题。 提高效率和避免重复操作。


到此,破解屏蔽ip访问就搞定了!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值